github.com/abayer/test-infra@v0.0.5/kubetest/anywhere_test.go (about) 1 /* 2 Copyright 2017 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 main 18 19 import ( 20 "io/ioutil" 21 "os" 22 "strings" 23 "testing" 24 ) 25 26 func TestNewKubernetesAnywhere(t *testing.T) { 27 cases := []struct { 28 name string 29 phase2 string 30 kubeadmVersion string 31 kubeadmUpgrade string 32 kubeletCIVersion string 33 kubeletVersion string 34 kubernetesVersion string 35 cni string 36 expectConfigLines []string 37 kubeproxyMode string 38 osImage string 39 KubeadmFeatureGates string 40 }{ 41 { 42 name: "kubeadm defaults", 43 phase2: "kubeadm", 44 cni: "weave", 45 expectConfigLines: []string{ 46 ".phase2.provider=\"kubeadm\"", 47 ".phase2.kubeadm.version=\"\"", 48 ".phase2.kubeadm.master_upgrade.method=\"\"", 49 ".phase2.kubernetes_version=\"\"", 50 ".phase2.kubelet_version=\"\"", 51 ".phase3.cni=\"weave\"", 52 }, 53 }, 54 { 55 name: "ignition defaults", 56 phase2: "ignition", 57 expectConfigLines: []string{ 58 ".phase2.provider=\"ignition\"", 59 ".phase2.kubernetes_version=\"\"", 60 }, 61 }, 62 { 63 name: "flannel on kubeadm", 64 phase2: "kubeadm", 65 cni: "flannel", 66 expectConfigLines: []string{ 67 ".phase2.provider=\"kubeadm\"", 68 ".phase3.cni=\"flannel\"", 69 }, 70 }, 71 { 72 name: "kubeadm with specific versions", 73 phase2: "kubeadm", 74 kubeadmVersion: "unstable", 75 kubeadmUpgrade: "init", 76 kubeletVersion: "foo", 77 kubernetesVersion: "latest-1.6", 78 expectConfigLines: []string{ 79 ".phase2.provider=\"kubeadm\"", 80 ".phase2.kubeadm.version=\"unstable\"", 81 ".phase2.kubeadm.master_upgrade.method=\"init\"", 82 ".phase2.kubernetes_version=\"latest-1.6\"", 83 ".phase2.kubelet_version=\"foo\"", 84 ".phase3.cni=\"weave\"", 85 }, 86 }, 87 { 88 name: "kubeadm with ci kubelet version", 89 phase2: "kubeadm", 90 kubeadmVersion: "unstable", 91 kubeletCIVersion: "latest-bazel", 92 kubernetesVersion: "latest-bazel", 93 expectConfigLines: []string{ 94 ".phase2.provider=\"kubeadm\"", 95 ".phase2.kubeadm.version=\"unstable\"", 96 ".phase2.kubernetes_version=\"latest-bazel\"", 97 ".phase2.kubelet_version=\"gs://kubernetes-release-dev/ci/v1.11.0-alpha.0.1031+d37460147ec956-bazel/bin/linux/amd64/\"", 98 ".phase3.cni=\"weave\"", 99 }, 100 }, 101 { 102 name: "kubeadm with 1.9 ci kubelet version", 103 phase2: "kubeadm", 104 kubeadmVersion: "unstable", 105 kubeletCIVersion: "latest-bazel-1.9", 106 kubernetesVersion: "latest-bazel-1.9", 107 expectConfigLines: []string{ 108 ".phase2.provider=\"kubeadm\"", 109 ".phase2.kubeadm.version=\"unstable\"", 110 ".phase2.kubernetes_version=\"latest-bazel-1.9\"", 111 ".phase2.kubelet_version=\"gs://kubernetes-release-dev/ci/v1.9.4-beta.0.53+326c7c181909a8-bazel/bin/linux/amd64/\"", 112 ".phase3.cni=\"weave\"", 113 }, 114 }, 115 { 116 name: "kubeadm with kube-proxy in ipvs mode", 117 phase2: "kubeadm", 118 kubeproxyMode: "ipvs", 119 120 expectConfigLines: []string{ 121 ".phase2.provider=\"kubeadm\"", 122 ".phase2.kubeadm.version=\"\"", 123 ".phase2.kubeadm.master_upgrade.method=\"\"", 124 ".phase2.kubernetes_version=\"\"", 125 ".phase2.kubelet_version=\"\"", 126 ".phase2.proxy_mode=\"ipvs\"", 127 ".phase3.cni=\"weave\"", 128 }, 129 }, 130 { 131 name: "kubeadm with default os_image", 132 phase2: "kubeadm", 133 134 expectConfigLines: []string{ 135 ".phase1.gce.os_image=\"ubuntu-1604-xenial-v20171212\"", 136 ".phase2.provider=\"kubeadm\"", 137 }, 138 }, 139 { 140 name: "kubeadm with specific os_image", 141 phase2: "kubeadm", 142 osImage: "my-awesome-os-image", 143 144 expectConfigLines: []string{ 145 ".phase1.gce.os_image=\"my-awesome-os-image\"", 146 ".phase2.provider=\"kubeadm\"", 147 }, 148 }, 149 { 150 name: "kubeadm with SelfHosting feature enabled", 151 phase2: "kubeadm", 152 KubeadmFeatureGates: "SelfHosting=true", 153 154 expectConfigLines: []string{ 155 ".phase2.provider=\"kubeadm\"", 156 ".phase2.kubeadm.version=\"\"", 157 ".phase2.kubeadm.master_upgrade.method=\"\"", 158 ".phase2.kubernetes_version=\"\"", 159 ".phase2.kubelet_version=\"\"", 160 ".phase2.kubeadm.feature_gates=\"SelfHosting=true\"", 161 ".phase3.cni=\"weave\"", 162 }, 163 }, 164 } 165 166 mockGSFiles := map[string]string{ 167 "gs://kubernetes-release-dev/ci/latest-bazel.txt": "v1.11.0-alpha.0.1031+d37460147ec956-bazel", 168 "gs://kubernetes-release-dev/ci/latest-bazel-1.9.txt": "v1.9.4-beta.0.53+326c7c181909a8-bazel", 169 } 170 171 originalReadGSFile := readGSFile 172 defer func() { readGSFile = originalReadGSFile }() 173 174 readGSFile = func(location string) (string, error) { 175 if val, ok := mockGSFiles[location]; ok { 176 return val, nil 177 } 178 return "vbar", nil 179 } 180 181 for _, tc := range cases { 182 tmpdir, err := ioutil.TempDir("", "kubernetes-anywhere-test") 183 if err != nil { 184 t.Errorf("couldn't create tempdir: %v", err) 185 continue 186 } 187 188 defer os.Remove(tmpdir) 189 190 *kubernetesAnywherePath = tmpdir 191 *kubernetesAnywhereCluster = "test-cluster" 192 *kubernetesAnywherePhase2Provider = tc.phase2 193 *kubernetesAnywhereKubeadmVersion = tc.kubeadmVersion 194 *kubernetesAnywhereKubernetesVersion = tc.kubernetesVersion 195 *kubernetesAnywhereKubeletVersion = tc.kubeletVersion 196 *kubernetesAnywhereKubeletCIVersion = tc.kubeletCIVersion 197 *kubernetesAnywhereUpgradeMethod = tc.kubeadmUpgrade 198 *kubernetesAnywhereCNI = tc.cni 199 *kubernetesAnywhereProxyMode = tc.kubeproxyMode 200 if tc.osImage != "" { 201 *kubernetesAnywhereOSImage = tc.osImage 202 } 203 *kubernetesAnywhereKubeadmFeatureGates = tc.KubeadmFeatureGates 204 205 _, err = newKubernetesAnywhere("fake-project", "fake-zone") 206 if err != nil { 207 t.Errorf("newKubernetesAnywhere(%s) failed: %v", tc.name, err) 208 continue 209 } 210 211 config, err := ioutil.ReadFile(tmpdir + "/.config") 212 if err != nil { 213 t.Errorf("newKubernetesAnywhere(%s) failed to create readable config file: %v", tc.name, err) 214 continue 215 } 216 217 configLines := strings.Split(string(config), "\n") 218 219 if !containsLine(configLines, ".phase1.cloud_provider=\"gce\"") { 220 t.Errorf("newKubernetesAnywhere(%s) config got %q, wanted line: .cloud_provider=\"gce\"", tc.name, config) 221 } 222 223 for _, line := range tc.expectConfigLines { 224 if !containsLine(configLines, line) { 225 t.Errorf("newKubernetesAnywhere(%s) config got %q, wanted line: %v", tc.name, config, line) 226 } 227 } 228 } 229 } 230 231 func containsLine(haystack []string, needle string) bool { 232 for _, line := range haystack { 233 if line == needle { 234 return true 235 } 236 } 237 return false 238 } 239 240 func TestNewKubernetesAnywhereMultiCluster(t *testing.T) { 241 tests := map[string]struct { 242 mcFlag string 243 expectError bool 244 }{ 245 "ZeroCluster": { 246 mcFlag: "", 247 expectError: true, 248 }, 249 "SingleCluster": { 250 mcFlag: "c1", 251 expectError: false, 252 }, 253 "MultiClusters": { 254 mcFlag: "c1,c2,c3", 255 expectError: false, 256 }, 257 "MultiClustersWithZonesSpecifiedForAll": { 258 mcFlag: "z1:c1,z2:c2,z3:c3", 259 expectError: false, 260 }, 261 "MultiClustersWithZonesSpecifiedForSome": { 262 mcFlag: "c1,z2:c2,c3", 263 expectError: false, 264 }, 265 } 266 267 originalReadGSFile := readGSFile 268 defer func() { readGSFile = originalReadGSFile }() 269 readGSFile = func(string) (string, error) { 270 return "vbar", nil 271 } 272 273 for testName, test := range tests { 274 t.Run(testName, func(t *testing.T) { 275 tmpdir, err := ioutil.TempDir("", "kubernetes-anywhere-multi-cluster-test") 276 if err != nil { 277 t.Errorf("couldn't create tempdir: %v", err) 278 } 279 defer os.Remove(tmpdir) 280 281 *kubernetesAnywherePath = tmpdir 282 *kubernetesAnywhereCluster = "test-cluster" 283 *kubernetesAnywherePhase2Provider = "kubeadm" 284 *kubernetesAnywhereKubeadmVersion = "stable" 285 *kubernetesAnywhereKubernetesVersion = "" 286 287 multiClusters := multiClusterDeployment{} 288 multiClusters.Set(test.mcFlag) 289 zone := "fake-zone-a" 290 291 _, err = newKubernetesAnywhereMultiCluster("fake-project", zone, multiClusters) 292 if test.expectError { 293 if err == nil { 294 t.Errorf("expected err but newKubernetesAnywhereMultiCluster(%s) succeeded.", testName) 295 } 296 } else { 297 if err != nil { 298 t.Errorf("newKubernetesAnywhereMultiCluster(%s) failed: %v", testName, err) 299 } 300 } 301 302 for _, cluster := range multiClusters.clusters { 303 config, err := ioutil.ReadFile(tmpdir + "/.config-" + cluster) 304 if err != nil { 305 t.Errorf("newKubernetesAnywhereMultiCluster(%s) failed to create readable config file: %v", testName, err) 306 } 307 308 specificZone, specified := multiClusters.zones[cluster] 309 if specified { 310 zone = specificZone 311 } 312 kubeContext := "federation-e2e-gce-" + zone 313 expectConfigLines := []string{ 314 ".phase1.cloud_provider=\"gce\"", 315 ".phase2.provider=\"kubeadm\"", 316 ".phase2.kubeadm.version=\"stable\"", 317 ".phase2.kubernetes_version=\"\"", 318 ".phase3.cni=\"weave\"", 319 ".phase1.cluster_name=\"" + cluster + "\"", 320 ".phase1.gce.zone=\"" + zone + "\"", 321 ".phase2.kube_context_name=\"" + kubeContext + "\"", 322 } 323 324 configLines := strings.Split(string(config), "\n") 325 326 for _, line := range expectConfigLines { 327 if !containsLine(configLines, line) { 328 t.Errorf("newKubernetesAnywhereMultiCluster(%s) config got %q, wanted line: %v", testName, config, line) 329 } 330 } 331 } 332 }) 333 } 334 }