controller: fix cleanup policy for deployments

Cleanup policy should run on all replica sets and not only on those that
have pods (we will not cleanup those anyway).
This commit is contained in:
Michail Kargakis
2016-02-12 16:56:44 +01:00
parent 32d844e59c
commit b9839d0677
3 changed files with 23 additions and 32 deletions

View File

@@ -432,6 +432,17 @@ func FilterActivePods(pods []api.Pod) []*api.Pod {
return result return result
} }
// FilterActiveReplicaSets returns replica sets that have (or at least ought to have) pods.
func FilterActiveReplicaSets(replicaSets []*extensions.ReplicaSet) []*extensions.ReplicaSet {
active := []*extensions.ReplicaSet{}
for i := range replicaSets {
if replicaSets[i].Spec.Replicas > 0 {
active = append(active, replicaSets[i])
}
}
return active
}
// ControllersByCreationTimestamp sorts a list of ReplicationControllers by creation timestamp, using their names as a tie breaker. // ControllersByCreationTimestamp sorts a list of ReplicationControllers by creation timestamp, using their names as a tie breaker.
type ControllersByCreationTimestamp []*api.ReplicationController type ControllersByCreationTimestamp []*api.ReplicationController

View File

@@ -441,7 +441,7 @@ func (dc *DeploymentController) syncDeployment(key string) error {
// Rolling back to a revision; no-op if the toRevision is deployment's current revision // Rolling back to a revision; no-op if the toRevision is deployment's current revision
func (dc *DeploymentController) rollback(deployment *extensions.Deployment, toRevision *int64) (*extensions.Deployment, error) { func (dc *DeploymentController) rollback(deployment *extensions.Deployment, toRevision *int64) (*extensions.Deployment, error) {
newRS, allOldRSs, err := dc.getNewAndAllOldReplicaSets(*deployment) newRS, allOldRSs, err := dc.getAllReplicaSets(*deployment)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -493,14 +493,14 @@ func (dc *DeploymentController) updateDeploymentAndClearRollbackTo(deployment *e
} }
func (dc *DeploymentController) syncRecreateDeployment(deployment extensions.Deployment) error { func (dc *DeploymentController) syncRecreateDeployment(deployment extensions.Deployment) error {
newRS, oldRSs, err := dc.getNewAndOldReplicaSets(deployment) newRS, oldRSs, err := dc.getAllReplicaSets(deployment)
if err != nil { if err != nil {
return err return err
} }
allRSs := append(oldRSs, newRS) allRSs := append(controller.FilterActiveReplicaSets(oldRSs), newRS)
// scale down old replica sets // scale down old replica sets
scaledDown, err := dc.scaleDownOldReplicaSetsForRecreate(oldRSs, deployment) scaledDown, err := dc.scaleDownOldReplicaSetsForRecreate(controller.FilterActiveReplicaSets(oldRSs), deployment)
if err != nil { if err != nil {
return err return err
} }
@@ -526,16 +526,14 @@ func (dc *DeploymentController) syncRecreateDeployment(deployment extensions.Dep
// Sync deployment status // Sync deployment status
return dc.syncDeploymentStatus(allRSs, newRS, deployment) return dc.syncDeploymentStatus(allRSs, newRS, deployment)
// TODO: raise an event, neither scaled up nor down.
} }
func (dc *DeploymentController) syncRollingUpdateDeployment(deployment extensions.Deployment) error { func (dc *DeploymentController) syncRollingUpdateDeployment(deployment extensions.Deployment) error {
newRS, oldRSs, err := dc.getNewAndOldReplicaSets(deployment) newRS, oldRSs, err := dc.getAllReplicaSets(deployment)
if err != nil { if err != nil {
return err return err
} }
allRSs := append(oldRSs, newRS) allRSs := append(controller.FilterActiveReplicaSets(oldRSs), newRS)
// Scale up, if we can. // Scale up, if we can.
scaledUp, err := dc.reconcileNewReplicaSet(allRSs, newRS, deployment) scaledUp, err := dc.reconcileNewReplicaSet(allRSs, newRS, deployment)
@@ -548,7 +546,7 @@ func (dc *DeploymentController) syncRollingUpdateDeployment(deployment extension
} }
// Scale down, if we can. // Scale down, if we can.
scaledDown, err := dc.reconcileOldReplicaSets(allRSs, oldRSs, newRS, deployment, true) scaledDown, err := dc.reconcileOldReplicaSets(allRSs, controller.FilterActiveReplicaSets(oldRSs), newRS, deployment, true)
if err != nil { if err != nil {
return err return err
} }
@@ -564,8 +562,6 @@ func (dc *DeploymentController) syncRollingUpdateDeployment(deployment extension
// Sync deployment status // Sync deployment status
return dc.syncDeploymentStatus(allRSs, newRS, deployment) return dc.syncDeploymentStatus(allRSs, newRS, deployment)
// TODO: raise an event, neither scaled up nor down.
} }
// syncDeploymentStatus checks if the status is up-to-date and sync it if necessary // syncDeploymentStatus checks if the status is up-to-date and sync it if necessary
@@ -580,10 +576,9 @@ func (dc *DeploymentController) syncDeploymentStatus(allRSs []*extensions.Replic
return nil return nil
} }
// getNewAndMaybeFilteredOldReplicaSets returns new replica set and old replica sets of the deployment. If ignoreNoPod is true, // getAllReplicaSets returns all the replica sets for the provided deployment (new and all old).
// the returned old replica sets won't include the ones with no pods; otherwise, all old replica sets will be returned. func (dc *DeploymentController) getAllReplicaSets(deployment extensions.Deployment) (*extensions.ReplicaSet, []*extensions.ReplicaSet, error) {
func (dc *DeploymentController) getNewAndMaybeFilteredOldReplicaSets(deployment extensions.Deployment, ignoreNoPod bool) (*extensions.ReplicaSet, []*extensions.ReplicaSet, error) { _, allOldRSs, err := dc.getOldReplicaSets(deployment)
oldRSs, allOldRSs, err := dc.getOldReplicaSets(deployment)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
@@ -604,23 +599,8 @@ func (dc *DeploymentController) getNewAndMaybeFilteredOldReplicaSets(deployment
} }
} }
if !ignoreNoPod {
return newRS, allOldRSs, nil return newRS, allOldRSs, nil
} }
return newRS, oldRSs, nil
}
// getNewAndOldReplicaSets returns new replica set and old replica sets of the deployment.
// Note that the returned old replica sets don't include the ones with no pods.
func (dc *DeploymentController) getNewAndOldReplicaSets(deployment extensions.Deployment) (*extensions.ReplicaSet, []*extensions.ReplicaSet, error) {
return dc.getNewAndMaybeFilteredOldReplicaSets(deployment, true)
}
// getNewAndAllOldReplicaSets returns new replica set and old replica sets of the deployment.
// Note that all old replica sets are returned, include the ones with no pods.
func (dc *DeploymentController) getNewAndAllOldReplicaSets(deployment extensions.Deployment) (*extensions.ReplicaSet, []*extensions.ReplicaSet, error) {
return dc.getNewAndMaybeFilteredOldReplicaSets(deployment, false)
}
func maxRevision(allRSs []*extensions.ReplicaSet) int64 { func maxRevision(allRSs []*extensions.ReplicaSet) int64 {
max := int64(0) max := int64(0)

View File

@@ -2117,7 +2117,7 @@ func waitForDeploymentOldRSsNum(c *clientset.Clientset, ns, deploymentName strin
if err != nil { if err != nil {
return false, err return false, err
} }
oldRSs, _, err := deploymentutil.GetOldReplicaSets(*deployment, c) _, oldRSs, err := deploymentutil.GetOldReplicaSets(*deployment, c)
if err != nil { if err != nil {
return false, err return false, err
} }