diff --git a/pkg/controller/deployment/deployment_controller.go b/pkg/controller/deployment/deployment_controller.go index 4e1cc0206c0..8587334dacc 100644 --- a/pkg/controller/deployment/deployment_controller.go +++ b/pkg/controller/deployment/deployment_controller.go @@ -484,6 +484,10 @@ func (dc *DeploymentController) syncDeployment(key string) error { return err } + if d.DeletionTimestamp != nil { + return dc.syncStatusOnly(d) + } + if d.Spec.Paused { return dc.sync(d) } diff --git a/pkg/controller/deployment/deployment_controller_test.go b/pkg/controller/deployment/deployment_controller_test.go index 9ade955fff7..16d655dd2bb 100644 --- a/pkg/controller/deployment/deployment_controller_test.go +++ b/pkg/controller/deployment/deployment_controller_test.go @@ -252,6 +252,17 @@ func TestSyncDeploymentCreatesReplicaSet(t *testing.T) { f.run(getKey(d, t)) } +func TestSyncDeploymentDontDoAnythingDuringDeletion(t *testing.T) { + f := newFixture(t) + + d := newDeployment(1, nil) + now := unversioned.Now() + d.DeletionTimestamp = &now + f.dStore = append(f.dStore, d) + + f.run(getKey(d, t)) +} + // issue: https://github.com/kubernetes/kubernetes/issues/23218 func TestDeploymentController_dontSyncDeploymentsWithEmptyPodSelector(t *testing.T) { fake := &fake.Clientset{} diff --git a/pkg/controller/deployment/sync.go b/pkg/controller/deployment/sync.go index f9b071217a5..a9f97b2757f 100644 --- a/pkg/controller/deployment/sync.go +++ b/pkg/controller/deployment/sync.go @@ -35,6 +35,17 @@ import ( rsutil "k8s.io/kubernetes/pkg/util/replicaset" ) +// syncStatusOnly only updates Deployments Status and doesn't take any mutating actions. +func (dc *DeploymentController) syncStatusOnly(deployment *extensions.Deployment) error { + newRS, oldRSs, err := dc.getAllReplicaSetsAndSyncRevision(deployment, false) + if err != nil { + return err + } + + allRSs := append(oldRSs, newRS) + return dc.syncDeploymentStatus(allRSs, newRS, deployment) +} + // sync is responsible for reconciling deployments on scaling events or when they // are paused. func (dc *DeploymentController) sync(deployment *extensions.Deployment) error {