istio.io/istio@v0.0.0-20240520182934-d79c90f27776/istioctl/pkg/install/k8sversion/version_test.go (about) 1 // Copyright Istio Authors. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package k8sversion 16 17 import ( 18 "bytes" 19 "fmt" 20 "strings" 21 "testing" 22 23 "k8s.io/apimachinery/pkg/version" 24 fakediscovery "k8s.io/client-go/discovery/fake" 25 26 "istio.io/istio/operator/pkg/util/clog" 27 "istio.io/istio/pkg/kube" 28 pkgVersion "istio.io/istio/pkg/version" 29 ) 30 31 var ( 32 version1_17 = &version.Info{ 33 Major: "1", 34 Minor: "17", 35 GitVersion: "1.17", 36 } 37 version1_8 = &version.Info{ 38 Major: "1", 39 Minor: "8", 40 GitVersion: "v1.8", 41 } 42 version1_18 = &version.Info{ 43 Major: "1", 44 Minor: "18", 45 GitVersion: "v1.18.5", 46 } 47 version1_19 = &version.Info{ 48 Major: "1", 49 Minor: "19", 50 GitVersion: "v1.19.4", 51 } 52 version1_20 = &version.Info{ 53 Major: "1", 54 Minor: "20", 55 GitVersion: "v1.20.2", 56 } 57 version1_22 = &version.Info{ 58 Major: "1", 59 Minor: "22", 60 GitVersion: "v1.22", 61 } 62 version1_23 = &version.Info{ 63 Major: "1", 64 Minor: "23", 65 GitVersion: "v1.23", 66 } 67 version1_24 = &version.Info{ 68 Major: "1", 69 Minor: "24", 70 GitVersion: "v1.24", 71 } 72 version1_25 = &version.Info{ 73 Major: "1", 74 Minor: "25", 75 GitVersion: "v1.25", 76 } 77 version1_26 = &version.Info{ 78 Major: "1", 79 Minor: "26", 80 GitVersion: "v1.26", 81 } 82 version1_19RC = &version.Info{ 83 Major: "1", 84 Minor: "19", 85 GitVersion: "v1.19.5-rc.0", 86 } 87 version1_17GKE = &version.Info{ 88 Major: "1", 89 Minor: "17+", 90 GitVersion: "v1.17.7-gke.10", 91 } 92 version1_8GKE = &version.Info{ 93 Major: "1", 94 Minor: "8", 95 GitVersion: "v1.8.7-gke.8", 96 } 97 versionInvalid1 = &version.Info{ 98 Major: "1", 99 Minor: "7", 100 GitVersion: "v1.invalid.7", 101 } 102 versionInvalid2 = &version.Info{ 103 Major: "one", 104 Minor: "seven", 105 GitVersion: "one.seven", 106 } 107 ) 108 109 func TestExtractKubernetesVersion(t *testing.T) { 110 cases := []struct { 111 version *version.Info 112 expected int 113 errMsg error 114 isValid bool 115 }{ 116 { 117 version: version1_17, 118 expected: 17, 119 errMsg: nil, 120 isValid: true, 121 }, 122 { 123 version: version1_8, 124 expected: 8, 125 errMsg: nil, 126 isValid: true, 127 }, 128 { 129 version: version1_18, 130 expected: 18, 131 errMsg: nil, 132 isValid: true, 133 }, 134 { 135 version: version1_19, 136 expected: 19, 137 errMsg: nil, 138 isValid: true, 139 }, 140 { 141 version: version1_20, 142 expected: 20, 143 errMsg: nil, 144 isValid: true, 145 }, 146 { 147 version: version1_22, 148 expected: 22, 149 errMsg: nil, 150 isValid: true, 151 }, 152 { 153 version: version1_19RC, 154 expected: 19, 155 errMsg: nil, 156 isValid: true, 157 }, 158 { 159 version: version1_17GKE, 160 expected: 17, 161 errMsg: nil, 162 isValid: true, 163 }, 164 { 165 version: version1_8GKE, 166 expected: 8, 167 errMsg: nil, 168 isValid: true, 169 }, 170 { 171 version: versionInvalid1, 172 errMsg: fmt.Errorf("could not parse Malformed version: %v", versionInvalid1.GitVersion), 173 isValid: false, 174 }, 175 { 176 version: versionInvalid2, 177 errMsg: fmt.Errorf("could not parse Malformed version: %v", versionInvalid2.GitVersion), 178 isValid: false, 179 }, 180 } 181 for i, c := range cases { 182 t.Run(fmt.Sprintf("case %d %s", i, c.version), func(t *testing.T) { 183 got, err := extractKubernetesVersion(c.version) 184 if c.errMsg != err && c.isValid { 185 t.Fatalf("\nwanted: %v \nbut found: %v", c.errMsg, err) 186 } 187 if got != c.expected { 188 t.Fatalf("wanted %v got %v", c.expected, got) 189 } 190 }) 191 } 192 } 193 194 func TestIsK8VersionSupported(t *testing.T) { 195 cases := []struct { 196 version *version.Info 197 logMsg string 198 isValid bool 199 }{ 200 { 201 version: version1_18, 202 logMsg: fmt.Sprintf(UnSupportedK8SVersionLogMsg, version1_18.GitVersion, pkgVersion.Info.Version, MinK8SVersion), 203 isValid: false, 204 }, 205 { 206 version: version1_8, 207 logMsg: fmt.Sprintf(UnSupportedK8SVersionLogMsg, version1_8.GitVersion, pkgVersion.Info.Version, MinK8SVersion), 208 isValid: false, 209 }, 210 { 211 version: version1_17GKE, 212 logMsg: fmt.Sprintf(UnSupportedK8SVersionLogMsg, version1_17GKE.GitVersion, pkgVersion.Info.Version, MinK8SVersion), 213 isValid: false, 214 }, 215 { 216 version: versionInvalid1, 217 logMsg: fmt.Sprintf(UnSupportedK8SVersionLogMsg, versionInvalid1.GitVersion, pkgVersion.Info.Version, MinK8SVersion), 218 isValid: false, 219 }, 220 { 221 version: version1_20, 222 logMsg: fmt.Sprintf(UnSupportedK8SVersionLogMsg, version1_20.GitVersion, pkgVersion.Info.Version, MinK8SVersion), 223 isValid: false, 224 }, 225 { 226 version: version1_22, 227 logMsg: fmt.Sprintf(UnSupportedK8SVersionLogMsg, version1_22.GitVersion, pkgVersion.Info.Version, MinK8SVersion), 228 isValid: false, 229 }, 230 { 231 version: version1_23, 232 logMsg: fmt.Sprintf(UnSupportedK8SVersionLogMsg, version1_23.GitVersion, pkgVersion.Info.Version, MinK8SVersion), 233 isValid: false, 234 }, 235 { 236 version: version1_24, 237 logMsg: fmt.Sprintf(UnSupportedK8SVersionLogMsg, version1_24.GitVersion, pkgVersion.Info.Version, MinK8SVersion), 238 isValid: false, 239 }, 240 { 241 version: version1_25, 242 logMsg: fmt.Sprintf(UnSupportedK8SVersionLogMsg, version1_25.GitVersion, pkgVersion.Info.Version, MinK8SVersion), 243 isValid: false, 244 }, 245 { 246 version: version1_26, 247 isValid: true, 248 }, 249 } 250 251 var outBuf bytes.Buffer 252 var errBuf bytes.Buffer 253 254 for i, c := range cases { 255 t.Run(fmt.Sprintf("case %d %s", i, c.version), func(t *testing.T) { 256 k8sClient := kube.NewFakeClient() 257 k8sClient.Kube().Discovery().(*fakediscovery.FakeDiscovery).FakedServerVersion = c.version 258 259 logger := clog.NewConsoleLogger(&outBuf, &errBuf, nil) 260 IsK8VersionSupported(k8sClient, logger) 261 262 errMsgTrim := strings.TrimSpace(c.logMsg) 263 outBufTrim := strings.TrimSpace(outBuf.String()) 264 265 if !c.isValid && strings.Compare(errMsgTrim, outBufTrim) != 0 { 266 t.Fatalf("\nwanted: %v \nbut found: %v", errMsgTrim, outBufTrim) 267 } 268 269 if c.isValid && outBuf.Len() > 0 { 270 t.Fatalf("\nwanted: %v \nbut found: %v", errMsgTrim, outBufTrim) 271 } 272 outBuf.Reset() 273 }) 274 } 275 }