Merge pull request #40261 from kargakis/fix-deployment-completeness

Automatic merge from submit-queue

controller: old pods should block deployment completeness

Fixes https://github.com/kubernetes/kubernetes/issues/40207
This commit is contained in:
Kubernetes Submit Queue 2017-01-26 11:08:03 -08:00 committed by GitHub
commit 5b75980c32
2 changed files with 16 additions and 7 deletions

View File

@ -816,9 +816,10 @@ func IsRollingUpdate(deployment *extensions.Deployment) bool {
} }
// DeploymentComplete considers a deployment to be complete once its desired replicas equals its // DeploymentComplete considers a deployment to be complete once its desired replicas equals its
// updatedReplicas and it doesn't violate minimum availability. // updatedReplicas, no old pods are running, and it doesn't violate minimum availability.
func DeploymentComplete(deployment *extensions.Deployment, newStatus *extensions.DeploymentStatus) bool { func DeploymentComplete(deployment *extensions.Deployment, newStatus *extensions.DeploymentStatus) bool {
return newStatus.UpdatedReplicas == *(deployment.Spec.Replicas) && return newStatus.UpdatedReplicas == *(deployment.Spec.Replicas) &&
newStatus.Replicas == *(deployment.Spec.Replicas) &&
newStatus.AvailableReplicas >= *(deployment.Spec.Replicas)-MaxUnavailable(*deployment) && newStatus.AvailableReplicas >= *(deployment.Spec.Replicas)-MaxUnavailable(*deployment) &&
newStatus.ObservedGeneration >= deployment.Generation newStatus.ObservedGeneration >= deployment.Generation
} }

View File

@ -892,14 +892,14 @@ func TestRemoveCondition(t *testing.T) {
} }
func TestDeploymentComplete(t *testing.T) { func TestDeploymentComplete(t *testing.T) {
deployment := func(desired, current, updated, available, maxUnavailable int32) *extensions.Deployment { deployment := func(desired, current, updated, available, maxUnavailable, maxSurge int32) *extensions.Deployment {
return &extensions.Deployment{ return &extensions.Deployment{
Spec: extensions.DeploymentSpec{ Spec: extensions.DeploymentSpec{
Replicas: &desired, Replicas: &desired,
Strategy: extensions.DeploymentStrategy{ Strategy: extensions.DeploymentStrategy{
RollingUpdate: &extensions.RollingUpdateDeployment{ RollingUpdate: &extensions.RollingUpdateDeployment{
MaxUnavailable: func(i int) *intstr.IntOrString { x := intstr.FromInt(i); return &x }(int(maxUnavailable)), MaxUnavailable: func(i int) *intstr.IntOrString { x := intstr.FromInt(i); return &x }(int(maxUnavailable)),
MaxSurge: func() *intstr.IntOrString { x := intstr.FromInt(0); return &x }(), MaxSurge: func(i int) *intstr.IntOrString { x := intstr.FromInt(i); return &x }(int(maxSurge)),
}, },
Type: extensions.RollingUpdateDeploymentStrategyType, Type: extensions.RollingUpdateDeploymentStrategyType,
}, },
@ -922,25 +922,33 @@ func TestDeploymentComplete(t *testing.T) {
{ {
name: "complete", name: "complete",
d: deployment(5, 5, 5, 4, 1), d: deployment(5, 5, 5, 4, 1, 0),
expected: true, expected: true,
}, },
{ {
name: "not complete", name: "not complete",
d: deployment(5, 5, 5, 3, 1), d: deployment(5, 5, 5, 3, 1, 0),
expected: false, expected: false,
}, },
{ {
name: "complete #2", name: "complete #2",
d: deployment(5, 5, 5, 5, 0), d: deployment(5, 5, 5, 5, 0, 0),
expected: true, expected: true,
}, },
{ {
name: "not complete #2", name: "not complete #2",
d: deployment(5, 5, 4, 5, 0), d: deployment(5, 5, 4, 5, 0, 0),
expected: false,
},
{
name: "not complete #3",
// old replica set: spec.replicas=1, status.replicas=1, status.availableReplicas=1
// new replica set: spec.replicas=1, status.replicas=1, status.availableReplicas=0
d: deployment(1, 2, 1, 1, 0, 1),
expected: false, expected: false,
}, },
} }