From 161d0f3ffd4d0f4cfacadf333f13295bb003cd59 Mon Sep 17 00:00:00 2001 From: Kris Date: Tue, 14 Mar 2017 11:11:28 -0700 Subject: [PATCH] Add mechanism for upgrade tests to be skipped because of versions --- test/e2e/cluster_upgrade.go | 135 +++++++++++++++++++++++++---------- test/e2e/upgrades/BUILD | 1 + test/e2e/upgrades/upgrade.go | 13 +++- 3 files changed, 111 insertions(+), 38 deletions(-) diff --git a/test/e2e/cluster_upgrade.go b/test/e2e/cluster_upgrade.go index 136ba5ddfba..bcee3e38e74 100644 --- a/test/e2e/cluster_upgrade.go +++ b/test/e2e/cluster_upgrade.go @@ -17,6 +17,7 @@ limitations under the License. package e2e import ( + "k8s.io/kubernetes/pkg/util/version" "k8s.io/kubernetes/test/e2e/chaosmonkey" "k8s.io/kubernetes/test/e2e/framework" "k8s.io/kubernetes/test/e2e/upgrades" @@ -50,18 +51,27 @@ var _ = framework.KubeDescribe("Upgrade [Feature:Upgrade]", func() { framework.KubeDescribe("master upgrade", func() { It("should maintain a functioning cluster [Feature:MasterUpgrade]", func() { + target, err := framework.RealVersion(framework.TestContext.UpgradeTarget) + framework.ExpectNoError(err) + + current, err := f.ClientSet.Discovery().ServerVersion() + framework.ExpectNoError(err) + + versions, err := parseVersions(target, current.String()) + framework.ExpectNoError(err) + cm := chaosmonkey.New(func() { - v, err := framework.RealVersion(framework.TestContext.UpgradeTarget) - framework.ExpectNoError(err) - framework.ExpectNoError(framework.MasterUpgrade(v)) - framework.ExpectNoError(framework.CheckMasterVersion(f.ClientSet, v)) + framework.ExpectNoError(framework.MasterUpgrade(target)) + framework.ExpectNoError(framework.CheckMasterVersion(f.ClientSet, target)) }) for _, t := range upgradeTests { - cm.RegisterInterface(&chaosMonkeyAdapter{ + cma := chaosMonkeyAdapter{ test: t, framework: testFrameworks[t.Name()], upgradeType: upgrades.MasterUpgrade, - }) + versions: versions, + } + cm.Register(cma.Test) } cm.Do() @@ -70,18 +80,27 @@ var _ = framework.KubeDescribe("Upgrade [Feature:Upgrade]", func() { framework.KubeDescribe("node upgrade", func() { It("should maintain a functioning cluster [Feature:NodeUpgrade]", func() { + target, err := framework.RealVersion(framework.TestContext.UpgradeTarget) + framework.ExpectNoError(err) + + current, err := f.ClientSet.Discovery().ServerVersion() + framework.ExpectNoError(err) + + versions, err := parseVersions(target, current.String()) + framework.ExpectNoError(err) + cm := chaosmonkey.New(func() { - v, err := framework.RealVersion(framework.TestContext.UpgradeTarget) - framework.ExpectNoError(err) - framework.ExpectNoError(framework.NodeUpgrade(f, v, framework.TestContext.UpgradeImage)) - framework.ExpectNoError(framework.CheckNodesVersions(f.ClientSet, v)) + framework.ExpectNoError(framework.NodeUpgrade(f, target, framework.TestContext.UpgradeImage)) + framework.ExpectNoError(framework.CheckNodesVersions(f.ClientSet, target)) }) for _, t := range upgradeTests { - cm.RegisterInterface(&chaosMonkeyAdapter{ + cma := chaosMonkeyAdapter{ test: t, framework: testFrameworks[t.Name()], upgradeType: upgrades.NodeUpgrade, - }) + versions: versions, + } + cm.Register(cma.Test) } cm.Do() }) @@ -89,20 +108,29 @@ var _ = framework.KubeDescribe("Upgrade [Feature:Upgrade]", func() { framework.KubeDescribe("cluster upgrade", func() { It("should maintain a functioning cluster [Feature:ClusterUpgrade]", func() { + target, err := framework.RealVersion(framework.TestContext.UpgradeTarget) + framework.ExpectNoError(err) + + current, err := f.ClientSet.Discovery().ServerVersion() + framework.ExpectNoError(err) + + versions, err := parseVersions(target, current.String()) + framework.ExpectNoError(err) + cm := chaosmonkey.New(func() { - v, err := framework.RealVersion(framework.TestContext.UpgradeTarget) - framework.ExpectNoError(err) - framework.ExpectNoError(framework.MasterUpgrade(v)) - framework.ExpectNoError(framework.CheckMasterVersion(f.ClientSet, v)) - framework.ExpectNoError(framework.NodeUpgrade(f, v, framework.TestContext.UpgradeImage)) - framework.ExpectNoError(framework.CheckNodesVersions(f.ClientSet, v)) + framework.ExpectNoError(framework.MasterUpgrade(target)) + framework.ExpectNoError(framework.CheckMasterVersion(f.ClientSet, target)) + framework.ExpectNoError(framework.NodeUpgrade(f, target, framework.TestContext.UpgradeImage)) + framework.ExpectNoError(framework.CheckNodesVersions(f.ClientSet, target)) }) for _, t := range upgradeTests { - cm.RegisterInterface(&chaosMonkeyAdapter{ + cma := chaosMonkeyAdapter{ test: t, framework: testFrameworks[t.Name()], upgradeType: upgrades.ClusterUpgrade, - }) + versions: versions, + } + cm.Register(cma.Test) } cm.Do() }) @@ -121,21 +149,30 @@ var _ = framework.KubeDescribe("Downgrade [Feature:Downgrade]", func() { framework.KubeDescribe("cluster downgrade", func() { It("should maintain a functioning cluster [Feature:ClusterDowngrade]", func() { + target, err := framework.RealVersion(framework.TestContext.UpgradeTarget) + framework.ExpectNoError(err) + + current, err := f.ClientSet.Discovery().ServerVersion() + framework.ExpectNoError(err) + + versions, err := parseVersions(target, current.String()) + framework.ExpectNoError(err) + cm := chaosmonkey.New(func() { // Yes this really is a downgrade. And nodes must downgrade first. - v, err := framework.RealVersion(framework.TestContext.UpgradeTarget) - framework.ExpectNoError(err) - framework.ExpectNoError(framework.NodeUpgrade(f, v, framework.TestContext.UpgradeImage)) - framework.ExpectNoError(framework.CheckNodesVersions(f.ClientSet, v)) - framework.ExpectNoError(framework.MasterUpgrade(v)) - framework.ExpectNoError(framework.CheckMasterVersion(f.ClientSet, v)) + framework.ExpectNoError(framework.NodeUpgrade(f, target, framework.TestContext.UpgradeImage)) + framework.ExpectNoError(framework.CheckNodesVersions(f.ClientSet, target)) + framework.ExpectNoError(framework.MasterUpgrade(target)) + framework.ExpectNoError(framework.CheckMasterVersion(f.ClientSet, target)) }) for _, t := range upgradeTests { - cm.RegisterInterface(&chaosMonkeyAdapter{ + cma := chaosMonkeyAdapter{ test: t, framework: testFrameworks[t.Name()], upgradeType: upgrades.ClusterUpgrade, - }) + versions: versions, + } + cm.Register(cma.Test) } cm.Do() }) @@ -143,6 +180,8 @@ var _ = framework.KubeDescribe("Downgrade [Feature:Downgrade]", func() { }) var _ = framework.KubeDescribe("etcd Upgrade [Feature:EtcdUpgrade]", func() { + f := framework.NewDefaultFramework("etc-upgrade") + // Create the frameworks here because we can only create them // in a "Describe". testFrameworks := map[string]*framework.Framework{} @@ -152,16 +191,24 @@ var _ = framework.KubeDescribe("etcd Upgrade [Feature:EtcdUpgrade]", func() { framework.KubeDescribe("etcd upgrade", func() { It("should maintain a functioning cluster", func() { + current, err := f.ClientSet.Discovery().ServerVersion() + framework.ExpectNoError(err) + + versions, err := parseVersions(current.String()) + framework.ExpectNoError(err) + cm := chaosmonkey.New(func() { framework.ExpectNoError(framework.EtcdUpgrade(framework.TestContext.EtcdUpgradeStorage, framework.TestContext.EtcdUpgradeVersion)) // TODO(mml): verify the etcd version }) for _, t := range upgradeTests { - cm.RegisterInterface(&chaosMonkeyAdapter{ + cma := chaosMonkeyAdapter{ test: t, framework: testFrameworks[t.Name()], upgradeType: upgrades.EtcdUpgrade, - }) + versions: versions, + } + cm.Register(cma.Test) } cm.Do() @@ -173,16 +220,30 @@ type chaosMonkeyAdapter struct { test upgrades.Test framework *framework.Framework upgradeType upgrades.UpgradeType + versions []version.Version } -func (cma *chaosMonkeyAdapter) Setup() { +func (cma *chaosMonkeyAdapter) Test(sem *chaosmonkey.Semaphore) { + if skippable, ok := cma.test.(upgrades.VersionSkippable); ok && skippable.SkipVersions(cma.versions...) { + By("skipping test " + cma.test.Name()) + sem.Ready() + return + } + cma.test.Setup(cma.framework) + defer cma.test.Teardown(cma.framework) + sem.Ready() + cma.test.Test(cma.framework, sem.StopCh, cma.upgradeType) } -func (cma *chaosMonkeyAdapter) Test(stopCh <-chan struct{}) { - cma.test.Test(cma.framework, stopCh, cma.upgradeType) -} - -func (cma *chaosMonkeyAdapter) Teardown() { - cma.test.Teardown(cma.framework) +func parseVersions(vs ...string) ([]version.Version, error) { + var ret []version.Version + for _, v := range vs { + semver, err := version.ParseSemantic(v) + if err != nil { + return nil, err + } + ret = append(ret, *semver) + } + return ret, nil } diff --git a/test/e2e/upgrades/BUILD b/test/e2e/upgrades/BUILD index a7fa15e8375..89bec5160a8 100644 --- a/test/e2e/upgrades/BUILD +++ b/test/e2e/upgrades/BUILD @@ -33,6 +33,7 @@ go_library( "//pkg/controller:go_default_library", "//pkg/controller/deployment/util:go_default_library", "//pkg/kubelet/sysctl:go_default_library", + "//pkg/util/version:go_default_library", "//test/e2e/common:go_default_library", "//test/e2e/framework:go_default_library", "//vendor:github.com/onsi/ginkgo", diff --git a/test/e2e/upgrades/upgrade.go b/test/e2e/upgrades/upgrade.go index 2f1f88f6d4e..bc3f5fc0f07 100644 --- a/test/e2e/upgrades/upgrade.go +++ b/test/e2e/upgrades/upgrade.go @@ -18,7 +18,10 @@ limitations under the License. // features before, during, and after different types of upgrades. package upgrades -import "k8s.io/kubernetes/test/e2e/framework" +import ( + "k8s.io/kubernetes/pkg/util/version" + "k8s.io/kubernetes/test/e2e/framework" +) // UpgradeType represents different types of upgrades. type UpgradeType int @@ -57,3 +60,11 @@ type Test interface { // aren't already cleaned up by the framework. Teardown(f *framework.Framework) } + +// VersionSkippable is an interface that an upgrade test can implement +// to be able to indicate that it should be skipped. +type VersionSkippable interface { + // SkipVersions should return true if test should be skipped + // for any of provided versions. + SkipVersions(versions ...version.Version) bool +}