k8s.io/kubernetes@v1.31.0-alpha.0.0.20240520171757-56147500dadc/cmd/kubeadm/app/phases/upgrade/versiongetter_test.go (about) 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 }