Merge pull request #42588 from krousey/upgrades

Automatic merge from submit-queue

Create "framework" per upgrade test

There were already a few tests just using the default framework
namespace instead of creating a new one. Also there are several
testing libraries that use the default framework's default namespace
as well. It's just easier this way.
This commit is contained in:
Kubernetes Submit Queue 2017-03-07 14:56:12 -08:00 committed by GitHub
commit d6ae61c3c9
12 changed files with 51 additions and 27 deletions

View File

@ -45,6 +45,13 @@ var upgradeTests = []upgrades.Test{
var _ = framework.KubeDescribe("Upgrade [Feature:Upgrade]", func() { var _ = framework.KubeDescribe("Upgrade [Feature:Upgrade]", func() {
f := framework.NewDefaultFramework("cluster-upgrade") f := framework.NewDefaultFramework("cluster-upgrade")
// Create the frameworks here because we can only create them
// in a "Describe".
testFrameworks := map[string]*framework.Framework{}
for _, t := range upgradeTests {
testFrameworks[t.Name()] = framework.NewDefaultFramework(t.Name())
}
framework.KubeDescribe("master upgrade", func() { framework.KubeDescribe("master upgrade", func() {
It("should maintain a functioning cluster [Feature:MasterUpgrade]", func() { It("should maintain a functioning cluster [Feature:MasterUpgrade]", func() {
cm := chaosmonkey.New(func() { cm := chaosmonkey.New(func() {
@ -56,7 +63,7 @@ var _ = framework.KubeDescribe("Upgrade [Feature:Upgrade]", func() {
for _, t := range upgradeTests { for _, t := range upgradeTests {
cm.RegisterInterface(&chaosMonkeyAdapter{ cm.RegisterInterface(&chaosMonkeyAdapter{
test: t, test: t,
framework: f, framework: testFrameworks[t.Name()],
upgradeType: upgrades.MasterUpgrade, upgradeType: upgrades.MasterUpgrade,
}) })
} }
@ -76,7 +83,7 @@ var _ = framework.KubeDescribe("Upgrade [Feature:Upgrade]", func() {
for _, t := range upgradeTests { for _, t := range upgradeTests {
cm.RegisterInterface(&chaosMonkeyAdapter{ cm.RegisterInterface(&chaosMonkeyAdapter{
test: t, test: t,
framework: f, framework: testFrameworks[t.Name()],
upgradeType: upgrades.NodeUpgrade, upgradeType: upgrades.NodeUpgrade,
}) })
} }
@ -97,7 +104,7 @@ var _ = framework.KubeDescribe("Upgrade [Feature:Upgrade]", func() {
for _, t := range upgradeTests { for _, t := range upgradeTests {
cm.RegisterInterface(&chaosMonkeyAdapter{ cm.RegisterInterface(&chaosMonkeyAdapter{
test: t, test: t,
framework: f, framework: testFrameworks[t.Name()],
upgradeType: upgrades.ClusterUpgrade, upgradeType: upgrades.ClusterUpgrade,
}) })
} }
@ -107,7 +114,12 @@ var _ = framework.KubeDescribe("Upgrade [Feature:Upgrade]", func() {
}) })
var _ = framework.KubeDescribe("etcd Upgrade [Feature:EtcdUpgrade]", func() { var _ = framework.KubeDescribe("etcd Upgrade [Feature:EtcdUpgrade]", func() {
f := framework.NewDefaultFramework("etcd-upgrade") // Create the frameworks here because we can only create them
// in a "Describe".
testFrameworks := map[string]*framework.Framework{}
for _, t := range upgradeTests {
testFrameworks[t.Name()] = framework.NewDefaultFramework(t.Name())
}
framework.KubeDescribe("etcd upgrade", func() { framework.KubeDescribe("etcd upgrade", func() {
It("should maintain a functioning cluster", func() { It("should maintain a functioning cluster", func() {
@ -118,7 +130,7 @@ var _ = framework.KubeDescribe("etcd Upgrade [Feature:EtcdUpgrade]", func() {
for _, t := range upgradeTests { for _, t := range upgradeTests {
cm.RegisterInterface(&chaosMonkeyAdapter{ cm.RegisterInterface(&chaosMonkeyAdapter{
test: t, test: t,
framework: f, framework: testFrameworks[t.Name()],
upgradeType: upgrades.EtcdUpgrade, upgradeType: upgrades.EtcdUpgrade,
}) })
} }

View File

@ -33,13 +33,13 @@ type ConfigMapUpgradeTest struct {
configMap *v1.ConfigMap configMap *v1.ConfigMap
} }
func (ConfigMapUpgradeTest) Name() string { return "configmap-upgrade" }
// Setup creates a ConfigMap and then verifies that a pod can consume it. // Setup creates a ConfigMap and then verifies that a pod can consume it.
func (t *ConfigMapUpgradeTest) Setup(f *framework.Framework) { func (t *ConfigMapUpgradeTest) Setup(f *framework.Framework) {
configMapName := "upgrade-configmap" configMapName := "upgrade-configmap"
// Grab a unique namespace so we don't collide. ns := f.Namespace
ns, err := f.CreateNamespace("configmap-upgrade", nil)
framework.ExpectNoError(err)
t.configMap = &v1.ConfigMap{ t.configMap = &v1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
@ -52,6 +52,7 @@ func (t *ConfigMapUpgradeTest) Setup(f *framework.Framework) {
} }
By("Creating a ConfigMap") By("Creating a ConfigMap")
var err error
if t.configMap, err = f.ClientSet.Core().ConfigMaps(ns.Name).Create(t.configMap); err != nil { if t.configMap, err = f.ClientSet.Core().ConfigMaps(ns.Name).Create(t.configMap); err != nil {
framework.Failf("unable to create test ConfigMap %s: %v", t.configMap.Name, err) framework.Failf("unable to create test ConfigMap %s: %v", t.configMap.Name, err)
} }

View File

@ -36,16 +36,15 @@ type DaemonSetUpgradeTest struct {
daemonSet *extensions.DaemonSet daemonSet *extensions.DaemonSet
} }
func (DaemonSetUpgradeTest) Name() string { return "daemonset-upgrade" }
// Setup creates a DaemonSet and verifies that it's running // Setup creates a DaemonSet and verifies that it's running
func (t *DaemonSetUpgradeTest) Setup(f *framework.Framework) { func (t *DaemonSetUpgradeTest) Setup(f *framework.Framework) {
namespace := "daemonset-upgrade"
daemonSetName := "ds1" daemonSetName := "ds1"
labelSet := map[string]string{"ds-name": daemonSetName} labelSet := map[string]string{"ds-name": daemonSetName}
image := "gcr.io/google_containers/serve_hostname:v1.4" image := "gcr.io/google_containers/serve_hostname:v1.4"
// Grab a unique namespace so we don't collide. ns := f.Namespace
ns, err := f.CreateNamespace(namespace, nil)
framework.ExpectNoError(err)
t.daemonSet = &extensions.DaemonSet{ t.daemonSet = &extensions.DaemonSet{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
@ -71,6 +70,7 @@ func (t *DaemonSetUpgradeTest) Setup(f *framework.Framework) {
} }
By("Creating a DaemonSet") By("Creating a DaemonSet")
var err error
if t.daemonSet, err = f.ClientSet.Extensions().DaemonSets(ns.Name).Create(t.daemonSet); err != nil { if t.daemonSet, err = f.ClientSet.Extensions().DaemonSets(ns.Name).Create(t.daemonSet); err != nil {
framework.Failf("unable to create test DaemonSet %s: %v", t.daemonSet.Name, err) framework.Failf("unable to create test DaemonSet %s: %v", t.daemonSet.Name, err)
} }

View File

@ -39,16 +39,15 @@ type DeploymentUpgradeTest struct {
newRS *extensions.ReplicaSet newRS *extensions.ReplicaSet
} }
func (DeploymentUpgradeTest) Name() string { return "deployment-upgrade" }
// Setup creates a deployment and makes sure it has a new and an old replica set running. // Setup creates a deployment and makes sure it has a new and an old replica set running.
func (t *DeploymentUpgradeTest) Setup(f *framework.Framework) { func (t *DeploymentUpgradeTest) Setup(f *framework.Framework) {
deploymentName := "deployment-hash-test" deploymentName := "deployment-hash-test"
c := f.ClientSet c := f.ClientSet
nginxImage := "gcr.io/google_containers/nginx-slim:0.8" nginxImage := "gcr.io/google_containers/nginx-slim:0.8"
// Grab a unique namespace so we don't collide. ns := f.Namespace.Name
namespace, err := f.CreateNamespace("deployment-upgrade", nil)
framework.ExpectNoError(err)
ns := namespace.Name
By(fmt.Sprintf("Creating a deployment %q in namespace %q", deploymentName, ns)) By(fmt.Sprintf("Creating a deployment %q in namespace %q", deploymentName, ns))
d := framework.NewDeployment(deploymentName, int32(1), map[string]string{"test": "upgrade"}, "nginx", nginxImage, extensions.RollingUpdateDeploymentStrategyType) d := framework.NewDeployment(deploymentName, int32(1), map[string]string{"test": "upgrade"}, "nginx", nginxImage, extensions.RollingUpdateDeploymentStrategyType)

View File

@ -18,6 +18,7 @@ package upgrades
import ( import (
"fmt" "fmt"
"k8s.io/kubernetes/test/e2e/common" "k8s.io/kubernetes/test/e2e/common"
"k8s.io/kubernetes/test/e2e/framework" "k8s.io/kubernetes/test/e2e/framework"
@ -29,6 +30,8 @@ type HPAUpgradeTest struct {
rc *common.ResourceConsumer rc *common.ResourceConsumer
} }
func (HPAUpgradeTest) Name() string { return "hpa-upgrade" }
// Creates a resource consumer and an HPA object that autoscales the consumer. // Creates a resource consumer and an HPA object that autoscales the consumer.
func (t *HPAUpgradeTest) Setup(f *framework.Framework) { func (t *HPAUpgradeTest) Setup(f *framework.Framework) {
t.rc = common.NewDynamicResourceConsumer( t.rc = common.NewDynamicResourceConsumer(

View File

@ -36,6 +36,8 @@ type IngressUpgradeTest struct {
ipName string ipName string
} }
func (IngressUpgradeTest) Name() string { return "ingress-upgrade" }
// Setup creates a GLBC, allocates an ip, and an ingress resource, // Setup creates a GLBC, allocates an ip, and an ingress resource,
// then waits for a successful connectivity check to the ip. // then waits for a successful connectivity check to the ip.
func (t *IngressUpgradeTest) Setup(f *framework.Framework) { func (t *IngressUpgradeTest) Setup(f *framework.Framework) {
@ -44,8 +46,7 @@ func (t *IngressUpgradeTest) Setup(f *framework.Framework) {
// jig handles all Kubernetes testing logic // jig handles all Kubernetes testing logic
jig := framework.NewIngressTestJig(f.ClientSet) jig := framework.NewIngressTestJig(f.ClientSet)
ns, err := f.CreateNamespace("ingress-upgrade", nil) ns := f.Namespace
framework.ExpectNoError(err)
// gceController handles all cloud testing logic // gceController handles all cloud testing logic
gceController := &framework.GCEIngressController{ gceController := &framework.GCEIngressController{

View File

@ -31,11 +31,11 @@ type JobUpgradeTest struct {
namespace string namespace string
} }
func (JobUpgradeTest) Name() string { return "job-upgrade" }
// Setup starts a Job with a parallelism of 2 and 2 completions running. // Setup starts a Job with a parallelism of 2 and 2 completions running.
func (t *JobUpgradeTest) Setup(f *framework.Framework) { func (t *JobUpgradeTest) Setup(f *framework.Framework) {
ns, err := f.CreateNamespace("service-upgrade", nil) t.namespace = f.Namespace.Name
Expect(err).NotTo(HaveOccurred())
t.namespace = ns.Name
By("Creating a job") By("Creating a job")
t.job = framework.NewTestJob("notTerminate", "foo", v1.RestartPolicyOnFailure, 2, 2) t.job = framework.NewTestJob("notTerminate", "foo", v1.RestartPolicyOnFailure, 2, 2)

View File

@ -30,6 +30,8 @@ type PersistentVolumeUpgradeTest struct {
pvc *v1.PersistentVolumeClaim pvc *v1.PersistentVolumeClaim
} }
func (PersistentVolumeUpgradeTest) Name() string { return "persistent-volume-upgrade" }
const ( const (
pvTestFile string = "/mnt/pv_upgrade_test" pvTestFile string = "/mnt/pv_upgrade_test"
pvTestData string = "keep it pv" pvTestData string = "keep it pv"

View File

@ -33,13 +33,13 @@ type SecretUpgradeTest struct {
secret *v1.Secret secret *v1.Secret
} }
func (SecretUpgradeTest) Name() string { return "secret-upgrade" }
// Setup creates a secret and then verifies that a pod can consume it. // Setup creates a secret and then verifies that a pod can consume it.
func (t *SecretUpgradeTest) Setup(f *framework.Framework) { func (t *SecretUpgradeTest) Setup(f *framework.Framework) {
secretName := "upgrade-secret" secretName := "upgrade-secret"
// Grab a unique namespace so we don't collide. ns := f.Namespace
ns, err := f.CreateNamespace("secret-upgrade", nil)
framework.ExpectNoError(err)
t.secret = &v1.Secret{ t.secret = &v1.Secret{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
@ -52,6 +52,7 @@ func (t *SecretUpgradeTest) Setup(f *framework.Framework) {
} }
By("Creating a secret") By("Creating a secret")
var err error
if t.secret, err = f.ClientSet.Core().Secrets(ns.Name).Create(t.secret); err != nil { if t.secret, err = f.ClientSet.Core().Secrets(ns.Name).Create(t.secret); err != nil {
framework.Failf("unable to create test secret %s: %v", t.secret.Name, err) framework.Failf("unable to create test secret %s: %v", t.secret.Name, err)
} }

View File

@ -34,14 +34,14 @@ type ServiceUpgradeTest struct {
svcPort int svcPort int
} }
func (ServiceUpgradeTest) Name() string { return "service-upgrade" }
// Setup creates a service with a load balancer and makes sure it's reachable. // Setup creates a service with a load balancer and makes sure it's reachable.
func (t *ServiceUpgradeTest) Setup(f *framework.Framework) { func (t *ServiceUpgradeTest) Setup(f *framework.Framework) {
serviceName := "service-test" serviceName := "service-test"
jig := framework.NewServiceTestJig(f.ClientSet, serviceName) jig := framework.NewServiceTestJig(f.ClientSet, serviceName)
// Grab a unique namespace so we don't collide. ns := f.Namespace
ns, err := f.CreateNamespace("service-upgrade", nil)
framework.ExpectNoError(err)
By("creating a TCP service " + serviceName + " with type=LoadBalancer in namespace " + ns.Name) By("creating a TCP service " + serviceName + " with type=LoadBalancer in namespace " + ns.Name)
tcpService := jig.CreateTCPServiceOrFail(ns.Name, func(s *v1.Service) { tcpService := jig.CreateTCPServiceOrFail(ns.Name, func(s *v1.Service) {

View File

@ -33,6 +33,8 @@ type StatefulSetUpgradeTest struct {
set *apps.StatefulSet set *apps.StatefulSet
} }
func (StatefulSetUpgradeTest) Name() string { return "statefulset-upgrade" }
// Setup creates a StatefulSet and a HeadlessService. It verifies the basic SatefulSet properties // Setup creates a StatefulSet and a HeadlessService. It verifies the basic SatefulSet properties
func (t *StatefulSetUpgradeTest) Setup(f *framework.Framework) { func (t *StatefulSetUpgradeTest) Setup(f *framework.Framework) {
ssName := "ss" ssName := "ss"

View File

@ -41,6 +41,9 @@ const (
// Test is an interface for upgrade tests. // Test is an interface for upgrade tests.
type Test interface { type Test interface {
// Name should return a test name sans spaces.
Name() string
// Setup should create and verify whatever objects need to // Setup should create and verify whatever objects need to
// exist before the upgrade disruption starts. // exist before the upgrade disruption starts.
Setup(f *framework.Framework) Setup(f *framework.Framework)