diff --git a/test/e2e/apps/deployment.go b/test/e2e/apps/deployment.go index 490c8a542d3..010a15ba325 100644 --- a/test/e2e/apps/deployment.go +++ b/test/e2e/apps/deployment.go @@ -50,9 +50,10 @@ import ( ) const ( - poll = 2 * time.Second - dRetryPeriod = 2 * time.Second - dRetryTimeout = 5 * time.Minute + poll = 2 * time.Second + pollLongTimeout = 5 * time.Minute + dRetryPeriod = 2 * time.Second + dRetryTimeout = 5 * time.Minute ) var ( @@ -448,7 +449,7 @@ func testRolloverDeployment(f *framework.Framework) { framework.ExpectNoError(err) framework.Logf("Make sure deployment %q performs scaling operations", deploymentName) // Make sure the deployment starts to scale up and down replica sets by checking if its updated replicas >= 1 - err = e2edeploy.WaitForDeploymentUpdatedReplicasGTE(c, ns, deploymentName, deploymentReplicas, deployment.Generation) + err = waitForDeploymentUpdatedReplicasGTE(c, ns, deploymentName, deploymentReplicas, deployment.Generation) // Check if it's updated to revision 1 correctly framework.Logf("Check revision of new replica set for deployment %q", deploymentName) err = checkDeploymentRevisionAndImage(c, ns, deploymentName, "1", deploymentImage) @@ -473,7 +474,7 @@ func testRolloverDeployment(f *framework.Framework) { // Use observedGeneration to determine if the controller noticed the pod template update. framework.Logf("Wait deployment %q to be observed by the deployment controller", deploymentName) - err = e2edeploy.WaitForObservedDeployment(c, ns, deploymentName, deployment.Generation) + err = waitForObservedDeployment(c, ns, deploymentName, deployment.Generation) framework.ExpectNoError(err) // Wait for it to be updated to revision 2 @@ -482,7 +483,7 @@ func testRolloverDeployment(f *framework.Framework) { framework.ExpectNoError(err) framework.Logf("Make sure deployment %q is complete", deploymentName) - err = e2edeploy.WaitForDeploymentCompleteAndCheckRolling(c, deployment) + err = waitForDeploymentCompleteAndCheckRolling(c, deployment) framework.ExpectNoError(err) framework.Logf("Ensure that both old replica sets have no replicas") @@ -623,7 +624,7 @@ func testIterativeDeployments(f *framework.Framework) { } framework.Logf("Waiting for deployment %q to be observed by the controller", deploymentName) - err = e2edeploy.WaitForObservedDeployment(c, ns, deploymentName, deployment.Generation) + err = waitForObservedDeployment(c, ns, deploymentName, deployment.Generation) framework.ExpectNoError(err) framework.Logf("Waiting for deployment %q status", deploymentName) @@ -631,7 +632,7 @@ func testIterativeDeployments(f *framework.Framework) { framework.ExpectNoError(err) framework.Logf("Checking deployment %q for a complete condition", deploymentName) - err = e2edeploy.WaitForDeploymentWithCondition(c, ns, deploymentName, deploymentutil.NewRSAvailableReason, appsv1.DeploymentProgressing) + err = waitForDeploymentWithCondition(c, ns, deploymentName, deploymentutil.NewRSAvailableReason, appsv1.DeploymentProgressing) framework.ExpectNoError(err) } @@ -710,7 +711,7 @@ func testProportionalScalingDeployment(f *framework.Framework) { framework.ExpectNoError(err) framework.Logf("Waiting for observed generation %d", deployment.Generation) - err = e2edeploy.WaitForObservedDeployment(c, ns, deploymentName, deployment.Generation) + err = waitForObservedDeployment(c, ns, deploymentName, deployment.Generation) framework.ExpectNoError(err) // Verify that the required pods have come up. @@ -734,7 +735,7 @@ func testProportionalScalingDeployment(f *framework.Framework) { framework.ExpectNoError(err) framework.Logf("Waiting for observed generation %d", deployment.Generation) - err = e2edeploy.WaitForObservedDeployment(c, ns, deploymentName, deployment.Generation) + err = waitForObservedDeployment(c, ns, deploymentName, deployment.Generation) framework.ExpectNoError(err) // Checking state of first rollout's replicaset. @@ -943,11 +944,11 @@ func testRollingUpdateDeploymentWithLocalTrafficLoadBalancer(f *framework.Framew framework.ExpectNoError(err) framework.Logf("Waiting for observed generation %d", deployment.Generation) - err = e2edeploy.WaitForObservedDeployment(c, ns, name, deployment.Generation) + err = waitForObservedDeployment(c, ns, name, deployment.Generation) framework.ExpectNoError(err) framework.Logf("Make sure deployment %q is complete", name) - err = e2edeploy.WaitForDeploymentCompleteAndCheckRolling(c, deployment) + err = waitForDeploymentCompleteAndCheckRolling(c, deployment) framework.ExpectNoError(err) } @@ -1118,3 +1119,24 @@ func waitForReplicaSetTargetSpecReplicas(c clientset.Interface, replicaSet *apps func checkDeploymentRevisionAndImage(c clientset.Interface, ns, deploymentName, revision, image string) error { return testutil.CheckDeploymentRevisionAndImage(c, ns, deploymentName, revision, image) } + +// waitForObservedDeployment waits for the specified deployment generation. +func waitForObservedDeployment(c clientset.Interface, ns, deploymentName string, desiredGeneration int64) error { + return testutil.WaitForObservedDeployment(c, ns, deploymentName, desiredGeneration) +} + +// waitForDeploymentWithCondition waits for the specified deployment condition. +func waitForDeploymentWithCondition(c clientset.Interface, ns, deploymentName, reason string, condType appsv1.DeploymentConditionType) error { + return testutil.WaitForDeploymentWithCondition(c, ns, deploymentName, reason, condType, framework.Logf, poll, pollLongTimeout) +} + +// waitForDeploymentCompleteAndCheckRolling waits for the deployment to complete, and check rolling update strategy isn't broken at any times. +// Rolling update strategy should not be broken during a rolling update. +func waitForDeploymentCompleteAndCheckRolling(c clientset.Interface, d *appsv1.Deployment) error { + return testutil.WaitForDeploymentCompleteAndCheckRolling(c, d, framework.Logf, poll, pollLongTimeout) +} + +// waitForDeploymentUpdatedReplicasGTE waits for given deployment to be observed by the controller and has at least a number of updatedReplicas +func waitForDeploymentUpdatedReplicasGTE(c clientset.Interface, ns, deploymentName string, minUpdatedReplicas int32, desiredGeneration int64) error { + return testutil.WaitForDeploymentUpdatedReplicasGTE(c, ns, deploymentName, minUpdatedReplicas, desiredGeneration, poll, pollLongTimeout) +} diff --git a/test/e2e/framework/deployment/BUILD b/test/e2e/framework/deployment/BUILD index ed43f6d9f6f..e5aef9109fa 100644 --- a/test/e2e/framework/deployment/BUILD +++ b/test/e2e/framework/deployment/BUILD @@ -15,7 +15,6 @@ go_library( "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//staging/src/k8s.io/client-go/kubernetes:go_default_library", "//test/e2e/framework:go_default_library", "//test/utils:go_default_library", diff --git a/test/e2e/framework/deployment/wait.go b/test/e2e/framework/deployment/wait.go index 8ed9acfa001..92ec7e614c1 100644 --- a/test/e2e/framework/deployment/wait.go +++ b/test/e2e/framework/deployment/wait.go @@ -17,14 +17,10 @@ limitations under the License. package deployment import ( - "fmt" "time" appsv1 "k8s.io/api/apps/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/wait" clientset "k8s.io/client-go/kubernetes" - deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util" "k8s.io/kubernetes/test/e2e/framework" testutils "k8s.io/kubernetes/test/utils" ) @@ -36,16 +32,6 @@ const ( pollLongTimeout = 5 * time.Minute ) -// WaitForObservedDeployment waits for the specified deployment generation. -func WaitForObservedDeployment(c clientset.Interface, ns, deploymentName string, desiredGeneration int64) error { - return testutils.WaitForObservedDeployment(c, ns, deploymentName, desiredGeneration) -} - -// WaitForDeploymentWithCondition waits for the specified deployment condition. -func WaitForDeploymentWithCondition(c clientset.Interface, ns, deploymentName, reason string, condType appsv1.DeploymentConditionType) error { - return testutils.WaitForDeploymentWithCondition(c, ns, deploymentName, reason, condType, framework.Logf, poll, pollLongTimeout) -} - // WaitForDeploymentRevisionAndImage waits for the deployment's and its new RS's revision and container image to match the given revision and image. // Note that deployment revision and its new RS revision should be updated shortly most of the time, but an overwhelmed RS controller // may result in taking longer to relabel a RS. @@ -59,36 +45,3 @@ func WaitForDeploymentRevisionAndImage(c clientset.Interface, ns, deploymentName func WaitForDeploymentComplete(c clientset.Interface, d *appsv1.Deployment) error { return testutils.WaitForDeploymentComplete(c, d, framework.Logf, poll, pollLongTimeout) } - -// WaitForDeploymentCompleteAndCheckRolling waits for the deployment to complete, and check rolling update strategy isn't broken at any times. -// Rolling update strategy should not be broken during a rolling update. -func WaitForDeploymentCompleteAndCheckRolling(c clientset.Interface, d *appsv1.Deployment) error { - return testutils.WaitForDeploymentCompleteAndCheckRolling(c, d, framework.Logf, poll, pollLongTimeout) -} - -// WaitForDeploymentUpdatedReplicasGTE waits for given deployment to be observed by the controller and has at least a number of updatedReplicas -func WaitForDeploymentUpdatedReplicasGTE(c clientset.Interface, ns, deploymentName string, minUpdatedReplicas int32, desiredGeneration int64) error { - return testutils.WaitForDeploymentUpdatedReplicasGTE(c, ns, deploymentName, minUpdatedReplicas, desiredGeneration, poll, pollLongTimeout) -} - -// WaitForDeploymentRollbackCleared waits for given deployment either started rolling back or doesn't need to rollback. -// Note that rollback should be cleared shortly, so we only wait for 1 minute here to fail early. -func WaitForDeploymentRollbackCleared(c clientset.Interface, ns, deploymentName string) error { - return testutils.WaitForDeploymentRollbackCleared(c, ns, deploymentName, poll, pollShortTimeout) -} - -// WaitForDeploymentRevision waits for becoming the target revision of a delopyment. -func WaitForDeploymentRevision(c clientset.Interface, d *appsv1.Deployment, targetRevision string) error { - err := wait.PollImmediate(poll, pollLongTimeout, func() (bool, error) { - deployment, err := c.AppsV1().Deployments(d.Namespace).Get(d.Name, metav1.GetOptions{}) - if err != nil { - return false, err - } - revision := deployment.Annotations[deploymentutil.RevisionAnnotation] - return revision == targetRevision, nil - }) - if err != nil { - return fmt.Errorf("error waiting for revision to become %q for deployment %q: %v", targetRevision, d.Name, err) - } - return nil -} diff --git a/test/e2e/upgrades/apps/deployments.go b/test/e2e/upgrades/apps/deployments.go index 2eacc69057f..16ba1499601 100644 --- a/test/e2e/upgrades/apps/deployments.go +++ b/test/e2e/upgrades/apps/deployments.go @@ -18,10 +18,13 @@ package upgrades import ( "fmt" + "time" appsv1 "k8s.io/api/apps/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/wait" + clientset "k8s.io/client-go/kubernetes" deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util" "k8s.io/kubernetes/test/e2e/framework" e2edeploy "k8s.io/kubernetes/test/e2e/framework/deployment" @@ -33,6 +36,9 @@ import ( const ( deploymentName = "dp" + // poll is how often to poll pods, nodes and claims. + poll = 2 * time.Second + pollLongTimeout = 5 * time.Minute ) // TODO: Test that the deployment stays available during master (and maybe @@ -78,7 +84,7 @@ func (t *DeploymentUpgradeTest) Setup(f *framework.Framework) { t.oldRSUID = rss[0].UID ginkgo.By(fmt.Sprintf("Waiting for revision of the deployment %q to become 1", deploymentName)) - framework.ExpectNoError(e2edeploy.WaitForDeploymentRevision(c, deployment, "1")) + framework.ExpectNoError(waitForDeploymentRevision(c, deployment, "1")) // Trigger a new rollout so that we have some history. ginkgo.By(fmt.Sprintf("Triggering a new rollout for deployment %q", deploymentName)) @@ -109,7 +115,7 @@ func (t *DeploymentUpgradeTest) Setup(f *framework.Framework) { } ginkgo.By(fmt.Sprintf("Waiting for revision of the deployment %q to become 2", deploymentName)) - framework.ExpectNoError(e2edeploy.WaitForDeploymentRevision(c, deployment, "2")) + framework.ExpectNoError(waitForDeploymentRevision(c, deployment, "2")) t.oldDeploymentUID = deployment.UID } @@ -171,3 +177,19 @@ func (t *DeploymentUpgradeTest) Test(f *framework.Framework, done <-chan struct{ func (t *DeploymentUpgradeTest) Teardown(f *framework.Framework) { // rely on the namespace deletion to clean up everything } + +// waitForDeploymentRevision waits for becoming the target revision of a delopyment. +func waitForDeploymentRevision(c clientset.Interface, d *appsv1.Deployment, targetRevision string) error { + err := wait.PollImmediate(poll, pollLongTimeout, func() (bool, error) { + deployment, err := c.AppsV1().Deployments(d.Namespace).Get(d.Name, metav1.GetOptions{}) + if err != nil { + return false, err + } + revision := deployment.Annotations[deploymentutil.RevisionAnnotation] + return revision == targetRevision, nil + }) + if err != nil { + return fmt.Errorf("error waiting for revision to become %q for deployment %q: %v", targetRevision, d.Name, err) + } + return nil +}