From 19ca81cd369951da35b1f629e99dd912e0e879df Mon Sep 17 00:00:00 2001 From: Maisem Ali Date: Tue, 13 Sep 2016 11:09:04 -0700 Subject: [PATCH] Adding support for upgrading testing across image types. --- hack/verify-flags/known-flags.txt | 1 + test/e2e/cluster_upgrade.go | 8 ++++---- test/e2e/framework/nodes_util.go | 19 +++++++++++++------ test/e2e/framework/test_context.go | 2 ++ 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/hack/verify-flags/known-flags.txt b/hack/verify-flags/known-flags.txt index 67efd377ca..54d8cdfa9a 100644 --- a/hack/verify-flags/known-flags.txt +++ b/hack/verify-flags/known-flags.txt @@ -512,6 +512,7 @@ udp-timeout unhealthy-zone-threshold unix-socket update-period +upgrade-image upgrade-target use-kubernetes-cluster-service user-whitelist diff --git a/test/e2e/cluster_upgrade.go b/test/e2e/cluster_upgrade.go index 7863afdd2e..40b3f36960 100644 --- a/test/e2e/cluster_upgrade.go +++ b/test/e2e/cluster_upgrade.go @@ -58,7 +58,7 @@ var _ = framework.KubeDescribe("Upgrade [Feature:Upgrade]", func() { cm := chaosmonkey.New(func() { v, err := realVersion(framework.TestContext.UpgradeTarget) framework.ExpectNoError(err) - framework.ExpectNoError(framework.NodeUpgrade(f, v)) + framework.ExpectNoError(framework.NodeUpgrade(f, v, framework.TestContext.UpgradeImage)) framework.ExpectNoError(checkNodesVersions(f.Client, v)) }) cm.Register(func(sem *chaosmonkey.Semaphore) { @@ -72,7 +72,7 @@ var _ = framework.KubeDescribe("Upgrade [Feature:Upgrade]", func() { cm := chaosmonkey.New(func() { v, err := realVersion(framework.TestContext.UpgradeTarget) framework.ExpectNoError(err) - framework.ExpectNoError(framework.NodeUpgrade(f, v)) + framework.ExpectNoError(framework.NodeUpgrade(f, v, framework.TestContext.UpgradeImage)) framework.ExpectNoError(checkNodesVersions(f.Client, v)) }) cm.Register(func(sem *chaosmonkey.Semaphore) { @@ -90,7 +90,7 @@ var _ = framework.KubeDescribe("Upgrade [Feature:Upgrade]", func() { framework.ExpectNoError(err) framework.ExpectNoError(framework.MasterUpgrade(v)) framework.ExpectNoError(checkMasterVersion(f.Client, v)) - framework.ExpectNoError(framework.NodeUpgrade(f, v)) + framework.ExpectNoError(framework.NodeUpgrade(f, v, framework.TestContext.UpgradeImage)) framework.ExpectNoError(checkNodesVersions(f.Client, v)) }) cm.Register(func(sem *chaosmonkey.Semaphore) { @@ -106,7 +106,7 @@ var _ = framework.KubeDescribe("Upgrade [Feature:Upgrade]", func() { framework.ExpectNoError(err) framework.ExpectNoError(framework.MasterUpgrade(v)) framework.ExpectNoError(checkMasterVersion(f.Client, v)) - framework.ExpectNoError(framework.NodeUpgrade(f, v)) + framework.ExpectNoError(framework.NodeUpgrade(f, v, framework.TestContext.UpgradeImage)) framework.ExpectNoError(checkNodesVersions(f.Client, v)) }) cm.Register(func(sem *chaosmonkey.Semaphore) { diff --git a/test/e2e/framework/nodes_util.go b/test/e2e/framework/nodes_util.go index a7184f8db0..8a1f13eb26 100644 --- a/test/e2e/framework/nodes_util.go +++ b/test/e2e/framework/nodes_util.go @@ -61,14 +61,15 @@ func masterUpgradeGKE(v string) error { return err } -var NodeUpgrade = func(f *Framework, v string) error { +var NodeUpgrade = func(f *Framework, v string, img string) error { // Perform the upgrade. var err error switch TestContext.Provider { case "gce": + // TODO(maisem): add GCE support for upgrading to different images. err = nodeUpgradeGCE(v) case "gke": - err = nodeUpgradeGKE(v) + err = nodeUpgradeGKE(v, img) default: err = fmt.Errorf("NodeUpgrade() is not implemented for provider %s", TestContext.Provider) } @@ -249,16 +250,22 @@ func cleanupNodeUpgradeGCE(tmplBefore string) { } } -func nodeUpgradeGKE(v string) error { - Logf("Upgrading nodes to %q", v) - _, _, err := RunCmd("gcloud", "container", +func nodeUpgradeGKE(v string, img string) error { + Logf("Upgrading nodes to version %q and image %q", v, img) + args := []string{ + "container", "clusters", fmt.Sprintf("--project=%s", TestContext.CloudConfig.ProjectID), fmt.Sprintf("--zone=%s", TestContext.CloudConfig.Zone), "upgrade", TestContext.CloudConfig.Cluster, fmt.Sprintf("--cluster-version=%s", v), - "--quiet") + "--quiet", + } + if len(img) > 0 { + args = append(args, fmt.Sprintf("--image-type=%s", img)) + } + _, _, err := RunCmd("gcloud", args...) return err } diff --git a/test/e2e/framework/test_context.go b/test/e2e/framework/test_context.go index 658bea7397..91fb1134de 100644 --- a/test/e2e/framework/test_context.go +++ b/test/e2e/framework/test_context.go @@ -46,6 +46,7 @@ type TestContextType struct { // Timeout for waiting for system pods to be running SystemPodsStartupTimeout time.Duration UpgradeTarget string + UpgradeImage string PrometheusPushGateway string ContainerRuntime string MasterOSDistro string @@ -163,6 +164,7 @@ func RegisterClusterFlags() { flag.IntVar(&TestContext.MinStartupPods, "minStartupPods", 0, "The number of pods which we need to see in 'Running' state with a 'Ready' condition of true, before we try running tests. This is useful in any cluster which needs some base pod-based services running before it can be used.") flag.DurationVar(&TestContext.SystemPodsStartupTimeout, "system-pods-startup-timeout", 10*time.Minute, "Timeout for waiting for all system pods to be running before starting tests.") flag.StringVar(&TestContext.UpgradeTarget, "upgrade-target", "ci/latest", "Version to upgrade to (e.g. 'release/stable', 'release/latest', 'ci/latest', '0.19.1', '0.19.1-669-gabac8c8') if doing an upgrade test.") + flag.StringVar(&TestContext.UpgradeImage, "upgrade-image", "", "Image to upgrade to (e.g. 'container_vm' or 'gci') if doing an upgrade test.") flag.StringVar(&TestContext.PrometheusPushGateway, "prom-push-gateway", "", "The URL to prometheus gateway, so that metrics can be pushed during e2es and scraped by prometheus. Typically something like 127.0.0.1:9091.") flag.BoolVar(&TestContext.CleanStart, "clean-start", false, "If true, purge all namespaces except default and system before running tests. This serves to Cleanup test namespaces from failed/interrupted e2e runs in a long-lived cluster.") flag.BoolVar(&TestContext.GarbageCollectorEnabled, "garbage-collector-enabled", true, "Set to true if the garbage collector is enabled in the kube-apiserver and kube-controller-manager, then some tests will rely on the garbage collector to delete dependent resources.")