github.com/jenkins-x/test-infra@v0.0.7/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  }