test/integration: Use apps/v1 Deployment/ReplicaSet.

This must be done at the same time as the controller update,
since they share code.
This commit is contained in:
Anthony Yeh 2018-03-20 10:20:43 -07:00
parent a6a5190494
commit 680bc4b4b5
No known key found for this signature in database
GPG Key ID: 339F46A383E6ED08
4 changed files with 143 additions and 158 deletions

View File

@ -19,8 +19,8 @@ go_test(
"//pkg/controller/deployment/util:go_default_library", "//pkg/controller/deployment/util:go_default_library",
"//pkg/util/pointer:go_default_library", "//pkg/util/pointer:go_default_library",
"//test/integration/framework:go_default_library", "//test/integration/framework:go_default_library",
"//vendor/k8s.io/api/apps/v1:go_default_library",
"//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library",
"//vendor/k8s.io/api/extensions/v1beta1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/uuid:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/uuid:go_default_library",
@ -41,6 +41,7 @@ go_library(
"//pkg/util/metrics:go_default_library", "//pkg/util/metrics:go_default_library",
"//test/integration/framework:go_default_library", "//test/integration/framework:go_default_library",
"//test/utils:go_default_library", "//test/utils:go_default_library",
"//vendor/k8s.io/api/apps/v1:go_default_library",
"//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library",
"//vendor/k8s.io/api/extensions/v1beta1:go_default_library", "//vendor/k8s.io/api/extensions/v1beta1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",

View File

@ -22,8 +22,8 @@ import (
"strings" "strings"
"testing" "testing"
apps "k8s.io/api/apps/v1"
"k8s.io/api/core/v1" "k8s.io/api/core/v1"
"k8s.io/api/extensions/v1beta1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/intstr"
"k8s.io/apimachinery/pkg/util/uuid" "k8s.io/apimachinery/pkg/util/uuid"
@ -47,7 +47,7 @@ func TestNewDeployment(t *testing.T) {
tester.deployment.Annotations = map[string]string{"test": "should-copy-to-replica-set", v1.LastAppliedConfigAnnotation: "should-not-copy-to-replica-set"} tester.deployment.Annotations = map[string]string{"test": "should-copy-to-replica-set", v1.LastAppliedConfigAnnotation: "should-not-copy-to-replica-set"}
var err error var err error
tester.deployment, err = c.ExtensionsV1beta1().Deployments(ns.Name).Create(tester.deployment) tester.deployment, err = c.AppsV1().Deployments(ns.Name).Create(tester.deployment)
if err != nil { if err != nil {
t.Fatalf("failed to create deployment %s: %v", tester.deployment.Name, err) t.Fatalf("failed to create deployment %s: %v", tester.deployment.Name, err)
} }
@ -128,14 +128,14 @@ func TestDeploymentRollingUpdate(t *testing.T) {
tester := &deploymentTester{t: t, c: c, deployment: newDeployment(name, ns.Name, replicas)} tester := &deploymentTester{t: t, c: c, deployment: newDeployment(name, ns.Name, replicas)}
tester.deployment.Spec.MinReadySeconds = 4 tester.deployment.Spec.MinReadySeconds = 4
quarter := intstr.FromString("25%") quarter := intstr.FromString("25%")
tester.deployment.Spec.Strategy.RollingUpdate = &v1beta1.RollingUpdateDeployment{ tester.deployment.Spec.Strategy.RollingUpdate = &apps.RollingUpdateDeployment{
MaxUnavailable: &quarter, MaxUnavailable: &quarter,
MaxSurge: &quarter, MaxSurge: &quarter,
} }
// Create a deployment. // Create a deployment.
var err error var err error
tester.deployment, err = c.ExtensionsV1beta1().Deployments(ns.Name).Create(tester.deployment) tester.deployment, err = c.AppsV1().Deployments(ns.Name).Create(tester.deployment)
if err != nil { if err != nil {
t.Fatalf("failed to create deployment %s: %v", tester.deployment.Name, err) t.Fatalf("failed to create deployment %s: %v", tester.deployment.Name, err)
} }
@ -152,7 +152,7 @@ func TestDeploymentRollingUpdate(t *testing.T) {
if oriImage == image { if oriImage == image {
t.Fatalf("bad test setup, deployment %s roll out with the same image", tester.deployment.Name) t.Fatalf("bad test setup, deployment %s roll out with the same image", tester.deployment.Name)
} }
imageFn := func(update *v1beta1.Deployment) { imageFn := func(update *apps.Deployment) {
update.Spec.Template.Spec.Containers[0].Image = image update.Spec.Template.Spec.Containers[0].Image = image
} }
tester.deployment, err = tester.updateDeployment(imageFn) tester.deployment, err = tester.updateDeployment(imageFn)
@ -186,7 +186,7 @@ func TestDeploymentRollingUpdate(t *testing.T) {
// 3. Roll over a deployment before the previous rolling update finishes. // 3. Roll over a deployment before the previous rolling update finishes.
image = "dont-finish" image = "dont-finish"
imageFn = func(update *v1beta1.Deployment) { imageFn = func(update *apps.Deployment) {
update.Spec.Template.Spec.Containers[0].Image = image update.Spec.Template.Spec.Containers[0].Image = image
} }
tester.deployment, err = tester.updateDeployment(imageFn) tester.deployment, err = tester.updateDeployment(imageFn)
@ -199,7 +199,7 @@ func TestDeploymentRollingUpdate(t *testing.T) {
// We don't mark pods as ready so that rollout won't finish. // We don't mark pods as ready so that rollout won't finish.
// Before the rollout finishes, trigger another rollout. // Before the rollout finishes, trigger another rollout.
image = "rollover" image = "rollover"
imageFn = func(update *v1beta1.Deployment) { imageFn = func(update *apps.Deployment) {
update.Spec.Template.Spec.Containers[0].Image = image update.Spec.Template.Spec.Containers[0].Image = image
} }
tester.deployment, err = tester.updateDeployment(imageFn) tester.deployment, err = tester.updateDeployment(imageFn)
@ -212,7 +212,7 @@ func TestDeploymentRollingUpdate(t *testing.T) {
if err := tester.waitForDeploymentCompleteAndCheckRollingAndMarkPodsReady(); err != nil { if err := tester.waitForDeploymentCompleteAndCheckRollingAndMarkPodsReady(); err != nil {
t.Fatal(err) t.Fatal(err)
} }
_, allOldRSs, err := deploymentutil.GetOldReplicaSets(tester.deployment, c.ExtensionsV1beta1()) _, allOldRSs, err := deploymentutil.GetOldReplicaSets(tester.deployment, c.AppsV1())
if err != nil { if err != nil {
t.Fatalf("failed retrieving old replicasets of deployment %s: %v", tester.deployment.Name, err) t.Fatalf("failed retrieving old replicasets of deployment %s: %v", tester.deployment.Name, err)
} }
@ -232,13 +232,18 @@ func TestDeploymentSelectorImmutability(t *testing.T) {
defer framework.DeleteTestingNamespace(ns, s, t) defer framework.DeleteTestingNamespace(ns, s, t)
tester := &deploymentTester{t: t, c: c, deployment: newDeployment(name, ns.Name, int32(20))} tester := &deploymentTester{t: t, c: c, deployment: newDeployment(name, ns.Name, int32(20))}
deploymentExtensionsV1beta1, err := c.ExtensionsV1beta1().Deployments(ns.Name).Create(tester.deployment) var err error
tester.deployment, err = c.AppsV1().Deployments(ns.Name).Create(tester.deployment)
if err != nil { if err != nil {
t.Fatalf("failed to create extensions/v1beta1 deployment %s: %v", tester.deployment.Name, err) t.Fatalf("failed to create apps/v1 deployment %s: %v", tester.deployment.Name, err)
} }
// test to ensure extensions/v1beta1 selector is mutable // test to ensure extensions/v1beta1 selector is mutable
newSelectorLabels := map[string]string{"name_extensions_v1beta1": "test_extensions_v1beta1"} newSelectorLabels := map[string]string{"name_extensions_v1beta1": "test_extensions_v1beta1"}
deploymentExtensionsV1beta1, err := c.ExtensionsV1beta1().Deployments(ns.Name).Get(name, metav1.GetOptions{})
if err != nil {
t.Fatalf("failed to get extensions/v1beta deployment %s: %v", name, err)
}
deploymentExtensionsV1beta1.Spec.Selector.MatchLabels = newSelectorLabels deploymentExtensionsV1beta1.Spec.Selector.MatchLabels = newSelectorLabels
deploymentExtensionsV1beta1.Spec.Template.Labels = newSelectorLabels deploymentExtensionsV1beta1.Spec.Template.Labels = newSelectorLabels
updatedDeploymentExtensionsV1beta1, err := c.ExtensionsV1beta1().Deployments(ns.Name).Update(deploymentExtensionsV1beta1) updatedDeploymentExtensionsV1beta1, err := c.ExtensionsV1beta1().Deployments(ns.Name).Update(deploymentExtensionsV1beta1)
@ -283,6 +288,22 @@ func TestDeploymentSelectorImmutability(t *testing.T) {
if !strings.Contains(err.Error(), expectedErrType) || !strings.Contains(err.Error(), expectedErrDetail) { if !strings.Contains(err.Error(), expectedErrType) || !strings.Contains(err.Error(), expectedErrDetail) {
t.Errorf("error message does not match, expected type: %s, expected detail: %s, got: %s", expectedErrType, expectedErrDetail, err.Error()) t.Errorf("error message does not match, expected type: %s, expected detail: %s, got: %s", expectedErrType, expectedErrDetail, err.Error())
} }
// test to ensure apps/v1 selector is immutable
deploymentAppsV1, err := c.AppsV1().Deployments(ns.Name).Get(updatedDeploymentAppsV1beta1.Name, metav1.GetOptions{})
if err != nil {
t.Fatalf("failed to get apps/v1 deployment %s: %v", updatedDeploymentAppsV1beta1.Name, err)
}
newSelectorLabels = map[string]string{"name_apps_v1": "test_apps_v1"}
deploymentAppsV1.Spec.Selector.MatchLabels = newSelectorLabels
deploymentAppsV1.Spec.Template.Labels = newSelectorLabels
_, err = c.AppsV1().Deployments(ns.Name).Update(deploymentAppsV1)
if err == nil {
t.Fatalf("failed to provide validation error when changing immutable selector when updating apps/v1 deployment %s", deploymentAppsV1.Name)
}
if !strings.Contains(err.Error(), expectedErrType) || !strings.Contains(err.Error(), expectedErrDetail) {
t.Errorf("error message does not match, expected type: %s, expected detail: %s, got: %s", expectedErrType, expectedErrDetail, err.Error())
}
} }
// Paused deployment should not start new rollout // Paused deployment should not start new rollout
@ -300,7 +321,7 @@ func TestPausedDeployment(t *testing.T) {
tester.deployment.Spec.Template.Spec.TerminationGracePeriodSeconds = &tgps tester.deployment.Spec.Template.Spec.TerminationGracePeriodSeconds = &tgps
var err error var err error
tester.deployment, err = c.ExtensionsV1beta1().Deployments(ns.Name).Create(tester.deployment) tester.deployment, err = c.AppsV1().Deployments(ns.Name).Create(tester.deployment)
if err != nil { if err != nil {
t.Fatalf("failed to create deployment %s: %v", tester.deployment.Name, err) t.Fatalf("failed to create deployment %s: %v", tester.deployment.Name, err)
} }
@ -358,7 +379,7 @@ func TestPausedDeployment(t *testing.T) {
// Update the deployment template // Update the deployment template
newTGPS := int64(0) newTGPS := int64(0)
tester.deployment, err = tester.updateDeployment(func(update *v1beta1.Deployment) { tester.deployment, err = tester.updateDeployment(func(update *apps.Deployment) {
update.Spec.Template.Spec.TerminationGracePeriodSeconds = &newTGPS update.Spec.Template.Spec.TerminationGracePeriodSeconds = &newTGPS
}) })
if err != nil { if err != nil {
@ -375,7 +396,7 @@ func TestPausedDeployment(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
_, allOldRs, err := deploymentutil.GetOldReplicaSets(tester.deployment, c.ExtensionsV1beta1()) _, allOldRs, err := deploymentutil.GetOldReplicaSets(tester.deployment, c.AppsV1())
if err != nil { if err != nil {
t.Fatalf("failed retrieving old replicasets of deployment %s: %v", tester.deployment.Name, err) t.Fatalf("failed retrieving old replicasets of deployment %s: %v", tester.deployment.Name, err)
} }
@ -401,7 +422,7 @@ func TestScalePausedDeployment(t *testing.T) {
tester.deployment.Spec.Template.Spec.TerminationGracePeriodSeconds = &tgps tester.deployment.Spec.Template.Spec.TerminationGracePeriodSeconds = &tgps
var err error var err error
tester.deployment, err = c.ExtensionsV1beta1().Deployments(ns.Name).Create(tester.deployment) tester.deployment, err = c.AppsV1().Deployments(ns.Name).Create(tester.deployment)
if err != nil { if err != nil {
t.Fatalf("failed to create deployment %s: %v", tester.deployment.Name, err) t.Fatalf("failed to create deployment %s: %v", tester.deployment.Name, err)
} }
@ -442,7 +463,7 @@ func TestScalePausedDeployment(t *testing.T) {
// Scale the paused deployment. // Scale the paused deployment.
newReplicas := int32(10) newReplicas := int32(10)
tester.deployment, err = tester.updateDeployment(func(update *v1beta1.Deployment) { tester.deployment, err = tester.updateDeployment(func(update *apps.Deployment) {
update.Spec.Replicas = &newReplicas update.Spec.Replicas = &newReplicas
}) })
if err != nil { if err != nil {
@ -482,7 +503,7 @@ func TestDeploymentHashCollision(t *testing.T) {
tester := &deploymentTester{t: t, c: c, deployment: newDeployment(name, ns.Name, replicas)} tester := &deploymentTester{t: t, c: c, deployment: newDeployment(name, ns.Name, replicas)}
var err error var err error
tester.deployment, err = c.ExtensionsV1beta1().Deployments(ns.Name).Create(tester.deployment) tester.deployment, err = c.AppsV1().Deployments(ns.Name).Create(tester.deployment)
if err != nil { if err != nil {
t.Fatalf("failed to create deployment %s: %v", tester.deployment.Name, err) t.Fatalf("failed to create deployment %s: %v", tester.deployment.Name, err)
} }
@ -500,14 +521,14 @@ func TestDeploymentHashCollision(t *testing.T) {
} }
// Mock a hash collision // Mock a hash collision
newRS, err := deploymentutil.GetNewReplicaSet(tester.deployment, c.ExtensionsV1beta1()) newRS, err := deploymentutil.GetNewReplicaSet(tester.deployment, c.AppsV1())
if err != nil { if err != nil {
t.Fatalf("failed getting new replicaset of deployment %s: %v", tester.deployment.Name, err) t.Fatalf("failed getting new replicaset of deployment %s: %v", tester.deployment.Name, err)
} }
if newRS == nil { if newRS == nil {
t.Fatalf("unable to find new replicaset of deployment %s", tester.deployment.Name) t.Fatalf("unable to find new replicaset of deployment %s", tester.deployment.Name)
} }
_, err = tester.updateReplicaSet(newRS.Name, func(update *v1beta1.ReplicaSet) { _, err = tester.updateReplicaSet(newRS.Name, func(update *apps.ReplicaSet) {
*update.Spec.Template.Spec.TerminationGracePeriodSeconds = int64(5) *update.Spec.Template.Spec.TerminationGracePeriodSeconds = int64(5)
}) })
if err != nil { if err != nil {
@ -516,7 +537,7 @@ func TestDeploymentHashCollision(t *testing.T) {
// Expect deployment collision counter to increment // Expect deployment collision counter to increment
if err := wait.PollImmediate(pollInterval, pollTimeout, func() (bool, error) { if err := wait.PollImmediate(pollInterval, pollTimeout, func() (bool, error) {
d, err := c.ExtensionsV1beta1().Deployments(ns.Name).Get(tester.deployment.Name, metav1.GetOptions{}) d, err := c.AppsV1().Deployments(ns.Name).Get(tester.deployment.Name, metav1.GetOptions{})
if err != nil { if err != nil {
return false, nil return false, nil
} }
@ -546,7 +567,7 @@ func TestRollbackDeploymentRSNoRevision(t *testing.T) {
rs.Annotations = make(map[string]string) rs.Annotations = make(map[string]string)
rs.Annotations["make"] = "difference" rs.Annotations["make"] = "difference"
rs.Spec.Template.Spec.Containers[0].Image = "different-image" rs.Spec.Template.Spec.Containers[0].Image = "different-image"
_, err := c.ExtensionsV1beta1().ReplicaSets(ns.Name).Create(rs) _, err := c.AppsV1().ReplicaSets(ns.Name).Create(rs)
if err != nil { if err != nil {
t.Fatalf("failed to create replicaset %s: %v", rsName, err) t.Fatalf("failed to create replicaset %s: %v", rsName, err)
} }
@ -554,9 +575,13 @@ func TestRollbackDeploymentRSNoRevision(t *testing.T) {
replicas := int32(1) replicas := int32(1)
tester := &deploymentTester{t: t, c: c, deployment: newDeployment(name, ns.Name, replicas)} tester := &deploymentTester{t: t, c: c, deployment: newDeployment(name, ns.Name, replicas)}
oriImage := tester.deployment.Spec.Template.Spec.Containers[0].Image oriImage := tester.deployment.Spec.Template.Spec.Containers[0].Image
// Set absolute rollout limits (defaults changed to percentages)
max := intstr.FromInt(1)
tester.deployment.Spec.Strategy.RollingUpdate.MaxUnavailable = &max
tester.deployment.Spec.Strategy.RollingUpdate.MaxSurge = &max
// Create a deployment which have different template than the replica set created above. // Create a deployment which have different template than the replica set created above.
if tester.deployment, err = c.ExtensionsV1beta1().Deployments(ns.Name).Create(tester.deployment); err != nil { if tester.deployment, err = c.AppsV1().Deployments(ns.Name).Create(tester.deployment); err != nil {
t.Fatalf("failed to create deployment %s: %v", tester.deployment.Name, err) t.Fatalf("failed to create deployment %s: %v", tester.deployment.Name, err)
} }
@ -595,7 +620,7 @@ func TestRollbackDeploymentRSNoRevision(t *testing.T) {
// 2. Update the deployment to revision 2. // 2. Update the deployment to revision 2.
updatedImage := "update" updatedImage := "update"
tester.deployment, err = tester.updateDeployment(func(update *v1beta1.Deployment) { tester.deployment, err = tester.updateDeployment(func(update *apps.Deployment) {
update.Spec.Template.Spec.Containers[0].Name = updatedImage update.Spec.Template.Spec.Containers[0].Name = updatedImage
update.Spec.Template.Spec.Containers[0].Image = updatedImage update.Spec.Template.Spec.Containers[0].Image = updatedImage
}) })
@ -644,10 +669,10 @@ func TestRollbackDeploymentRSNoRevision(t *testing.T) {
} }
} }
func checkRSHashLabels(rs *v1beta1.ReplicaSet) (string, error) { func checkRSHashLabels(rs *apps.ReplicaSet) (string, error) {
hash := rs.Labels[v1beta1.DefaultDeploymentUniqueLabelKey] hash := rs.Labels[apps.DefaultDeploymentUniqueLabelKey]
selectorHash := rs.Spec.Selector.MatchLabels[v1beta1.DefaultDeploymentUniqueLabelKey] selectorHash := rs.Spec.Selector.MatchLabels[apps.DefaultDeploymentUniqueLabelKey]
templateLabelHash := rs.Spec.Template.Labels[v1beta1.DefaultDeploymentUniqueLabelKey] templateLabelHash := rs.Spec.Template.Labels[apps.DefaultDeploymentUniqueLabelKey]
if hash != selectorHash || selectorHash != templateLabelHash { if hash != selectorHash || selectorHash != templateLabelHash {
return "", fmt.Errorf("mismatching hash value found in replicaset %s: %#v", rs.Name, rs) return "", fmt.Errorf("mismatching hash value found in replicaset %s: %#v", rs.Name, rs)
@ -665,7 +690,7 @@ func checkPodsHashLabel(pods *v1.PodList) (string, error) {
} }
var hash string var hash string
for _, pod := range pods.Items { for _, pod := range pods.Items {
podHash := pod.Labels[v1beta1.DefaultDeploymentUniqueLabelKey] podHash := pod.Labels[apps.DefaultDeploymentUniqueLabelKey]
if len(podHash) == 0 { if len(podHash) == 0 {
return "", fmt.Errorf("found pod %s missing pod-template-hash label: %#v", pod.Name, pods) return "", fmt.Errorf("found pod %s missing pod-template-hash label: %#v", pod.Name, pods)
} }
@ -694,7 +719,7 @@ func TestFailedDeployment(t *testing.T) {
tester := &deploymentTester{t: t, c: c, deployment: newDeployment(deploymentName, ns.Name, replicas)} tester := &deploymentTester{t: t, c: c, deployment: newDeployment(deploymentName, ns.Name, replicas)}
tester.deployment.Spec.ProgressDeadlineSeconds = &three tester.deployment.Spec.ProgressDeadlineSeconds = &three
var err error var err error
tester.deployment, err = c.ExtensionsV1beta1().Deployments(ns.Name).Create(tester.deployment) tester.deployment, err = c.AppsV1().Deployments(ns.Name).Create(tester.deployment)
if err != nil { if err != nil {
t.Fatalf("failed to create deployment %q: %v", deploymentName, err) t.Fatalf("failed to create deployment %q: %v", deploymentName, err)
} }
@ -712,7 +737,7 @@ func TestFailedDeployment(t *testing.T) {
// Pods are not marked as Ready, therefore the deployment progress will eventually timeout after progressDeadlineSeconds has passed. // Pods are not marked as Ready, therefore the deployment progress will eventually timeout after progressDeadlineSeconds has passed.
// Wait for the deployment to have a progress timeout condition. // Wait for the deployment to have a progress timeout condition.
if err = tester.waitForDeploymentWithCondition(deploymentutil.TimedOutReason, v1beta1.DeploymentProgressing); err != nil { if err = tester.waitForDeploymentWithCondition(deploymentutil.TimedOutReason, apps.DeploymentProgressing); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -722,7 +747,7 @@ func TestFailedDeployment(t *testing.T) {
} }
// Wait for the deployment to have a progress complete condition. // Wait for the deployment to have a progress complete condition.
if err = tester.waitForDeploymentWithCondition(deploymentutil.NewRSAvailableReason, v1beta1.DeploymentProgressing); err != nil { if err = tester.waitForDeploymentWithCondition(deploymentutil.NewRSAvailableReason, apps.DeploymentProgressing); err != nil {
t.Fatal(err) t.Fatal(err)
} }
} }
@ -750,9 +775,9 @@ func TestOverlappingDeployments(t *testing.T) {
// Create 2 deployments with overlapping selectors // Create 2 deployments with overlapping selectors
var err error var err error
var rss []*v1beta1.ReplicaSet var rss []*apps.ReplicaSet
for _, tester := range testers { for _, tester := range testers {
tester.deployment, err = c.ExtensionsV1beta1().Deployments(ns.Name).Create(tester.deployment) tester.deployment, err = c.AppsV1().Deployments(ns.Name).Create(tester.deployment)
dname := tester.deployment.Name dname := tester.deployment.Name
if err != nil { if err != nil {
t.Fatalf("failed to create deployment %q: %v", dname, err) t.Fatalf("failed to create deployment %q: %v", dname, err)
@ -784,7 +809,7 @@ func TestOverlappingDeployments(t *testing.T) {
// Scale only the first deployment by 1 // Scale only the first deployment by 1
newReplicas := replicas + 1 newReplicas := replicas + 1
testers[0].deployment, err = testers[0].updateDeployment(func(update *v1beta1.Deployment) { testers[0].deployment, err = testers[0].updateDeployment(func(update *apps.Deployment) {
update.Spec.Replicas = &newReplicas update.Spec.Replicas = &newReplicas
}) })
if err != nil { if err != nil {
@ -798,7 +823,7 @@ func TestOverlappingDeployments(t *testing.T) {
// Verify replicaset of both deployments has updated number of replicas // Verify replicaset of both deployments has updated number of replicas
for i, tester := range testers { for i, tester := range testers {
rs, err := c.ExtensionsV1beta1().ReplicaSets(ns.Name).Get(rss[i].Name, metav1.GetOptions{}) rs, err := c.AppsV1().ReplicaSets(ns.Name).Get(rss[i].Name, metav1.GetOptions{})
if err != nil { if err != nil {
t.Fatalf("failed to get replicaset %q: %v", rss[i].Name, err) t.Fatalf("failed to get replicaset %q: %v", rss[i].Name, err)
} }
@ -828,7 +853,7 @@ func TestScaledRolloutDeployment(t *testing.T) {
tester := &deploymentTester{t: t, c: c, deployment: newDeployment(name, ns.Name, replicas)} tester := &deploymentTester{t: t, c: c, deployment: newDeployment(name, ns.Name, replicas)}
tester.deployment.Spec.Strategy.RollingUpdate.MaxSurge = intOrStrP(3) tester.deployment.Spec.Strategy.RollingUpdate.MaxSurge = intOrStrP(3)
tester.deployment.Spec.Strategy.RollingUpdate.MaxUnavailable = intOrStrP(2) tester.deployment.Spec.Strategy.RollingUpdate.MaxUnavailable = intOrStrP(2)
tester.deployment, err = c.ExtensionsV1beta1().Deployments(ns.Name).Create(tester.deployment) tester.deployment, err = c.AppsV1().Deployments(ns.Name).Create(tester.deployment)
if err != nil { if err != nil {
t.Fatalf("failed to create deployment %q: %v", name, err) t.Fatalf("failed to create deployment %q: %v", name, err)
} }
@ -847,7 +872,7 @@ func TestScaledRolloutDeployment(t *testing.T) {
// Update the deployment with another new image but do not mark the pods as ready to block new replicaset // Update the deployment with another new image but do not mark the pods as ready to block new replicaset
fakeImage2 := "fakeimage2" fakeImage2 := "fakeimage2"
tester.deployment, err = tester.updateDeployment(func(update *v1beta1.Deployment) { tester.deployment, err = tester.updateDeployment(func(update *apps.Deployment) {
update.Spec.Template.Spec.Containers[0].Image = fakeImage2 update.Spec.Template.Spec.Containers[0].Image = fakeImage2
}) })
if err != nil { if err != nil {
@ -858,7 +883,7 @@ func TestScaledRolloutDeployment(t *testing.T) {
} }
// Verify the deployment has minimum available replicas after 2nd rollout // Verify the deployment has minimum available replicas after 2nd rollout
tester.deployment, err = c.ExtensionsV1beta1().Deployments(ns.Name).Get(name, metav1.GetOptions{}) tester.deployment, err = c.AppsV1().Deployments(ns.Name).Get(name, metav1.GetOptions{})
if err != nil { if err != nil {
t.Fatalf("failed to get deployment %q: %v", name, err) t.Fatalf("failed to get deployment %q: %v", name, err)
} }
@ -868,7 +893,7 @@ func TestScaledRolloutDeployment(t *testing.T) {
} }
// Wait for old replicaset of 1st rollout to have desired replicas // Wait for old replicaset of 1st rollout to have desired replicas
firstRS, err = c.ExtensionsV1beta1().ReplicaSets(ns.Name).Get(firstRS.Name, metav1.GetOptions{}) firstRS, err = c.AppsV1().ReplicaSets(ns.Name).Get(firstRS.Name, metav1.GetOptions{})
if err != nil { if err != nil {
t.Fatalf("failed to get replicaset %q: %v", firstRS.Name, err) t.Fatalf("failed to get replicaset %q: %v", firstRS.Name, err)
} }
@ -888,7 +913,7 @@ func TestScaledRolloutDeployment(t *testing.T) {
// Scale up the deployment and update its image to another new image simultaneously (this time marks all pods as ready) // Scale up the deployment and update its image to another new image simultaneously (this time marks all pods as ready)
newReplicas := int32(20) newReplicas := int32(20)
fakeImage3 := "fakeimage3" fakeImage3 := "fakeimage3"
tester.deployment, err = tester.updateDeployment(func(update *v1beta1.Deployment) { tester.deployment, err = tester.updateDeployment(func(update *apps.Deployment) {
update.Spec.Replicas = &newReplicas update.Spec.Replicas = &newReplicas
update.Spec.Template.Spec.Containers[0].Image = fakeImage3 update.Spec.Template.Spec.Containers[0].Image = fakeImage3
}) })
@ -903,13 +928,13 @@ func TestScaledRolloutDeployment(t *testing.T) {
} }
// Verify every replicaset has correct desiredReplicas annotation after 3rd rollout // Verify every replicaset has correct desiredReplicas annotation after 3rd rollout
thirdRS, err := deploymentutil.GetNewReplicaSet(tester.deployment, c.ExtensionsV1beta1()) thirdRS, err := deploymentutil.GetNewReplicaSet(tester.deployment, c.AppsV1())
if err != nil { if err != nil {
t.Fatalf("failed getting new revision 3 replicaset for deployment %q: %v", name, err) t.Fatalf("failed getting new revision 3 replicaset for deployment %q: %v", name, err)
} }
rss := []*v1beta1.ReplicaSet{firstRS, secondRS, thirdRS} rss := []*apps.ReplicaSet{firstRS, secondRS, thirdRS}
for _, curRS := range rss { for _, curRS := range rss {
curRS, err = c.ExtensionsV1beta1().ReplicaSets(ns.Name).Get(curRS.Name, metav1.GetOptions{}) curRS, err = c.AppsV1().ReplicaSets(ns.Name).Get(curRS.Name, metav1.GetOptions{})
if err != nil { if err != nil {
t.Fatalf("failed to get replicaset when checking desired replicas annotation: %v", err) t.Fatalf("failed to get replicaset when checking desired replicas annotation: %v", err)
} }
@ -924,7 +949,7 @@ func TestScaledRolloutDeployment(t *testing.T) {
// Update the deployment with another new image but do not mark the pods as ready to block new replicaset // Update the deployment with another new image but do not mark the pods as ready to block new replicaset
fakeImage4 := "fakeimage4" fakeImage4 := "fakeimage4"
tester.deployment, err = tester.updateDeployment(func(update *v1beta1.Deployment) { tester.deployment, err = tester.updateDeployment(func(update *apps.Deployment) {
update.Spec.Template.Spec.Containers[0].Image = fakeImage4 update.Spec.Template.Spec.Containers[0].Image = fakeImage4
}) })
if err != nil { if err != nil {
@ -935,7 +960,7 @@ func TestScaledRolloutDeployment(t *testing.T) {
} }
// Verify the deployment has minimum available replicas after 4th rollout // Verify the deployment has minimum available replicas after 4th rollout
tester.deployment, err = c.ExtensionsV1beta1().Deployments(ns.Name).Get(name, metav1.GetOptions{}) tester.deployment, err = c.AppsV1().Deployments(ns.Name).Get(name, metav1.GetOptions{})
if err != nil { if err != nil {
t.Fatalf("failed to get deployment %q: %v", name, err) t.Fatalf("failed to get deployment %q: %v", name, err)
} }
@ -945,7 +970,7 @@ func TestScaledRolloutDeployment(t *testing.T) {
} }
// Wait for old replicaset of 3rd rollout to have desired replicas // Wait for old replicaset of 3rd rollout to have desired replicas
thirdRS, err = c.ExtensionsV1beta1().ReplicaSets(ns.Name).Get(thirdRS.Name, metav1.GetOptions{}) thirdRS, err = c.AppsV1().ReplicaSets(ns.Name).Get(thirdRS.Name, metav1.GetOptions{})
if err != nil { if err != nil {
t.Fatalf("failed to get replicaset %q: %v", thirdRS.Name, err) t.Fatalf("failed to get replicaset %q: %v", thirdRS.Name, err)
} }
@ -965,7 +990,7 @@ func TestScaledRolloutDeployment(t *testing.T) {
// Scale down the deployment and update its image to another new image simultaneously (this time marks all pods as ready) // Scale down the deployment and update its image to another new image simultaneously (this time marks all pods as ready)
newReplicas = int32(5) newReplicas = int32(5)
fakeImage5 := "fakeimage5" fakeImage5 := "fakeimage5"
tester.deployment, err = tester.updateDeployment(func(update *v1beta1.Deployment) { tester.deployment, err = tester.updateDeployment(func(update *apps.Deployment) {
update.Spec.Replicas = &newReplicas update.Spec.Replicas = &newReplicas
update.Spec.Template.Spec.Containers[0].Image = fakeImage5 update.Spec.Template.Spec.Containers[0].Image = fakeImage5
}) })
@ -980,13 +1005,13 @@ func TestScaledRolloutDeployment(t *testing.T) {
} }
// Verify every replicaset has correct desiredReplicas annotation after 5th rollout // Verify every replicaset has correct desiredReplicas annotation after 5th rollout
fifthRS, err := deploymentutil.GetNewReplicaSet(tester.deployment, c.ExtensionsV1beta1()) fifthRS, err := deploymentutil.GetNewReplicaSet(tester.deployment, c.AppsV1())
if err != nil { if err != nil {
t.Fatalf("failed getting new revision 5 replicaset for deployment %q: %v", name, err) t.Fatalf("failed getting new revision 5 replicaset for deployment %q: %v", name, err)
} }
rss = []*v1beta1.ReplicaSet{thirdRS, fourthRS, fifthRS} rss = []*apps.ReplicaSet{thirdRS, fourthRS, fifthRS}
for _, curRS := range rss { for _, curRS := range rss {
curRS, err = c.ExtensionsV1beta1().ReplicaSets(ns.Name).Get(curRS.Name, metav1.GetOptions{}) curRS, err = c.AppsV1().ReplicaSets(ns.Name).Get(curRS.Name, metav1.GetOptions{})
if err != nil { if err != nil {
t.Fatalf("failed to get replicaset when checking desired replicas annotation: %v", err) t.Fatalf("failed to get replicaset when checking desired replicas annotation: %v", err)
} }
@ -1010,10 +1035,10 @@ func TestSpecReplicasChange(t *testing.T) {
deploymentName := "deployment" deploymentName := "deployment"
replicas := int32(1) replicas := int32(1)
tester := &deploymentTester{t: t, c: c, deployment: newDeployment(deploymentName, ns.Name, replicas)} tester := &deploymentTester{t: t, c: c, deployment: newDeployment(deploymentName, ns.Name, replicas)}
tester.deployment.Spec.Strategy.Type = v1beta1.RecreateDeploymentStrategyType tester.deployment.Spec.Strategy.Type = apps.RecreateDeploymentStrategyType
tester.deployment.Spec.Strategy.RollingUpdate = nil tester.deployment.Spec.Strategy.RollingUpdate = nil
var err error var err error
tester.deployment, err = c.ExtensionsV1beta1().Deployments(ns.Name).Create(tester.deployment) tester.deployment, err = c.AppsV1().Deployments(ns.Name).Create(tester.deployment)
if err != nil { if err != nil {
t.Fatalf("failed to create deployment %q: %v", deploymentName, err) t.Fatalf("failed to create deployment %q: %v", deploymentName, err)
} }
@ -1039,7 +1064,7 @@ func TestSpecReplicasChange(t *testing.T) {
// Add a template annotation change to test deployment's status does update // Add a template annotation change to test deployment's status does update
// without .spec.replicas change // without .spec.replicas change
var oldGeneration int64 var oldGeneration int64
tester.deployment, err = tester.updateDeployment(func(update *v1beta1.Deployment) { tester.deployment, err = tester.updateDeployment(func(update *apps.Deployment) {
oldGeneration = update.Generation oldGeneration = update.Generation
update.Spec.RevisionHistoryLimit = pointer.Int32Ptr(4) update.Spec.RevisionHistoryLimit = pointer.Int32Ptr(4)
}) })
@ -1068,8 +1093,10 @@ func TestDeploymentAvailableCondition(t *testing.T) {
tester := &deploymentTester{t: t, c: c, deployment: newDeployment(deploymentName, ns.Name, replicas)} tester := &deploymentTester{t: t, c: c, deployment: newDeployment(deploymentName, ns.Name, replicas)}
// Assign a high value to the deployment's minReadySeconds // Assign a high value to the deployment's minReadySeconds
tester.deployment.Spec.MinReadySeconds = 3600 tester.deployment.Spec.MinReadySeconds = 3600
// progressDeadlineSeconds must be greater than minReadySeconds
tester.deployment.Spec.ProgressDeadlineSeconds = pointer.Int32Ptr(7200)
var err error var err error
tester.deployment, err = c.ExtensionsV1beta1().Deployments(ns.Name).Create(tester.deployment) tester.deployment, err = c.AppsV1().Deployments(ns.Name).Create(tester.deployment)
if err != nil { if err != nil {
t.Fatalf("failed to create deployment %q: %v", deploymentName, err) t.Fatalf("failed to create deployment %q: %v", deploymentName, err)
} }
@ -1087,7 +1114,7 @@ func TestDeploymentAvailableCondition(t *testing.T) {
} }
// Wait for the deployment to have MinimumReplicasUnavailable reason because the pods are not marked as ready // Wait for the deployment to have MinimumReplicasUnavailable reason because the pods are not marked as ready
if err = tester.waitForDeploymentWithCondition(deploymentutil.MinimumReplicasUnavailable, v1beta1.DeploymentAvailable); err != nil { if err = tester.waitForDeploymentWithCondition(deploymentutil.MinimumReplicasUnavailable, apps.DeploymentAvailable); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -1107,7 +1134,7 @@ func TestDeploymentAvailableCondition(t *testing.T) {
} }
// Wait for the deployment to still have MinimumReplicasUnavailable reason within minReadySeconds period // Wait for the deployment to still have MinimumReplicasUnavailable reason within minReadySeconds period
if err = tester.waitForDeploymentWithCondition(deploymentutil.MinimumReplicasUnavailable, v1beta1.DeploymentAvailable); err != nil { if err = tester.waitForDeploymentWithCondition(deploymentutil.MinimumReplicasUnavailable, apps.DeploymentAvailable); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -1117,7 +1144,7 @@ func TestDeploymentAvailableCondition(t *testing.T) {
} }
// Update the deployment's minReadySeconds to a small value // Update the deployment's minReadySeconds to a small value
tester.deployment, err = tester.updateDeployment(func(update *v1beta1.Deployment) { tester.deployment, err = tester.updateDeployment(func(update *apps.Deployment) {
update.Spec.MinReadySeconds = 1 update.Spec.MinReadySeconds = 1
}) })
if err != nil { if err != nil {
@ -1130,7 +1157,7 @@ func TestDeploymentAvailableCondition(t *testing.T) {
} }
// Wait for the deployment to have MinimumReplicasAvailable reason after minReadySeconds period // Wait for the deployment to have MinimumReplicasAvailable reason after minReadySeconds period
if err = tester.waitForDeploymentWithCondition(deploymentutil.MinimumReplicasAvailable, v1beta1.DeploymentAvailable); err != nil { if err = tester.waitForDeploymentWithCondition(deploymentutil.MinimumReplicasAvailable, apps.DeploymentAvailable); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -1141,10 +1168,10 @@ func TestDeploymentAvailableCondition(t *testing.T) {
} }
// Wait for deployment to automatically patch incorrect ControllerRef of RS // Wait for deployment to automatically patch incorrect ControllerRef of RS
func testRSControllerRefPatch(t *testing.T, tester *deploymentTester, rs *v1beta1.ReplicaSet, ownerReference *metav1.OwnerReference, expectedOwnerReferenceNum int) { func testRSControllerRefPatch(t *testing.T, tester *deploymentTester, rs *apps.ReplicaSet, ownerReference *metav1.OwnerReference, expectedOwnerReferenceNum int) {
ns := rs.Namespace ns := rs.Namespace
rsClient := tester.c.ExtensionsV1beta1().ReplicaSets(ns) rsClient := tester.c.AppsV1().ReplicaSets(ns)
rs, err := tester.updateReplicaSet(rs.Name, func(update *v1beta1.ReplicaSet) { rs, err := tester.updateReplicaSet(rs.Name, func(update *apps.ReplicaSet) {
update.OwnerReferences = []metav1.OwnerReference{*ownerReference} update.OwnerReferences = []metav1.OwnerReference{*ownerReference}
}) })
if err != nil { if err != nil {
@ -1186,7 +1213,7 @@ func TestGeneralReplicaSetAdoption(t *testing.T) {
replicas := int32(1) replicas := int32(1)
tester := &deploymentTester{t: t, c: c, deployment: newDeployment(deploymentName, ns.Name, replicas)} tester := &deploymentTester{t: t, c: c, deployment: newDeployment(deploymentName, ns.Name, replicas)}
var err error var err error
tester.deployment, err = c.ExtensionsV1beta1().Deployments(ns.Name).Create(tester.deployment) tester.deployment, err = c.AppsV1().Deployments(ns.Name).Create(tester.deployment)
if err != nil { if err != nil {
t.Fatalf("failed to create deployment %q: %v", deploymentName, err) t.Fatalf("failed to create deployment %q: %v", deploymentName, err)
} }
@ -1209,7 +1236,7 @@ func TestGeneralReplicaSetAdoption(t *testing.T) {
} }
// Get replicaset of the deployment // Get replicaset of the deployment
rs, err := deploymentutil.GetNewReplicaSet(tester.deployment, c.ExtensionsV1beta1()) rs, err := deploymentutil.GetNewReplicaSet(tester.deployment, c.AppsV1())
if err != nil { if err != nil {
t.Fatalf("failed to get replicaset of deployment %q: %v", deploymentName, err) t.Fatalf("failed to get replicaset of deployment %q: %v", deploymentName, err)
} }
@ -1233,7 +1260,7 @@ func TestGeneralReplicaSetAdoption(t *testing.T) {
func testScalingUsingScaleSubresource(t *testing.T, tester *deploymentTester, replicas int32) { func testScalingUsingScaleSubresource(t *testing.T, tester *deploymentTester, replicas int32) {
ns := tester.deployment.Namespace ns := tester.deployment.Namespace
deploymentName := tester.deployment.Name deploymentName := tester.deployment.Name
deploymentClient := tester.c.ExtensionsV1beta1().Deployments(ns) deploymentClient := tester.c.AppsV1().Deployments(ns)
deployment, err := deploymentClient.Get(deploymentName, metav1.GetOptions{}) deployment, err := deploymentClient.Get(deploymentName, metav1.GetOptions{})
if err != nil { if err != nil {
t.Fatalf("Failed to obtain deployment %q: %v", deploymentName, err) t.Fatalf("Failed to obtain deployment %q: %v", deploymentName, err)
@ -1280,7 +1307,7 @@ func TestDeploymentScaleSubresource(t *testing.T) {
replicas := int32(2) replicas := int32(2)
tester := &deploymentTester{t: t, c: c, deployment: newDeployment(deploymentName, ns.Name, replicas)} tester := &deploymentTester{t: t, c: c, deployment: newDeployment(deploymentName, ns.Name, replicas)}
var err error var err error
tester.deployment, err = c.ExtensionsV1beta1().Deployments(ns.Name).Create(tester.deployment) tester.deployment, err = c.AppsV1().Deployments(ns.Name).Create(tester.deployment)
if err != nil { if err != nil {
t.Fatalf("failed to create deployment %q: %v", deploymentName, err) t.Fatalf("failed to create deployment %q: %v", deploymentName, err)
} }
@ -1324,7 +1351,7 @@ func TestReplicaSetOrphaningAndAdoptionWhenLabelsChange(t *testing.T) {
replicas := int32(1) replicas := int32(1)
tester := &deploymentTester{t: t, c: c, deployment: newDeployment(deploymentName, ns.Name, replicas)} tester := &deploymentTester{t: t, c: c, deployment: newDeployment(deploymentName, ns.Name, replicas)}
var err error var err error
tester.deployment, err = c.ExtensionsV1beta1().Deployments(ns.Name).Create(tester.deployment) tester.deployment, err = c.AppsV1().Deployments(ns.Name).Create(tester.deployment)
if err != nil { if err != nil {
t.Fatalf("failed to create deployment %q: %v", deploymentName, err) t.Fatalf("failed to create deployment %q: %v", deploymentName, err)
} }
@ -1349,7 +1376,7 @@ func TestReplicaSetOrphaningAndAdoptionWhenLabelsChange(t *testing.T) {
// Orphaning: deployment should remove OwnerReference from a RS when the RS's labels change to not match its labels // Orphaning: deployment should remove OwnerReference from a RS when the RS's labels change to not match its labels
// Get replicaset of the deployment // Get replicaset of the deployment
rs, err := deploymentutil.GetNewReplicaSet(tester.deployment, c.ExtensionsV1beta1()) rs, err := deploymentutil.GetNewReplicaSet(tester.deployment, c.AppsV1())
if err != nil { if err != nil {
t.Fatalf("failed to get replicaset of deployment %q: %v", deploymentName, err) t.Fatalf("failed to get replicaset of deployment %q: %v", deploymentName, err)
} }
@ -1368,7 +1395,7 @@ func TestReplicaSetOrphaningAndAdoptionWhenLabelsChange(t *testing.T) {
// Change the replicaset's labels to not match the deployment's labels // Change the replicaset's labels to not match the deployment's labels
labelMap := map[string]string{"new-name": "new-test"} labelMap := map[string]string{"new-name": "new-test"}
rs, err = tester.updateReplicaSet(rs.Name, func(update *v1beta1.ReplicaSet) { rs, err = tester.updateReplicaSet(rs.Name, func(update *apps.ReplicaSet) {
update.Labels = labelMap update.Labels = labelMap
}) })
if err != nil { if err != nil {
@ -1376,7 +1403,7 @@ func TestReplicaSetOrphaningAndAdoptionWhenLabelsChange(t *testing.T) {
} }
// Wait for the controllerRef of the replicaset to become nil // Wait for the controllerRef of the replicaset to become nil
rsClient := tester.c.ExtensionsV1beta1().ReplicaSets(ns.Name) rsClient := tester.c.AppsV1().ReplicaSets(ns.Name)
if err = wait.PollImmediate(pollInterval, pollTimeout, func() (bool, error) { if err = wait.PollImmediate(pollInterval, pollTimeout, func() (bool, error) {
rs, err = rsClient.Get(rs.Name, metav1.GetOptions{}) rs, err = rsClient.Get(rs.Name, metav1.GetOptions{})
if err != nil { if err != nil {
@ -1390,9 +1417,9 @@ func TestReplicaSetOrphaningAndAdoptionWhenLabelsChange(t *testing.T) {
// Wait for the deployment to create a new replicaset // Wait for the deployment to create a new replicaset
// This will trigger collision avoidance due to deterministic nature of replicaset name // This will trigger collision avoidance due to deterministic nature of replicaset name
// i.e., the new replicaset will have a name with different hash to preserve name uniqueness // i.e., the new replicaset will have a name with different hash to preserve name uniqueness
var newRS *v1beta1.ReplicaSet var newRS *apps.ReplicaSet
if err = wait.PollImmediate(pollInterval, pollTimeout, func() (bool, error) { if err = wait.PollImmediate(pollInterval, pollTimeout, func() (bool, error) {
newRS, err = deploymentutil.GetNewReplicaSet(tester.deployment, c.ExtensionsV1beta1()) newRS, err = deploymentutil.GetNewReplicaSet(tester.deployment, c.AppsV1())
if err != nil { if err != nil {
return false, fmt.Errorf("failed to get new replicaset of deployment %q after orphaning: %v", deploymentName, err) return false, fmt.Errorf("failed to get new replicaset of deployment %q after orphaning: %v", deploymentName, err)
} }
@ -1407,7 +1434,7 @@ func TestReplicaSetOrphaningAndAdoptionWhenLabelsChange(t *testing.T) {
// Adoption: deployment should add controllerRef to a RS when the RS's labels change to match its labels // Adoption: deployment should add controllerRef to a RS when the RS's labels change to match its labels
// Change the old replicaset's labels to match the deployment's labels // Change the old replicaset's labels to match the deployment's labels
rs, err = tester.updateReplicaSet(rs.Name, func(update *v1beta1.ReplicaSet) { rs, err = tester.updateReplicaSet(rs.Name, func(update *apps.ReplicaSet) {
update.Labels = testLabels() update.Labels = testLabels()
}) })
if err != nil { if err != nil {

View File

@ -23,8 +23,9 @@ import (
"testing" "testing"
"time" "time"
apps "k8s.io/api/apps/v1"
"k8s.io/api/core/v1" "k8s.io/api/core/v1"
"k8s.io/api/extensions/v1beta1" extensions "k8s.io/api/extensions/v1beta1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/intstr"
"k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/util/wait"
@ -48,18 +49,18 @@ const (
fakeImage = "fakeimage" fakeImage = "fakeimage"
) )
var pauseFn = func(update *v1beta1.Deployment) { var pauseFn = func(update *apps.Deployment) {
update.Spec.Paused = true update.Spec.Paused = true
} }
var resumeFn = func(update *v1beta1.Deployment) { var resumeFn = func(update *apps.Deployment) {
update.Spec.Paused = false update.Spec.Paused = false
} }
type deploymentTester struct { type deploymentTester struct {
t *testing.T t *testing.T
c clientset.Interface c clientset.Interface
deployment *v1beta1.Deployment deployment *apps.Deployment
} }
func testLabels() map[string]string { func testLabels() map[string]string {
@ -67,22 +68,22 @@ func testLabels() map[string]string {
} }
// newDeployment returns a RollingUpdate Deployment with with a fake container image // newDeployment returns a RollingUpdate Deployment with with a fake container image
func newDeployment(name, ns string, replicas int32) *v1beta1.Deployment { func newDeployment(name, ns string, replicas int32) *apps.Deployment {
return &v1beta1.Deployment{ return &apps.Deployment{
TypeMeta: metav1.TypeMeta{ TypeMeta: metav1.TypeMeta{
Kind: "Deployment", Kind: "Deployment",
APIVersion: "extensions/v1beta1", APIVersion: "apps/v1",
}, },
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Namespace: ns, Namespace: ns,
Name: name, Name: name,
}, },
Spec: v1beta1.DeploymentSpec{ Spec: apps.DeploymentSpec{
Replicas: &replicas, Replicas: &replicas,
Selector: &metav1.LabelSelector{MatchLabels: testLabels()}, Selector: &metav1.LabelSelector{MatchLabels: testLabels()},
Strategy: v1beta1.DeploymentStrategy{ Strategy: apps.DeploymentStrategy{
Type: v1beta1.RollingUpdateDeploymentStrategyType, Type: apps.RollingUpdateDeploymentStrategyType,
RollingUpdate: new(v1beta1.RollingUpdateDeployment), RollingUpdate: new(apps.RollingUpdateDeployment),
}, },
Template: v1.PodTemplateSpec{ Template: v1.PodTemplateSpec{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
@ -101,8 +102,8 @@ func newDeployment(name, ns string, replicas int32) *v1beta1.Deployment {
} }
} }
func newReplicaSet(name, ns string, replicas int32) *v1beta1.ReplicaSet { func newReplicaSet(name, ns string, replicas int32) *apps.ReplicaSet {
return &v1beta1.ReplicaSet{ return &apps.ReplicaSet{
TypeMeta: metav1.TypeMeta{ TypeMeta: metav1.TypeMeta{
Kind: "ReplicaSet", Kind: "ReplicaSet",
APIVersion: "extensions/v1beta1", APIVersion: "extensions/v1beta1",
@ -110,8 +111,9 @@ func newReplicaSet(name, ns string, replicas int32) *v1beta1.ReplicaSet {
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Namespace: ns, Namespace: ns,
Name: name, Name: name,
Labels: testLabels(),
}, },
Spec: v1beta1.ReplicaSetSpec{ Spec: apps.ReplicaSetSpec{
Selector: &metav1.LabelSelector{ Selector: &metav1.LabelSelector{
MatchLabels: testLabels(), MatchLabels: testLabels(),
}, },
@ -133,11 +135,11 @@ func newReplicaSet(name, ns string, replicas int32) *v1beta1.ReplicaSet {
} }
} }
func newDeploymentRollback(name string, annotations map[string]string, revision int64) *v1beta1.DeploymentRollback { func newDeploymentRollback(name string, annotations map[string]string, revision int64) *extensions.DeploymentRollback {
return &v1beta1.DeploymentRollback{ return &extensions.DeploymentRollback{
Name: name, Name: name,
UpdatedAnnotations: annotations, UpdatedAnnotations: annotations,
RollbackTo: v1beta1.RollbackConfig{Revision: revision}, RollbackTo: extensions.RollbackConfig{Revision: revision},
} }
} }
@ -156,8 +158,8 @@ func dcSetup(t *testing.T) (*httptest.Server, framework.CloseFunc, *replicaset.R
metrics.UnregisterMetricAndUntrackRateLimiterUsage("deployment_controller") metrics.UnregisterMetricAndUntrackRateLimiterUsage("deployment_controller")
dc, err := deployment.NewDeploymentController( dc, err := deployment.NewDeploymentController(
informers.Extensions().V1beta1().Deployments(), informers.Apps().V1().Deployments(),
informers.Extensions().V1beta1().ReplicaSets(), informers.Apps().V1().ReplicaSets(),
informers.Core().V1().Pods(), informers.Core().V1().Pods(),
clientset.NewForConfigOrDie(restclient.AddUserAgent(&config, "deployment-controller")), clientset.NewForConfigOrDie(restclient.AddUserAgent(&config, "deployment-controller")),
) )
@ -256,7 +258,7 @@ func (d *deploymentTester) markUpdatedPodsReady(wg *sync.WaitGroup) {
} }
func (d *deploymentTester) deploymentComplete() (bool, error) { func (d *deploymentTester) deploymentComplete() (bool, error) {
latest, err := d.c.ExtensionsV1beta1().Deployments(d.deployment.Namespace).Get(d.deployment.Name, metav1.GetOptions{}) latest, err := d.c.AppsV1().Deployments(d.deployment.Namespace).Get(d.deployment.Name, metav1.GetOptions{})
if err != nil { if err != nil {
return false, err return false, err
} }
@ -285,6 +287,8 @@ func (d *deploymentTester) waitForDeploymentCompleteAndCheckRollingAndMarkPodsRe
// Manually mark updated Deployment pods as ready in a separate goroutine // Manually mark updated Deployment pods as ready in a separate goroutine
wg.Add(1) wg.Add(1)
go d.markUpdatedPodsReady(&wg) go d.markUpdatedPodsReady(&wg)
// Wait for goroutine to finish, for all return paths.
defer wg.Wait()
// Wait for the Deployment status to complete while Deployment pods are becoming ready // Wait for the Deployment status to complete while Deployment pods are becoming ready
err := d.waitForDeploymentCompleteAndCheckRolling() err := d.waitForDeploymentCompleteAndCheckRolling()
@ -292,9 +296,6 @@ func (d *deploymentTester) waitForDeploymentCompleteAndCheckRollingAndMarkPodsRe
return fmt.Errorf("failed to wait for Deployment %s to complete: %v", d.deployment.Name, err) return fmt.Errorf("failed to wait for Deployment %s to complete: %v", d.deployment.Name, err)
} }
// Wait for goroutine to finish
wg.Wait()
return nil return nil
} }
@ -319,7 +320,7 @@ func (d *deploymentTester) waitForDeploymentCompleteAndMarkPodsReady() error {
return nil return nil
} }
func (d *deploymentTester) updateDeployment(applyUpdate testutil.UpdateDeploymentFunc) (*v1beta1.Deployment, error) { func (d *deploymentTester) updateDeployment(applyUpdate testutil.UpdateDeploymentFunc) (*apps.Deployment, error) {
return testutil.UpdateDeploymentWithRetries(d.c, d.deployment.Namespace, d.deployment.Name, applyUpdate, d.t.Logf, pollInterval, pollTimeout) return testutil.UpdateDeploymentWithRetries(d.c, d.deployment.Namespace, d.deployment.Name, applyUpdate, d.t.Logf, pollInterval, pollTimeout)
} }
@ -330,12 +331,12 @@ func (d *deploymentTester) waitForObservedDeployment(desiredGeneration int64) er
return nil return nil
} }
func (d *deploymentTester) getNewReplicaSet() (*v1beta1.ReplicaSet, error) { func (d *deploymentTester) getNewReplicaSet() (*apps.ReplicaSet, error) {
deployment, err := d.c.ExtensionsV1beta1().Deployments(d.deployment.Namespace).Get(d.deployment.Name, metav1.GetOptions{}) deployment, err := d.c.AppsV1().Deployments(d.deployment.Namespace).Get(d.deployment.Name, metav1.GetOptions{})
if err != nil { if err != nil {
return nil, fmt.Errorf("failed retrieving deployment %s: %v", d.deployment.Name, err) return nil, fmt.Errorf("failed retrieving deployment %s: %v", d.deployment.Name, err)
} }
rs, err := deploymentutil.GetNewReplicaSet(deployment, d.c.ExtensionsV1beta1()) rs, err := deploymentutil.GetNewReplicaSet(deployment, d.c.AppsV1())
if err != nil { if err != nil {
return nil, fmt.Errorf("failed retrieving new replicaset of deployment %s: %v", d.deployment.Name, err) return nil, fmt.Errorf("failed retrieving new replicaset of deployment %s: %v", d.deployment.Name, err)
} }
@ -353,7 +354,7 @@ func (d *deploymentTester) expectNoNewReplicaSet() error {
return nil return nil
} }
func (d *deploymentTester) expectNewReplicaSet() (*v1beta1.ReplicaSet, error) { func (d *deploymentTester) expectNewReplicaSet() (*apps.ReplicaSet, error) {
rs, err := d.getNewReplicaSet() rs, err := d.getNewReplicaSet()
if err != nil { if err != nil {
return nil, err return nil, err
@ -364,12 +365,12 @@ func (d *deploymentTester) expectNewReplicaSet() (*v1beta1.ReplicaSet, error) {
return rs, nil return rs, nil
} }
func (d *deploymentTester) updateReplicaSet(name string, applyUpdate testutil.UpdateExtensionsReplicaSetFunc) (*v1beta1.ReplicaSet, error) { func (d *deploymentTester) updateReplicaSet(name string, applyUpdate testutil.UpdateReplicaSetFunc) (*apps.ReplicaSet, error) {
return testutil.UpdateExtensionsReplicaSetWithRetries(d.c, d.deployment.Namespace, name, applyUpdate, d.t.Logf, pollInterval, pollTimeout) return testutil.UpdateReplicaSetWithRetries(d.c, d.deployment.Namespace, name, applyUpdate, d.t.Logf, pollInterval, pollTimeout)
} }
func (d *deploymentTester) updateReplicaSetStatus(name string, applyStatusUpdate testutil.UpdateExtensionsReplicaSetFunc) (*v1beta1.ReplicaSet, error) { func (d *deploymentTester) updateReplicaSetStatus(name string, applyStatusUpdate testutil.UpdateReplicaSetFunc) (*apps.ReplicaSet, error) {
return testutil.UpdateExtensionsReplicaSetStatusWithRetries(d.c, d.deployment.Namespace, name, applyStatusUpdate, d.t.Logf, pollInterval, pollTimeout) return testutil.UpdateReplicaSetStatusWithRetries(d.c, d.deployment.Namespace, name, applyStatusUpdate, d.t.Logf, pollInterval, pollTimeout)
} }
// waitForDeploymentRollbackCleared waits for deployment either started rolling back or doesn't need to rollback. // waitForDeploymentRollbackCleared waits for deployment either started rolling back or doesn't need to rollback.
@ -386,7 +387,7 @@ func (d *deploymentTester) waitForDeploymentUpdatedReplicasGTE(minUpdatedReplica
return testutil.WaitForDeploymentUpdatedReplicasGTE(d.c, d.deployment.Namespace, d.deployment.Name, minUpdatedReplicas, d.deployment.Generation, pollInterval, pollTimeout) return testutil.WaitForDeploymentUpdatedReplicasGTE(d.c, d.deployment.Namespace, d.deployment.Name, minUpdatedReplicas, d.deployment.Generation, pollInterval, pollTimeout)
} }
func (d *deploymentTester) waitForDeploymentWithCondition(reason string, condType v1beta1.DeploymentConditionType) error { func (d *deploymentTester) waitForDeploymentWithCondition(reason string, condType apps.DeploymentConditionType) error {
return testutil.WaitForDeploymentWithCondition(d.c, d.deployment.Namespace, d.deployment.Name, reason, condType, d.t.Logf, pollInterval, pollTimeout) return testutil.WaitForDeploymentWithCondition(d.c, d.deployment.Namespace, d.deployment.Name, reason, condType, d.t.Logf, pollInterval, pollTimeout)
} }
@ -417,13 +418,13 @@ func (d *deploymentTester) listUpdatedPods() ([]v1.Pod, error) {
return ownedPods, nil return ownedPods, nil
} }
func (d *deploymentTester) waitRSStable(replicaset *v1beta1.ReplicaSet) error { func (d *deploymentTester) waitRSStable(replicaset *apps.ReplicaSet) error {
return testutil.WaitExtensionsRSStable(d.t, d.c, replicaset, pollInterval, pollTimeout) return testutil.WaitRSStable(d.t, d.c, replicaset, pollInterval, pollTimeout)
} }
func (d *deploymentTester) scaleDeployment(newReplicas int32) error { func (d *deploymentTester) scaleDeployment(newReplicas int32) error {
var err error var err error
d.deployment, err = d.updateDeployment(func(update *v1beta1.Deployment) { d.deployment, err = d.updateDeployment(func(update *apps.Deployment) {
update.Spec.Replicas = &newReplicas update.Spec.Replicas = &newReplicas
}) })
if err != nil { if err != nil {
@ -447,7 +448,7 @@ func (d *deploymentTester) scaleDeployment(newReplicas int32) error {
// waitForReadyReplicas waits for number of ready replicas to equal number of replicas. // waitForReadyReplicas waits for number of ready replicas to equal number of replicas.
func (d *deploymentTester) waitForReadyReplicas() error { func (d *deploymentTester) waitForReadyReplicas() error {
if err := wait.PollImmediate(pollInterval, pollTimeout, func() (bool, error) { if err := wait.PollImmediate(pollInterval, pollTimeout, func() (bool, error) {
deployment, err := d.c.ExtensionsV1beta1().Deployments(d.deployment.Namespace).Get(d.deployment.Name, metav1.GetOptions{}) deployment, err := d.c.AppsV1().Deployments(d.deployment.Namespace).Get(d.deployment.Name, metav1.GetOptions{})
if err != nil { if err != nil {
return false, fmt.Errorf("failed to get deployment %q: %v", d.deployment.Name, err) return false, fmt.Errorf("failed to get deployment %q: %v", d.deployment.Name, err)
} }
@ -485,7 +486,7 @@ func (d *deploymentTester) markUpdatedPodsReadyWithoutComplete() error {
// Verify all replicas fields of DeploymentStatus have desired count. // Verify all replicas fields of DeploymentStatus have desired count.
// Immediately return an error when found a non-matching replicas field. // Immediately return an error when found a non-matching replicas field.
func (d *deploymentTester) checkDeploymentStatusReplicasFields(replicas, updatedReplicas, readyReplicas, availableReplicas, unavailableReplicas int32) error { func (d *deploymentTester) checkDeploymentStatusReplicasFields(replicas, updatedReplicas, readyReplicas, availableReplicas, unavailableReplicas int32) error {
deployment, err := d.c.ExtensionsV1beta1().Deployments(d.deployment.Namespace).Get(d.deployment.Name, metav1.GetOptions{}) deployment, err := d.c.AppsV1().Deployments(d.deployment.Namespace).Get(d.deployment.Name, metav1.GetOptions{})
if err != nil { if err != nil {
return fmt.Errorf("failed to get deployment %q: %v", d.deployment.Name, err) return fmt.Errorf("failed to get deployment %q: %v", d.deployment.Name, err)
} }

View File

@ -22,7 +22,6 @@ import (
"time" "time"
apps "k8s.io/api/apps/v1" apps "k8s.io/api/apps/v1"
extensions "k8s.io/api/extensions/v1beta1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/util/wait"
clientset "k8s.io/client-go/kubernetes" clientset "k8s.io/client-go/kubernetes"
@ -53,33 +52,6 @@ func UpdateReplicaSetWithRetries(c clientset.Interface, namespace, name string,
return rs, pollErr return rs, pollErr
} }
// TODO(#55714): Remove this after Deployment tests use apps/v1 ReplicaSet.
type UpdateExtensionsReplicaSetFunc func(d *extensions.ReplicaSet)
// TODO(#55714): Remove this after Deployment tests use apps/v1 ReplicaSet.
func UpdateExtensionsReplicaSetWithRetries(c clientset.Interface, namespace, name string, applyUpdate UpdateExtensionsReplicaSetFunc, logf LogfFn, pollInterval, pollTimeout time.Duration) (*extensions.ReplicaSet, error) {
var rs *extensions.ReplicaSet
var updateErr error
pollErr := wait.PollImmediate(pollInterval, pollTimeout, func() (bool, error) {
var err error
if rs, err = c.ExtensionsV1beta1().ReplicaSets(namespace).Get(name, metav1.GetOptions{}); err != nil {
return false, err
}
// Apply the update, then attempt to push it to the apiserver.
applyUpdate(rs)
if rs, err = c.ExtensionsV1beta1().ReplicaSets(namespace).Update(rs); err == nil {
logf("Updating replica set %q", name)
return true, nil
}
updateErr = err
return false, nil
})
if pollErr == wait.ErrWaitTimeout {
pollErr = fmt.Errorf("couldn't apply the provided updated to replicaset %q: %v", name, updateErr)
}
return rs, pollErr
}
// Verify .Status.Replicas is equal to .Spec.Replicas // Verify .Status.Replicas is equal to .Spec.Replicas
func WaitRSStable(t *testing.T, clientSet clientset.Interface, rs *apps.ReplicaSet, pollInterval, pollTimeout time.Duration) error { func WaitRSStable(t *testing.T, clientSet clientset.Interface, rs *apps.ReplicaSet, pollInterval, pollTimeout time.Duration) error {
desiredGeneration := rs.Generation desiredGeneration := rs.Generation
@ -95,33 +67,17 @@ func WaitRSStable(t *testing.T, clientSet clientset.Interface, rs *apps.ReplicaS
return nil return nil
} }
// TODO(#55714): Remove after Deployment tests use apps/v1 ReplicaSet. func UpdateReplicaSetStatusWithRetries(c clientset.Interface, namespace, name string, applyUpdate UpdateReplicaSetFunc, logf LogfFn, pollInterval, pollTimeout time.Duration) (*apps.ReplicaSet, error) {
func WaitExtensionsRSStable(t *testing.T, clientSet clientset.Interface, rs *extensions.ReplicaSet, pollInterval, pollTimeout time.Duration) error { var rs *apps.ReplicaSet
desiredGeneration := rs.Generation
if err := wait.PollImmediate(pollInterval, pollTimeout, func() (bool, error) {
newRS, err := clientSet.ExtensionsV1beta1().ReplicaSets(rs.Namespace).Get(rs.Name, metav1.GetOptions{})
if err != nil {
return false, err
}
return newRS.Status.ObservedGeneration >= desiredGeneration && newRS.Status.Replicas == *rs.Spec.Replicas, nil
}); err != nil {
return fmt.Errorf("failed to verify .Status.Replicas is equal to .Spec.Replicas for replicaset %q: %v", rs.Name, err)
}
return nil
}
// TODO(#55714): Remove after Deployment tests use apps/v1 ReplicaSet.
func UpdateExtensionsReplicaSetStatusWithRetries(c clientset.Interface, namespace, name string, applyUpdate UpdateExtensionsReplicaSetFunc, logf LogfFn, pollInterval, pollTimeout time.Duration) (*extensions.ReplicaSet, error) {
var rs *extensions.ReplicaSet
var updateErr error var updateErr error
pollErr := wait.PollImmediate(pollInterval, pollTimeout, func() (bool, error) { pollErr := wait.PollImmediate(pollInterval, pollTimeout, func() (bool, error) {
var err error var err error
if rs, err = c.ExtensionsV1beta1().ReplicaSets(namespace).Get(name, metav1.GetOptions{}); err != nil { if rs, err = c.AppsV1().ReplicaSets(namespace).Get(name, metav1.GetOptions{}); err != nil {
return false, err return false, err
} }
// Apply the update, then attempt to push it to the apiserver. // Apply the update, then attempt to push it to the apiserver.
applyUpdate(rs) applyUpdate(rs)
if rs, err = c.ExtensionsV1beta1().ReplicaSets(namespace).UpdateStatus(rs); err == nil { if rs, err = c.AppsV1().ReplicaSets(namespace).UpdateStatus(rs); err == nil {
logf("Updating replica set %q", name) logf("Updating replica set %q", name)
return true, nil return true, nil
} }