From c82cae85f63e4202214be4d2dde319bab03f31cb Mon Sep 17 00:00:00 2001 From: Michail Kargakis Date: Wed, 7 Dec 2016 17:31:29 +0100 Subject: [PATCH] controller: set unavailableReplicas correctly when scaling down deployment_controller.go:299] Error syncing deployment e2e-tests-kubectl-2l7xx/e2e-test-nginx-deployment: Deployment.extensions "e2e-test-nginx-deployment" is invalid: status.unavailableReplicas: Invalid value: -1: must be greater than or equal to 0 The validation error above occurs usually when a Deployment is scaled down. In such a case we should default unavailableReplicas to 0 instead of making an invalid api call. --- pkg/controller/deployment/sync.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/pkg/controller/deployment/sync.go b/pkg/controller/deployment/sync.go index 87d839c87ee..ccd2e40bb1a 100644 --- a/pkg/controller/deployment/sync.go +++ b/pkg/controller/deployment/sync.go @@ -597,6 +597,12 @@ func (dc *DeploymentController) syncDeploymentStatus(allRSs []*extensions.Replic func (dc *DeploymentController) calculateStatus(allRSs []*extensions.ReplicaSet, newRS *extensions.ReplicaSet, deployment *extensions.Deployment) extensions.DeploymentStatus { availableReplicas := deploymentutil.GetAvailableReplicaCountForReplicaSets(allRSs) totalReplicas := deploymentutil.GetReplicaCountForReplicaSets(allRSs) + unavailableReplicas := totalReplicas - availableReplicas + // If unavailableReplicas is negative, then that means the Deployment has more available replicas running than + // desired, eg. whenever it scales down. In such a case we should simply default unavailableReplicas to zero. + if unavailableReplicas < 0 { + unavailableReplicas = 0 + } if availableReplicas >= *(deployment.Spec.Replicas)-deploymentutil.MaxUnavailable(*deployment) { minAvailability := deploymentutil.NewDeploymentCondition(extensions.DeploymentAvailable, v1.ConditionTrue, deploymentutil.MinimumReplicasAvailable, "Deployment has minimum availability.") @@ -612,7 +618,7 @@ func (dc *DeploymentController) calculateStatus(allRSs []*extensions.ReplicaSet, Replicas: deploymentutil.GetActualReplicaCountForReplicaSets(allRSs), UpdatedReplicas: deploymentutil.GetActualReplicaCountForReplicaSets([]*extensions.ReplicaSet{newRS}), AvailableReplicas: availableReplicas, - UnavailableReplicas: totalReplicas - availableReplicas, + UnavailableReplicas: unavailableReplicas, Conditions: deployment.Status.Conditions, } }