...

Source file src/k8s.io/kubernetes/cmd/kubeadm/app/phases/upgrade/versiongetter_test.go

Documentation: k8s.io/kubernetes/cmd/kubeadm/app/phases/upgrade

     1  /*
     2  Copyright 2023 The Kubernetes Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package upgrade
    18  
    19  import (
    20  	"reflect"
    21  	"testing"
    22  
    23  	v1 "k8s.io/api/core/v1"
    24  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    25  	"k8s.io/apimachinery/pkg/runtime/schema"
    26  	"k8s.io/apimachinery/pkg/version"
    27  	fakediscovery "k8s.io/client-go/discovery/fake"
    28  	clientsetfake "k8s.io/client-go/kubernetes/fake"
    29  )
    30  
    31  func TestKubeVersionGetterClusterVersion(t *testing.T) {
    32  	tests := []struct {
    33  		name               string
    34  		version            *version.Info
    35  		wantClusterVersion string
    36  		wantParsedVersion  string
    37  		wantErr            bool
    38  	}{
    39  		{
    40  			name: "cluster version is valid",
    41  			version: &version.Info{
    42  				GitVersion: "1.20.0",
    43  			},
    44  			wantClusterVersion: "1.20.0",
    45  			wantParsedVersion:  "1.20.0",
    46  			wantErr:            false,
    47  		},
    48  		{
    49  			name:               "cluster version is empty",
    50  			version:            &version.Info{},
    51  			wantClusterVersion: "",
    52  			wantParsedVersion:  "",
    53  			wantErr:            true,
    54  		},
    55  		{
    56  			name: "cluster version is invalid",
    57  			version: &version.Info{
    58  				GitVersion: "invalid-version",
    59  			},
    60  			wantClusterVersion: "",
    61  			wantParsedVersion:  "",
    62  			wantErr:            true,
    63  		},
    64  	}
    65  	for _, tt := range tests {
    66  		t.Run(tt.name, func(t *testing.T) {
    67  			client := clientsetfake.NewSimpleClientset()
    68  			client.Discovery().(*fakediscovery.FakeDiscovery).FakedServerVersion = tt.version
    69  
    70  			g := &KubeVersionGetter{
    71  				client: client,
    72  			}
    73  			clusterVersion, parsedVersion, err := g.ClusterVersion()
    74  
    75  			if (err != nil) != tt.wantErr {
    76  				t.Errorf("error = %v, wantErr = %v", err, tt.wantErr)
    77  				return
    78  			}
    79  			if clusterVersion != tt.wantClusterVersion {
    80  				t.Errorf("clusterVersion = %v, wantClusterVersion = %v", clusterVersion, tt.wantClusterVersion)
    81  			}
    82  			if tt.wantParsedVersion == "" {
    83  				if parsedVersion != nil {
    84  					t.Errorf("parsedVersion = %v, wantParsedVersion = %v", parsedVersion, tt.wantParsedVersion)
    85  				}
    86  			} else if parsedVersion.String() != tt.wantParsedVersion {
    87  				t.Errorf("parsedVersion = %v, wantParsedVersion = %v", parsedVersion, tt.wantParsedVersion)
    88  			}
    89  		})
    90  	}
    91  }
    92  
    93  func TestKubeVersionGetterVersionFromCILabel(t *testing.T) {
    94  	tests := []struct {
    95  		name              string
    96  		ciVersionLabel    string
    97  		wantCIVersion     string
    98  		wantParsedVersion string
    99  		wantErr           bool
   100  	}{
   101  		{
   102  			name:              "version is valid",
   103  			ciVersionLabel:    "v1.28.1",
   104  			wantCIVersion:     "v1.28.1",
   105  			wantParsedVersion: "1.28.1",
   106  			wantErr:           false,
   107  		},
   108  		{
   109  			name:              "version is invalid",
   110  			ciVersionLabel:    "invalid-version",
   111  			wantCIVersion:     "",
   112  			wantParsedVersion: "",
   113  			wantErr:           true,
   114  		},
   115  		{
   116  			name:              "version is empty",
   117  			ciVersionLabel:    "",
   118  			wantCIVersion:     "",
   119  			wantParsedVersion: "",
   120  			wantErr:           true,
   121  		},
   122  	}
   123  	for _, tt := range tests {
   124  		t.Run(tt.name, func(t *testing.T) {
   125  			g := &KubeVersionGetter{
   126  				client: clientsetfake.NewSimpleClientset(),
   127  			}
   128  			cliVersion, parsedVersion, err := g.VersionFromCILabel(tt.ciVersionLabel, "test VersionFromCILabel")
   129  			if (err != nil) != tt.wantErr {
   130  				t.Errorf("error = %v, wantErr = %v", err, tt.wantErr)
   131  				return
   132  			}
   133  			if cliVersion != tt.wantCIVersion {
   134  				t.Errorf("cliVersion = %v, wantCIVersion = %v", cliVersion, tt.wantCIVersion)
   135  			}
   136  			if tt.wantParsedVersion == "" {
   137  				if parsedVersion != nil {
   138  					t.Errorf("parsedVersion = %v, wantParsedVersion = %v", parsedVersion, tt.wantParsedVersion)
   139  				}
   140  			} else if parsedVersion.String() != tt.wantParsedVersion {
   141  				t.Errorf("parsedVersion = %v, wantParsedVersion = %v", parsedVersion, tt.wantParsedVersion)
   142  			}
   143  		})
   144  	}
   145  }
   146  
   147  func TestKubeVersionGetterKubeletVersions(t *testing.T) {
   148  	tests := []struct {
   149  		name    string
   150  		nodes   *v1.NodeList
   151  		want    map[string][]string
   152  		wantErr bool
   153  	}{
   154  		{
   155  			name: "kubelet version info exists",
   156  			nodes: &v1.NodeList{
   157  				Items: []v1.Node{
   158  					{
   159  						ObjectMeta: metav1.ObjectMeta{Name: "node1"},
   160  						Status: v1.NodeStatus{
   161  							NodeInfo: v1.NodeSystemInfo{
   162  								KubeletVersion: "v1.28.0",
   163  							},
   164  						},
   165  					},
   166  					{
   167  						ObjectMeta: metav1.ObjectMeta{Name: "node2"},
   168  						Status: v1.NodeStatus{
   169  							NodeInfo: v1.NodeSystemInfo{
   170  								KubeletVersion: "v1.28.1",
   171  							},
   172  						},
   173  					},
   174  					{
   175  						ObjectMeta: metav1.ObjectMeta{Name: "node3"},
   176  						Status: v1.NodeStatus{
   177  							NodeInfo: v1.NodeSystemInfo{
   178  								KubeletVersion: "v1.28.1",
   179  							},
   180  						},
   181  					},
   182  				},
   183  			},
   184  			want: map[string][]string{
   185  				"v1.28.0": {"node1"},
   186  				"v1.28.1": {"node2", "node3"},
   187  			},
   188  			wantErr: false,
   189  		},
   190  		{
   191  			name: "kubelet version info is empty",
   192  			nodes: &v1.NodeList{
   193  				Items: []v1.Node{
   194  					{
   195  						ObjectMeta: metav1.ObjectMeta{Name: "node2"},
   196  						Status:     v1.NodeStatus{},
   197  					},
   198  					{
   199  						ObjectMeta: metav1.ObjectMeta{Name: "node3"},
   200  						Status:     v1.NodeStatus{},
   201  					},
   202  				},
   203  			},
   204  			want: map[string][]string{
   205  				"": {"node2", "node3"},
   206  			},
   207  			wantErr: false,
   208  		},
   209  		{
   210  			name:    "node list is empty",
   211  			nodes:   &v1.NodeList{},
   212  			want:    map[string][]string{},
   213  			wantErr: false,
   214  		},
   215  	}
   216  	for _, tt := range tests {
   217  		client := clientsetfake.NewSimpleClientset()
   218  		t.Run(tt.name, func(t *testing.T) {
   219  			for _, node := range tt.nodes.Items {
   220  				err := client.Tracker().Create(schema.GroupVersionResource{Version: "v1", Resource: "nodes"}, &node, "")
   221  				if err != nil {
   222  					t.Fatal(err)
   223  				}
   224  			}
   225  			g := &KubeVersionGetter{
   226  				client: client,
   227  			}
   228  			got, err := g.KubeletVersions()
   229  			if (err != nil) != tt.wantErr {
   230  				t.Errorf("error = %v, wantErr = %v", err, tt.wantErr)
   231  				return
   232  			}
   233  			if !reflect.DeepEqual(got, tt.want) {
   234  				t.Errorf("got = %v, want = %v", got, tt.want)
   235  			}
   236  		})
   237  	}
   238  }
   239  

View as plain text