106 lines
3.2 KiB
Go
106 lines
3.2 KiB
Go
|
/*
|
||
|
Copyright 2016 The Kubernetes Authors.
|
||
|
|
||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
you may not use this file except in compliance with the License.
|
||
|
You may obtain a copy of the License at
|
||
|
|
||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||
|
|
||
|
Unless required by applicable law or agreed to in writing, software
|
||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
See the License for the specific language governing permissions and
|
||
|
limitations under the License.
|
||
|
*/
|
||
|
|
||
|
package deployment
|
||
|
|
||
|
import (
|
||
|
extensions "k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
|
||
|
"k8s.io/kubernetes/pkg/controller"
|
||
|
)
|
||
|
|
||
|
// rolloutRecreate implements the logic for recreating a replica set.
|
||
|
func (dc *DeploymentController) rolloutRecreate(deployment *extensions.Deployment) error {
|
||
|
// Don't create a new RS if not already existed, so that we avoid scaling up before scaling down
|
||
|
newRS, oldRSs, err := dc.getAllReplicaSetsAndSyncRevision(deployment, false)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
allRSs := append(oldRSs, newRS)
|
||
|
activeOldRSs := controller.FilterActiveReplicaSets(oldRSs)
|
||
|
|
||
|
// scale down old replica sets
|
||
|
scaledDown, err := dc.scaleDownOldReplicaSetsForRecreate(activeOldRSs, deployment)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
if scaledDown {
|
||
|
// Update DeploymentStatus
|
||
|
return dc.syncRolloutStatus(allRSs, newRS, deployment)
|
||
|
}
|
||
|
|
||
|
newStatus := calculateStatus(allRSs, newRS, deployment)
|
||
|
// Do not process a deployment when it has old pods running.
|
||
|
if newStatus.UpdatedReplicas == 0 {
|
||
|
podList, err := dc.listPods(deployment)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
if len(podList.Items) > 0 {
|
||
|
return dc.syncRolloutStatus(allRSs, newRS, deployment)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// If we need to create a new RS, create it now
|
||
|
// TODO: Create a new RS without re-listing all RSs.
|
||
|
if newRS == nil {
|
||
|
newRS, oldRSs, err = dc.getAllReplicaSetsAndSyncRevision(deployment, true)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
allRSs = append(oldRSs, newRS)
|
||
|
}
|
||
|
|
||
|
// scale up new replica set
|
||
|
scaledUp, err := dc.scaleUpNewReplicaSetForRecreate(newRS, deployment)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
if scaledUp {
|
||
|
// Update DeploymentStatus
|
||
|
return dc.syncRolloutStatus(allRSs, newRS, deployment)
|
||
|
}
|
||
|
|
||
|
// Sync deployment status
|
||
|
return dc.syncRolloutStatus(allRSs, newRS, deployment)
|
||
|
}
|
||
|
|
||
|
// scaleDownOldReplicaSetsForRecreate scales down old replica sets when deployment strategy is "Recreate"
|
||
|
func (dc *DeploymentController) scaleDownOldReplicaSetsForRecreate(oldRSs []*extensions.ReplicaSet, deployment *extensions.Deployment) (bool, error) {
|
||
|
scaled := false
|
||
|
for i := range oldRSs {
|
||
|
rs := oldRSs[i]
|
||
|
// Scaling not required.
|
||
|
if *(rs.Spec.Replicas) == 0 {
|
||
|
continue
|
||
|
}
|
||
|
scaledRS, updatedRS, err := dc.scaleReplicaSetAndRecordEvent(rs, 0, deployment)
|
||
|
if err != nil {
|
||
|
return false, err
|
||
|
}
|
||
|
if scaledRS {
|
||
|
oldRSs[i] = updatedRS
|
||
|
scaled = true
|
||
|
}
|
||
|
}
|
||
|
return scaled, nil
|
||
|
}
|
||
|
|
||
|
// scaleUpNewReplicaSetForRecreate scales up new replica set when deployment strategy is "Recreate"
|
||
|
func (dc *DeploymentController) scaleUpNewReplicaSetForRecreate(newRS *extensions.ReplicaSet, deployment *extensions.Deployment) (bool, error) {
|
||
|
scaled, _, err := dc.scaleReplicaSetAndRecordEvent(newRS, *(deployment.Spec.Replicas), deployment)
|
||
|
return scaled, err
|
||
|
}
|