From 6b8b08c8ab2766adf3498a668ad2649e11ba91c7 Mon Sep 17 00:00:00 2001 From: Caleb Woodbine Date: Thu, 27 Feb 2020 09:53:35 +1300 Subject: [PATCH 01/13] Create ReplicationController lifecycle test --- test/e2e/apps/rc.go | 170 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 170 insertions(+) diff --git a/test/e2e/apps/rc.go b/test/e2e/apps/rc.go index c5b3246ed7b..c465e39b781 100644 --- a/test/e2e/apps/rc.go +++ b/test/e2e/apps/rc.go @@ -17,6 +17,7 @@ limitations under the License. package apps import ( + "encoding/json" "context" "fmt" "time" @@ -34,6 +35,10 @@ import ( e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" imageutils "k8s.io/kubernetes/test/utils/image" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/runtime/schema" + autoscalingv1 "k8s.io/api/autoscaling/v1" + "k8s.io/client-go/dynamic" "github.com/onsi/ginkgo" ) @@ -41,6 +46,14 @@ import ( var _ = SIGDescribe("ReplicationController", func() { f := framework.NewDefaultFramework("replication-controller") + var ns string + var dc dynamic.Interface + + ginkgo.BeforeEach(func() { + ns = f.Namespace.Name + dc = f.DynamicClient + }) + /* Release : v1.9 Testname: Replication Controller, run basic image @@ -84,6 +97,163 @@ var _ = SIGDescribe("ReplicationController", func() { framework.ConformanceIt("should release no longer matching pods", func() { testRCReleaseControlledNotMatching(f) }) + + ginkgo.It("should test the lifecycle of a ReplicationController", func() { + testRcName := "rc-test" + testRcNamespace := ns + testRcInitialReplicaCount := int32(1) + testRcMaxReplicaCount := int32(2) + rcResource := schema.GroupVersionResource{Group: "", Version: "v1", Resource: "replicationcontrollers"} + + rcTest := v1.ReplicationController{ + ObjectMeta: metav1.ObjectMeta{ + Name: testRcName, + Labels: map[string]string{"test-rc-static": "true"}, + }, + Spec: v1.ReplicationControllerSpec{ + Replicas: &testRcInitialReplicaCount, + Selector: map[string]string{"test-rc-static": "true"}, + Template: &v1.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{ + Name: testRcName, + Labels: map[string]string{"test-rc-static": "true"}, + }, + Spec: v1.PodSpec{ + Containers: []v1.Container{{ + Name: testRcName, + Image: "nginx", + }}, + }, + }, + }, + } + + // Create a ReplicationController + _, err := f.ClientSet.CoreV1().ReplicationControllers(testRcNamespace).Create(context.TODO(), &rcTest, metav1.CreateOptions{}) + framework.ExpectNoError(err, "Failed to create ReplicationController") + + // setup a watch for the RC + rcWatch, err := f.ClientSet.CoreV1().ReplicationControllers(testRcNamespace).Watch(context.TODO(), metav1.ListOptions{LabelSelector: "test-rc-static=true"}) + framework.ExpectNoError(err, "Failed to setup watch on newly created ReplicationController") + + rcWatchChan := rcWatch.ResultChan() + + for event := range rcWatchChan { + rc, ok := event.Object.(*v1.ReplicationController) + framework.ExpectEqual(ok, true, "Unable to convert type of ReplicationController watch event") + if rc.Status.Replicas == testRcInitialReplicaCount && rc.Status.ReadyReplicas == testRcInitialReplicaCount { + break + } + } + + rcLabelPatchPayload, err := json.Marshal(v1.ReplicationController{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{"test-rc": "patched"}, + }, + }) + framework.ExpectNoError(err, "failed to marshal json of replicationcontroller label patch") + // Patch the ReplicationController + _, err = f.ClientSet.CoreV1().ReplicationControllers(testRcNamespace).Patch(context.TODO(), testRcName, types.StrategicMergePatchType, []byte(rcLabelPatchPayload), metav1.PatchOptions{}) + framework.ExpectNoError(err, "Failed to patch ReplicationController") + + rcStatusPatchPayload, err := json.Marshal(map[string]interface{}{ + "status": map[string]interface{}{ + "readyReplicas": 0, + "availableReplicas": 0, + }, + }) + framework.ExpectNoError(err, "Failed to marshal JSON of ReplicationController label patch") + + // Patch the ReplicationController's status + rcStatus, err := f.ClientSet.CoreV1().ReplicationControllers(testRcNamespace).Patch(context.TODO(), testRcName, types.StrategicMergePatchType, []byte(rcStatusPatchPayload), metav1.PatchOptions{}, "status") + framework.ExpectNoError(err, "Failed to patch ReplicationControllerStatus") + framework.ExpectEqual(rcStatus.Status.ReadyReplicas, int32(0), "ReplicationControllerStatus's readyReplicas does not equal 0") + + rcStatusUnstructured, err := dc.Resource(rcResource).Namespace(testRcNamespace).Get(testRcName, metav1.GetOptions{}, "status") + framework.ExpectNoError(err, "Failed to fetch ReplicationControllerStatus") + + rcStatusUjson, err := json.Marshal(rcStatusUnstructured) + framework.ExpectNoError(err, "Failed to marshal json of replicationcontroller label patch") + json.Unmarshal(rcStatusUjson, &rcStatus) + framework.ExpectEqual(rcStatus.Status.Replicas, testRcInitialReplicaCount, "ReplicationController ReplicaSet cound does not match initial Replica count") + + rcScalePatchPayload, err := json.Marshal(autoscalingv1.Scale{ + Spec: autoscalingv1.ScaleSpec{ + Replicas: 2, + }, + }) + framework.ExpectNoError(err, "Failed to marshal json of replicationcontroller label patch") + + // Patch the ReplicationController's scale + rcScale, err := f.ClientSet.CoreV1().ReplicationControllers(testRcNamespace).Patch(context.TODO(), testRcName, types.StrategicMergePatchType, []byte(rcScalePatchPayload), metav1.PatchOptions{}, "scale") + framework.ExpectNoError(err, "Failed to patch ReplicationControllerScale") + + for event := range rcWatchChan { + rc, ok := event.Object.(*v1.ReplicationController) + framework.ExpectEqual(ok, true, "Unable to convert type of ReplicationController watch event") + if rc.Status.Replicas == testRcMaxReplicaCount && rc.Status.ReadyReplicas == testRcMaxReplicaCount { + rcScale = rc + break + } + } + framework.ExpectEqual(rcScale.Status.Replicas, testRcMaxReplicaCount, "ReplicationController ReplicasSet Scale does not match the expected scale") + + // Get the ReplicationController + rc, err := f.ClientSet.CoreV1().ReplicationControllers(testRcNamespace).Get(context.TODO(), testRcName, metav1.GetOptions{}) + framework.ExpectNoError(err, "Failed to fetch ReplicationController") + framework.ExpectEqual(rc.ObjectMeta.Labels["test-rc"], "patched", "ReplicationController is missing a label from earlier patch") + + rcStatusUpdatePayload := rc + rcStatusUpdatePayload.Status.AvailableReplicas = 1 + rcStatusUpdatePayload.Status.ReadyReplicas = 1 + + // Replace the ReplicationController's status + rcStatus, err = f.ClientSet.CoreV1().ReplicationControllers(testRcNamespace).UpdateStatus(context.TODO(), rcStatusUpdatePayload, metav1.UpdateOptions{}) + framework.ExpectNoError(err, "Failed to update ReplicationControllerStatus") + framework.ExpectEqual(rcStatus.Status.ReadyReplicas, int32(1), "ReplicationControllerStatus readyReplicas does not equal 1") + + for event := range rcWatchChan { + rc, ok := event.Object.(*v1.ReplicationController) + framework.ExpectEqual(ok, true, "Unable to convert type of ReplicationController watch event") + if rc.Status.Replicas == testRcMaxReplicaCount && rc.Status.ReadyReplicas == testRcMaxReplicaCount { + break + } + } + + rcs, err := f.ClientSet.CoreV1().ReplicationControllers("").List(context.TODO(), metav1.ListOptions{LabelSelector: "test-rc-static=true"}) + framework.ExpectNoError(err, "Failed to list ReplicationController") + framework.ExpectEqual(len(rcs.Items) > 0, true) + + foundRc := false + for _, rcItem := range rcs.Items { + if rcItem.ObjectMeta.Name == testRcName && + rcItem.ObjectMeta.Namespace == testRcNamespace && + rcItem.ObjectMeta.Labels["test-rc-static"] == "true" && + rcItem.ObjectMeta.Labels["test-rc"] == "patched" && + rcItem.Status.Replicas == testRcMaxReplicaCount && + rcItem.Status.ReadyReplicas == testRcMaxReplicaCount { + foundRc = true + } + } + framework.ExpectEqual(foundRc, true) + + // Delete ReplicationController + err = f.ClientSet.CoreV1().ReplicationControllers(testRcNamespace).DeleteCollection(context.TODO(), &metav1.DeleteOptions{}, metav1.ListOptions{LabelSelector: "test-rc-static=true"}) + framework.ExpectNoError(err, "Failed to delete ReplicationControllers") + + for event := range rcWatchChan { + rc, ok := event.Object.(*v1.ReplicationController) + framework.ExpectEqual(ok, true, "Unable to convert type of ReplicationController watch event") + if rc.ObjectMeta.DeletionTimestamp != nil { + break + } + } + time.Sleep(1 * time.Second) + + // Get the ReplicationController to check that it's deleted + _, err = f.ClientSet.CoreV1().ReplicationControllers(testRcNamespace).Get(context.TODO(), testRcName, metav1.GetOptions{}) + framework.ExpectError(err, "Failed to delete ReplicationController") + }) }) func newRC(rsName string, replicas int32, rcPodLabels map[string]string, imageName string, image string, args []string) *v1.ReplicationController { From 2622a6caceca8c1b9a258c8c8743fb83c4ded7b1 Mon Sep 17 00:00:00 2001 From: Caleb Woodbine Date: Thu, 27 Feb 2020 14:48:39 +1300 Subject: [PATCH 02/13] Fix formatting and BUILD --- test/e2e/apps/BUILD | 1 + test/e2e/apps/rc.go | 18 +++++++++--------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/test/e2e/apps/BUILD b/test/e2e/apps/BUILD index ba8a93c495e..50686bd2579 100644 --- a/test/e2e/apps/BUILD +++ b/test/e2e/apps/BUILD @@ -38,6 +38,7 @@ go_library( "//pkg/master/ports:go_default_library", "//pkg/scheduler/nodeinfo:go_default_library", "//staging/src/k8s.io/api/apps/v1:go_default_library", + "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", "//staging/src/k8s.io/api/batch/v1:go_default_library", "//staging/src/k8s.io/api/batch/v1beta1:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", diff --git a/test/e2e/apps/rc.go b/test/e2e/apps/rc.go index c465e39b781..4d96def684d 100644 --- a/test/e2e/apps/rc.go +++ b/test/e2e/apps/rc.go @@ -17,28 +17,28 @@ limitations under the License. package apps import ( - "encoding/json" "context" + "encoding/json" "fmt" "time" + autoscalingv1 "k8s.io/api/autoscaling/v1" v1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/uuid" "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/client-go/dynamic" clientset "k8s.io/client-go/kubernetes" "k8s.io/kubernetes/pkg/controller/replication" "k8s.io/kubernetes/test/e2e/framework" e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" imageutils "k8s.io/kubernetes/test/utils/image" - "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/runtime/schema" - autoscalingv1 "k8s.io/api/autoscaling/v1" - "k8s.io/client-go/dynamic" "github.com/onsi/ginkgo" ) @@ -107,7 +107,7 @@ var _ = SIGDescribe("ReplicationController", func() { rcTest := v1.ReplicationController{ ObjectMeta: metav1.ObjectMeta{ - Name: testRcName, + Name: testRcName, Labels: map[string]string{"test-rc-static": "true"}, }, Spec: v1.ReplicationControllerSpec{ @@ -115,12 +115,12 @@ var _ = SIGDescribe("ReplicationController", func() { Selector: map[string]string{"test-rc-static": "true"}, Template: &v1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ - Name: testRcName, + Name: testRcName, Labels: map[string]string{"test-rc-static": "true"}, }, Spec: v1.PodSpec{ Containers: []v1.Container{{ - Name: testRcName, + Name: testRcName, Image: "nginx", }}, }, @@ -158,7 +158,7 @@ var _ = SIGDescribe("ReplicationController", func() { rcStatusPatchPayload, err := json.Marshal(map[string]interface{}{ "status": map[string]interface{}{ - "readyReplicas": 0, + "readyReplicas": 0, "availableReplicas": 0, }, }) From e5e303786880da3ec24e66161ed344660e8a7f6c Mon Sep 17 00:00:00 2001 From: Caleb Woodbine Date: Mon, 2 Mar 2020 13:46:41 +1300 Subject: [PATCH 03/13] Use max Replica count instead of hardcoded value --- test/e2e/apps/rc.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/e2e/apps/rc.go b/test/e2e/apps/rc.go index 4d96def684d..88e43243a4b 100644 --- a/test/e2e/apps/rc.go +++ b/test/e2e/apps/rc.go @@ -179,7 +179,7 @@ var _ = SIGDescribe("ReplicationController", func() { rcScalePatchPayload, err := json.Marshal(autoscalingv1.Scale{ Spec: autoscalingv1.ScaleSpec{ - Replicas: 2, + Replicas: testRcMaxReplicaCount, }, }) framework.ExpectNoError(err, "Failed to marshal json of replicationcontroller label patch") From 5239ae44b6848598691013f30fb9bb40be2b69ff Mon Sep 17 00:00:00 2001 From: Caleb Woodbine Date: Mon, 2 Mar 2020 15:42:23 +1300 Subject: [PATCH 04/13] Update delay time before deletion recheck --- test/e2e/apps/rc.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/e2e/apps/rc.go b/test/e2e/apps/rc.go index 88e43243a4b..2d70af23661 100644 --- a/test/e2e/apps/rc.go +++ b/test/e2e/apps/rc.go @@ -248,7 +248,7 @@ var _ = SIGDescribe("ReplicationController", func() { break } } - time.Sleep(1 * time.Second) + time.Sleep(10 * time.Second) // Get the ReplicationController to check that it's deleted _, err = f.ClientSet.CoreV1().ReplicationControllers(testRcNamespace).Get(context.TODO(), testRcName, metav1.GetOptions{}) From 3b1e2249b076b7d5d3b319add0eb8128390133b8 Mon Sep 17 00:00:00 2001 From: Caleb Woodbine Date: Wed, 4 Mar 2020 09:19:06 +1300 Subject: [PATCH 05/13] Add ginkgo.By statements, TimeoutSeconds to the ReplicationController watch --- test/e2e/apps/rc.go | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/test/e2e/apps/rc.go b/test/e2e/apps/rc.go index 2d70af23661..abbb0abcef5 100644 --- a/test/e2e/apps/rc.go +++ b/test/e2e/apps/rc.go @@ -128,16 +128,19 @@ var _ = SIGDescribe("ReplicationController", func() { }, } + ginkgo.By("creating a ReplicationController") // Create a ReplicationController _, err := f.ClientSet.CoreV1().ReplicationControllers(testRcNamespace).Create(context.TODO(), &rcTest, metav1.CreateOptions{}) framework.ExpectNoError(err, "Failed to create ReplicationController") // setup a watch for the RC - rcWatch, err := f.ClientSet.CoreV1().ReplicationControllers(testRcNamespace).Watch(context.TODO(), metav1.ListOptions{LabelSelector: "test-rc-static=true"}) + rcWatchTimeoutSeconds := int64(60) + rcWatch, err := f.ClientSet.CoreV1().ReplicationControllers(testRcNamespace).Watch(context.TODO(), metav1.ListOptions{LabelSelector: "test-rc-static=true", TimeoutSeconds: &rcWatchTimeoutSeconds}) framework.ExpectNoError(err, "Failed to setup watch on newly created ReplicationController") rcWatchChan := rcWatch.ResultChan() + ginkgo.By("waiting for available Replicas") for event := range rcWatchChan { rc, ok := event.Object.(*v1.ReplicationController) framework.ExpectEqual(ok, true, "Unable to convert type of ReplicationController watch event") @@ -153,6 +156,7 @@ var _ = SIGDescribe("ReplicationController", func() { }) framework.ExpectNoError(err, "failed to marshal json of replicationcontroller label patch") // Patch the ReplicationController + ginkgo.By("patching ReplicationController") _, err = f.ClientSet.CoreV1().ReplicationControllers(testRcNamespace).Patch(context.TODO(), testRcName, types.StrategicMergePatchType, []byte(rcLabelPatchPayload), metav1.PatchOptions{}) framework.ExpectNoError(err, "Failed to patch ReplicationController") @@ -165,10 +169,12 @@ var _ = SIGDescribe("ReplicationController", func() { framework.ExpectNoError(err, "Failed to marshal JSON of ReplicationController label patch") // Patch the ReplicationController's status + ginkgo.By("patching ReplicationController status") rcStatus, err := f.ClientSet.CoreV1().ReplicationControllers(testRcNamespace).Patch(context.TODO(), testRcName, types.StrategicMergePatchType, []byte(rcStatusPatchPayload), metav1.PatchOptions{}, "status") framework.ExpectNoError(err, "Failed to patch ReplicationControllerStatus") framework.ExpectEqual(rcStatus.Status.ReadyReplicas, int32(0), "ReplicationControllerStatus's readyReplicas does not equal 0") + ginkgo.By("fetching ReplicationController status") rcStatusUnstructured, err := dc.Resource(rcResource).Namespace(testRcNamespace).Get(testRcName, metav1.GetOptions{}, "status") framework.ExpectNoError(err, "Failed to fetch ReplicationControllerStatus") @@ -185,6 +191,7 @@ var _ = SIGDescribe("ReplicationController", func() { framework.ExpectNoError(err, "Failed to marshal json of replicationcontroller label patch") // Patch the ReplicationController's scale + ginkgo.By("patching ReplicationController scale") rcScale, err := f.ClientSet.CoreV1().ReplicationControllers(testRcNamespace).Patch(context.TODO(), testRcName, types.StrategicMergePatchType, []byte(rcScalePatchPayload), metav1.PatchOptions{}, "scale") framework.ExpectNoError(err, "Failed to patch ReplicationControllerScale") @@ -199,6 +206,7 @@ var _ = SIGDescribe("ReplicationController", func() { framework.ExpectEqual(rcScale.Status.Replicas, testRcMaxReplicaCount, "ReplicationController ReplicasSet Scale does not match the expected scale") // Get the ReplicationController + ginkgo.By("fetching ReplicationController; ensuring that it's patched") rc, err := f.ClientSet.CoreV1().ReplicationControllers(testRcNamespace).Get(context.TODO(), testRcName, metav1.GetOptions{}) framework.ExpectNoError(err, "Failed to fetch ReplicationController") framework.ExpectEqual(rc.ObjectMeta.Labels["test-rc"], "patched", "ReplicationController is missing a label from earlier patch") @@ -208,10 +216,12 @@ var _ = SIGDescribe("ReplicationController", func() { rcStatusUpdatePayload.Status.ReadyReplicas = 1 // Replace the ReplicationController's status + ginkgo.By("updating ReplicationController status") rcStatus, err = f.ClientSet.CoreV1().ReplicationControllers(testRcNamespace).UpdateStatus(context.TODO(), rcStatusUpdatePayload, metav1.UpdateOptions{}) framework.ExpectNoError(err, "Failed to update ReplicationControllerStatus") framework.ExpectEqual(rcStatus.Status.ReadyReplicas, int32(1), "ReplicationControllerStatus readyReplicas does not equal 1") + ginkgo.By(fmt.Sprintf("waiting for ReplicationController readyReplicas to be equal to %v", testRcMaxReplicaCount)) for event := range rcWatchChan { rc, ok := event.Object.(*v1.ReplicationController) framework.ExpectEqual(ok, true, "Unable to convert type of ReplicationController watch event") @@ -220,10 +230,12 @@ var _ = SIGDescribe("ReplicationController", func() { } } + ginkgo.By("listing all ReplicationControllers") rcs, err := f.ClientSet.CoreV1().ReplicationControllers("").List(context.TODO(), metav1.ListOptions{LabelSelector: "test-rc-static=true"}) framework.ExpectNoError(err, "Failed to list ReplicationController") framework.ExpectEqual(len(rcs.Items) > 0, true) + ginkgo.By("checking that ReplicationController has expected values") foundRc := false for _, rcItem := range rcs.Items { if rcItem.ObjectMeta.Name == testRcName && @@ -238,9 +250,11 @@ var _ = SIGDescribe("ReplicationController", func() { framework.ExpectEqual(foundRc, true) // Delete ReplicationController + ginkgo.By("deleting ReplicationControllers by collection") err = f.ClientSet.CoreV1().ReplicationControllers(testRcNamespace).DeleteCollection(context.TODO(), &metav1.DeleteOptions{}, metav1.ListOptions{LabelSelector: "test-rc-static=true"}) framework.ExpectNoError(err, "Failed to delete ReplicationControllers") + ginkgo.By("waiting for ReplicationController is have a DeletionTimestamp") for event := range rcWatchChan { rc, ok := event.Object.(*v1.ReplicationController) framework.ExpectEqual(ok, true, "Unable to convert type of ReplicationController watch event") @@ -248,9 +262,11 @@ var _ = SIGDescribe("ReplicationController", func() { break } } + ginkgo.By("waiting for 10 seconds to ensure that it's deleted") time.Sleep(10 * time.Second) // Get the ReplicationController to check that it's deleted + ginkgo.By("fetching the ReplicationController to ensure that it's deleted") _, err = f.ClientSet.CoreV1().ReplicationControllers(testRcNamespace).Get(context.TODO(), testRcName, metav1.GetOptions{}) framework.ExpectError(err, "Failed to delete ReplicationController") }) From 054a886bf960fa5523714ea29aa224956d0756d0 Mon Sep 17 00:00:00 2001 From: Caleb Woodbine Date: Wed, 4 Mar 2020 11:14:03 +1300 Subject: [PATCH 06/13] Remove sleep and final fetch of ReplicationController --- test/e2e/apps/rc.go | 7 ------- 1 file changed, 7 deletions(-) diff --git a/test/e2e/apps/rc.go b/test/e2e/apps/rc.go index abbb0abcef5..f1c8a16edc4 100644 --- a/test/e2e/apps/rc.go +++ b/test/e2e/apps/rc.go @@ -262,13 +262,6 @@ var _ = SIGDescribe("ReplicationController", func() { break } } - ginkgo.By("waiting for 10 seconds to ensure that it's deleted") - time.Sleep(10 * time.Second) - - // Get the ReplicationController to check that it's deleted - ginkgo.By("fetching the ReplicationController to ensure that it's deleted") - _, err = f.ClientSet.CoreV1().ReplicationControllers(testRcNamespace).Get(context.TODO(), testRcName, metav1.GetOptions{}) - framework.ExpectError(err, "Failed to delete ReplicationController") }) }) From c715fec47d2a3450d20fd6c61a0435750b286f87 Mon Sep 17 00:00:00 2001 From: Caleb Woodbine Date: Wed, 4 Mar 2020 13:08:59 +1300 Subject: [PATCH 07/13] Update ReplicationController event watch check --- test/e2e/apps/rc.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/test/e2e/apps/rc.go b/test/e2e/apps/rc.go index f1c8a16edc4..fa2f1ba2355 100644 --- a/test/e2e/apps/rc.go +++ b/test/e2e/apps/rc.go @@ -256,9 +256,7 @@ var _ = SIGDescribe("ReplicationController", func() { ginkgo.By("waiting for ReplicationController is have a DeletionTimestamp") for event := range rcWatchChan { - rc, ok := event.Object.(*v1.ReplicationController) - framework.ExpectEqual(ok, true, "Unable to convert type of ReplicationController watch event") - if rc.ObjectMeta.DeletionTimestamp != nil { + if event.Type == "DELETED" { break } } From 3fa4acb9b7030f5364fc68e4876572cf42239ab5 Mon Sep 17 00:00:00 2001 From: Caleb Woodbine Date: Wed, 4 Mar 2020 14:55:11 +1300 Subject: [PATCH 08/13] Ensure current Replica check is from ReplicationController watch --- test/e2e/apps/rc.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/test/e2e/apps/rc.go b/test/e2e/apps/rc.go index fa2f1ba2355..a7ebadd97f5 100644 --- a/test/e2e/apps/rc.go +++ b/test/e2e/apps/rc.go @@ -192,18 +192,20 @@ var _ = SIGDescribe("ReplicationController", func() { // Patch the ReplicationController's scale ginkgo.By("patching ReplicationController scale") - rcScale, err := f.ClientSet.CoreV1().ReplicationControllers(testRcNamespace).Patch(context.TODO(), testRcName, types.StrategicMergePatchType, []byte(rcScalePatchPayload), metav1.PatchOptions{}, "scale") + _, err = f.ClientSet.CoreV1().ReplicationControllers(testRcNamespace).Patch(context.TODO(), testRcName, types.StrategicMergePatchType, []byte(rcScalePatchPayload), metav1.PatchOptions{}, "scale") framework.ExpectNoError(err, "Failed to patch ReplicationControllerScale") + var rcFromWatch *v1.ReplicationController + ginkgo.By("waiting for ReplicationController's scale to be the max amount") for event := range rcWatchChan { rc, ok := event.Object.(*v1.ReplicationController) framework.ExpectEqual(ok, true, "Unable to convert type of ReplicationController watch event") if rc.Status.Replicas == testRcMaxReplicaCount && rc.Status.ReadyReplicas == testRcMaxReplicaCount { - rcScale = rc + rcFromWatch = rc break } } - framework.ExpectEqual(rcScale.Status.Replicas, testRcMaxReplicaCount, "ReplicationController ReplicasSet Scale does not match the expected scale") + framework.ExpectEqual(rcFromWatch.Status.Replicas, testRcMaxReplicaCount, "ReplicationController ReplicasSet Scale does not match the expected scale") // Get the ReplicationController ginkgo.By("fetching ReplicationController; ensuring that it's patched") From ca3542273cb59e751a3058ce65dc08fe17599c50 Mon Sep 17 00:00:00 2001 From: Caleb Woodbine Date: Wed, 4 Mar 2020 15:44:46 +1300 Subject: [PATCH 09/13] Update Replica count check, undo capitalization for framework.Expect* statements --- test/e2e/apps/rc.go | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/test/e2e/apps/rc.go b/test/e2e/apps/rc.go index a7ebadd97f5..6674797c06b 100644 --- a/test/e2e/apps/rc.go +++ b/test/e2e/apps/rc.go @@ -197,20 +197,23 @@ var _ = SIGDescribe("ReplicationController", func() { var rcFromWatch *v1.ReplicationController ginkgo.By("waiting for ReplicationController's scale to be the max amount") + foundRcWithMaxScale := false for event := range rcWatchChan { rc, ok := event.Object.(*v1.ReplicationController) framework.ExpectEqual(ok, true, "Unable to convert type of ReplicationController watch event") - if rc.Status.Replicas == testRcMaxReplicaCount && rc.Status.ReadyReplicas == testRcMaxReplicaCount { + if rc.ObjectMeta.Name == testRcName && rc.ObjectMeta.Namespace == testRcNamespace && rc.Status.Replicas == testRcMaxReplicaCount && rc.Status.ReadyReplicas == testRcMaxReplicaCount { + foundRcWithMaxScale = true rcFromWatch = rc break } } + framework.ExpectEqual(foundRcWithMaxScale, true, "failed to locate a ReplicationController with max scale") framework.ExpectEqual(rcFromWatch.Status.Replicas, testRcMaxReplicaCount, "ReplicationController ReplicasSet Scale does not match the expected scale") // Get the ReplicationController ginkgo.By("fetching ReplicationController; ensuring that it's patched") rc, err := f.ClientSet.CoreV1().ReplicationControllers(testRcNamespace).Get(context.TODO(), testRcName, metav1.GetOptions{}) - framework.ExpectNoError(err, "Failed to fetch ReplicationController") + framework.ExpectNoError(err, "failed to fetch ReplicationController") framework.ExpectEqual(rc.ObjectMeta.Labels["test-rc"], "patched", "ReplicationController is missing a label from earlier patch") rcStatusUpdatePayload := rc @@ -220,13 +223,13 @@ var _ = SIGDescribe("ReplicationController", func() { // Replace the ReplicationController's status ginkgo.By("updating ReplicationController status") rcStatus, err = f.ClientSet.CoreV1().ReplicationControllers(testRcNamespace).UpdateStatus(context.TODO(), rcStatusUpdatePayload, metav1.UpdateOptions{}) - framework.ExpectNoError(err, "Failed to update ReplicationControllerStatus") + framework.ExpectNoError(err, "failed to update ReplicationControllerStatus") framework.ExpectEqual(rcStatus.Status.ReadyReplicas, int32(1), "ReplicationControllerStatus readyReplicas does not equal 1") ginkgo.By(fmt.Sprintf("waiting for ReplicationController readyReplicas to be equal to %v", testRcMaxReplicaCount)) for event := range rcWatchChan { rc, ok := event.Object.(*v1.ReplicationController) - framework.ExpectEqual(ok, true, "Unable to convert type of ReplicationController watch event") + framework.ExpectEqual(ok, true, "unable to convert type of ReplicationController watch event") if rc.Status.Replicas == testRcMaxReplicaCount && rc.Status.ReadyReplicas == testRcMaxReplicaCount { break } @@ -234,7 +237,7 @@ var _ = SIGDescribe("ReplicationController", func() { ginkgo.By("listing all ReplicationControllers") rcs, err := f.ClientSet.CoreV1().ReplicationControllers("").List(context.TODO(), metav1.ListOptions{LabelSelector: "test-rc-static=true"}) - framework.ExpectNoError(err, "Failed to list ReplicationController") + framework.ExpectNoError(err, "failed to list ReplicationController") framework.ExpectEqual(len(rcs.Items) > 0, true) ginkgo.By("checking that ReplicationController has expected values") From 957ab9afafde1a438372a2fe2345fe442c770619 Mon Sep 17 00:00:00 2001 From: Caleb Woodbine Date: Thu, 5 Mar 2020 09:55:38 +1300 Subject: [PATCH 10/13] Adjust RC watch timeout to 180, update progress log statement --- test/e2e/apps/rc.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/e2e/apps/rc.go b/test/e2e/apps/rc.go index 6674797c06b..1211583505a 100644 --- a/test/e2e/apps/rc.go +++ b/test/e2e/apps/rc.go @@ -134,7 +134,7 @@ var _ = SIGDescribe("ReplicationController", func() { framework.ExpectNoError(err, "Failed to create ReplicationController") // setup a watch for the RC - rcWatchTimeoutSeconds := int64(60) + rcWatchTimeoutSeconds := int64(180) rcWatch, err := f.ClientSet.CoreV1().ReplicationControllers(testRcNamespace).Watch(context.TODO(), metav1.ListOptions{LabelSelector: "test-rc-static=true", TimeoutSeconds: &rcWatchTimeoutSeconds}) framework.ExpectNoError(err, "Failed to setup watch on newly created ReplicationController") @@ -259,7 +259,7 @@ var _ = SIGDescribe("ReplicationController", func() { err = f.ClientSet.CoreV1().ReplicationControllers(testRcNamespace).DeleteCollection(context.TODO(), &metav1.DeleteOptions{}, metav1.ListOptions{LabelSelector: "test-rc-static=true"}) framework.ExpectNoError(err, "Failed to delete ReplicationControllers") - ginkgo.By("waiting for ReplicationController is have a DeletionTimestamp") + ginkgo.By("waiting for ReplicationController to have a DELETED event") for event := range rcWatchChan { if event.Type == "DELETED" { break From 772eacadc19c62fd0897f9319ee71aa02d85884c Mon Sep 17 00:00:00 2001 From: Caleb Woodbine Date: Wed, 25 Mar 2020 10:50:03 +1300 Subject: [PATCH 11/13] Update naming of watchEvents --- test/e2e/apps/rc.go | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/test/e2e/apps/rc.go b/test/e2e/apps/rc.go index 1211583505a..4f1fcaee20c 100644 --- a/test/e2e/apps/rc.go +++ b/test/e2e/apps/rc.go @@ -141,9 +141,9 @@ var _ = SIGDescribe("ReplicationController", func() { rcWatchChan := rcWatch.ResultChan() ginkgo.By("waiting for available Replicas") - for event := range rcWatchChan { - rc, ok := event.Object.(*v1.ReplicationController) - framework.ExpectEqual(ok, true, "Unable to convert type of ReplicationController watch event") + for watchEvent := range rcWatchChan { + rc, ok := watchEvent.Object.(*v1.ReplicationController) + framework.ExpectEqual(ok, true, "Unable to convert type of ReplicationController watch watchEvent") if rc.Status.Replicas == testRcInitialReplicaCount && rc.Status.ReadyReplicas == testRcInitialReplicaCount { break } @@ -198,9 +198,9 @@ var _ = SIGDescribe("ReplicationController", func() { var rcFromWatch *v1.ReplicationController ginkgo.By("waiting for ReplicationController's scale to be the max amount") foundRcWithMaxScale := false - for event := range rcWatchChan { - rc, ok := event.Object.(*v1.ReplicationController) - framework.ExpectEqual(ok, true, "Unable to convert type of ReplicationController watch event") + for watchEvent := range rcWatchChan { + rc, ok := watchEvent.Object.(*v1.ReplicationController) + framework.ExpectEqual(ok, true, "Unable to convert type of ReplicationController watch watchEvent") if rc.ObjectMeta.Name == testRcName && rc.ObjectMeta.Namespace == testRcNamespace && rc.Status.Replicas == testRcMaxReplicaCount && rc.Status.ReadyReplicas == testRcMaxReplicaCount { foundRcWithMaxScale = true rcFromWatch = rc @@ -227,9 +227,9 @@ var _ = SIGDescribe("ReplicationController", func() { framework.ExpectEqual(rcStatus.Status.ReadyReplicas, int32(1), "ReplicationControllerStatus readyReplicas does not equal 1") ginkgo.By(fmt.Sprintf("waiting for ReplicationController readyReplicas to be equal to %v", testRcMaxReplicaCount)) - for event := range rcWatchChan { - rc, ok := event.Object.(*v1.ReplicationController) - framework.ExpectEqual(ok, true, "unable to convert type of ReplicationController watch event") + for watchEvent := range rcWatchChan { + rc, ok := watchEvent.Object.(*v1.ReplicationController) + framework.ExpectEqual(ok, true, "unable to convert type of ReplicationController watch watchEvent") if rc.Status.Replicas == testRcMaxReplicaCount && rc.Status.ReadyReplicas == testRcMaxReplicaCount { break } @@ -259,9 +259,9 @@ var _ = SIGDescribe("ReplicationController", func() { err = f.ClientSet.CoreV1().ReplicationControllers(testRcNamespace).DeleteCollection(context.TODO(), &metav1.DeleteOptions{}, metav1.ListOptions{LabelSelector: "test-rc-static=true"}) framework.ExpectNoError(err, "Failed to delete ReplicationControllers") - ginkgo.By("waiting for ReplicationController to have a DELETED event") - for event := range rcWatchChan { - if event.Type == "DELETED" { + ginkgo.By("waiting for ReplicationController to have a DELETED watchEvent") + for watchEvent := range rcWatchChan { + if watchEvent.Type == "DELETED" { break } } From dacd32887f502f5046694bd46837be833fbdf6af Mon Sep 17 00:00:00 2001 From: Caleb Woodbine Date: Wed, 25 Mar 2020 11:24:14 +1300 Subject: [PATCH 12/13] Update DeleteOptions --- test/e2e/apps/rc.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/e2e/apps/rc.go b/test/e2e/apps/rc.go index 4f1fcaee20c..675774217f0 100644 --- a/test/e2e/apps/rc.go +++ b/test/e2e/apps/rc.go @@ -256,7 +256,7 @@ var _ = SIGDescribe("ReplicationController", func() { // Delete ReplicationController ginkgo.By("deleting ReplicationControllers by collection") - err = f.ClientSet.CoreV1().ReplicationControllers(testRcNamespace).DeleteCollection(context.TODO(), &metav1.DeleteOptions{}, metav1.ListOptions{LabelSelector: "test-rc-static=true"}) + err = f.ClientSet.CoreV1().ReplicationControllers(testRcNamespace).DeleteCollection(context.TODO(), metav1.DeleteOptions{}, metav1.ListOptions{LabelSelector: "test-rc-static=true"}) framework.ExpectNoError(err, "Failed to delete ReplicationControllers") ginkgo.By("waiting for ReplicationController to have a DELETED watchEvent") From 9aa3c23ad36a36a1cae1b57649010e2db3a954f5 Mon Sep 17 00:00:00 2001 From: Caleb Woodbine Date: Wed, 25 Mar 2020 15:10:28 +1300 Subject: [PATCH 13/13] Update DynamicClient fetch of Pod statement --- test/e2e/apps/rc.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/e2e/apps/rc.go b/test/e2e/apps/rc.go index 675774217f0..d92066a196b 100644 --- a/test/e2e/apps/rc.go +++ b/test/e2e/apps/rc.go @@ -175,7 +175,7 @@ var _ = SIGDescribe("ReplicationController", func() { framework.ExpectEqual(rcStatus.Status.ReadyReplicas, int32(0), "ReplicationControllerStatus's readyReplicas does not equal 0") ginkgo.By("fetching ReplicationController status") - rcStatusUnstructured, err := dc.Resource(rcResource).Namespace(testRcNamespace).Get(testRcName, metav1.GetOptions{}, "status") + rcStatusUnstructured, err := dc.Resource(rcResource).Namespace(testRcNamespace).Get(context.TODO(), testRcName, metav1.GetOptions{}, "status") framework.ExpectNoError(err, "Failed to fetch ReplicationControllerStatus") rcStatusUjson, err := json.Marshal(rcStatusUnstructured)