Commit 92d75cbb authored by Anthony Yeh's avatar Anthony Yeh

Deployment: Use ControllerRef to list controlled objects.

Although Deployment already applied its ControllerRef to adopt matching ReplicaSets, it actually still used label selectors to list objects that it controls. That meant it didn't actually follow the rules of ControllerRef, so it could still fight with other controller types. This should mean that the special handling for overlapping Deployments is no longer necessary, since each Deployment will only see objects that it owns (via ControllerRef).
parent e82834e4
...@@ -37,7 +37,7 @@ go_library( ...@@ -37,7 +37,7 @@ go_library(
"//vendor:k8s.io/apimachinery/pkg/api/errors", "//vendor:k8s.io/apimachinery/pkg/api/errors",
"//vendor:k8s.io/apimachinery/pkg/apis/meta/v1", "//vendor:k8s.io/apimachinery/pkg/apis/meta/v1",
"//vendor:k8s.io/apimachinery/pkg/labels", "//vendor:k8s.io/apimachinery/pkg/labels",
"//vendor:k8s.io/apimachinery/pkg/runtime/schema", "//vendor:k8s.io/apimachinery/pkg/types",
"//vendor:k8s.io/apimachinery/pkg/util/errors", "//vendor:k8s.io/apimachinery/pkg/util/errors",
"//vendor:k8s.io/apimachinery/pkg/util/runtime", "//vendor:k8s.io/apimachinery/pkg/util/runtime",
"//vendor:k8s.io/apimachinery/pkg/util/wait", "//vendor:k8s.io/apimachinery/pkg/util/wait",
......
...@@ -23,6 +23,7 @@ import ( ...@@ -23,6 +23,7 @@ import (
"github.com/golang/glog" "github.com/golang/glog"
"k8s.io/apimachinery/pkg/types"
"k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/api/v1"
extensions "k8s.io/kubernetes/pkg/apis/extensions/v1beta1" extensions "k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
"k8s.io/kubernetes/pkg/controller/deployment/util" "k8s.io/kubernetes/pkg/controller/deployment/util"
...@@ -33,12 +34,12 @@ import ( ...@@ -33,12 +34,12 @@ import (
// and when new pods scale up or old pods scale down. Progress is not estimated for paused // and when new pods scale up or old pods scale down. Progress is not estimated for paused
// deployments or when users don't really care about it ie. progressDeadlineSeconds is not // deployments or when users don't really care about it ie. progressDeadlineSeconds is not
// specified. // specified.
func (dc *DeploymentController) hasFailed(d *extensions.Deployment) (bool, error) { func (dc *DeploymentController) hasFailed(d *extensions.Deployment, rsList []*extensions.ReplicaSet, podMap map[types.UID]*v1.PodList) (bool, error) {
if d.Spec.ProgressDeadlineSeconds == nil || d.Spec.RollbackTo != nil || d.Spec.Paused { if d.Spec.ProgressDeadlineSeconds == nil || d.Spec.RollbackTo != nil || d.Spec.Paused {
return false, nil return false, nil
} }
newRS, oldRSs, err := dc.getAllReplicaSetsAndSyncRevision(d, false) newRS, oldRSs, err := dc.getAllReplicaSetsAndSyncRevision(d, rsList, podMap, false)
if err != nil { if err != nil {
return false, err return false, err
} }
......
...@@ -17,14 +17,16 @@ limitations under the License. ...@@ -17,14 +17,16 @@ limitations under the License.
package deployment package deployment
import ( import (
"k8s.io/apimachinery/pkg/types"
"k8s.io/kubernetes/pkg/api/v1"
extensions "k8s.io/kubernetes/pkg/apis/extensions/v1beta1" extensions "k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
"k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/controller"
) )
// rolloutRecreate implements the logic for recreating a replica set. // rolloutRecreate implements the logic for recreating a replica set.
func (dc *DeploymentController) rolloutRecreate(deployment *extensions.Deployment) error { func (dc *DeploymentController) rolloutRecreate(d *extensions.Deployment, rsList []*extensions.ReplicaSet, podMap map[types.UID]*v1.PodList) error {
// Don't create a new RS if not already existed, so that we avoid scaling up before scaling down // 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) newRS, oldRSs, err := dc.getAllReplicaSetsAndSyncRevision(d, rsList, podMap, false)
if err != nil { if err != nil {
return err return err
} }
...@@ -32,31 +34,29 @@ func (dc *DeploymentController) rolloutRecreate(deployment *extensions.Deploymen ...@@ -32,31 +34,29 @@ func (dc *DeploymentController) rolloutRecreate(deployment *extensions.Deploymen
activeOldRSs := controller.FilterActiveReplicaSets(oldRSs) activeOldRSs := controller.FilterActiveReplicaSets(oldRSs)
// scale down old replica sets // scale down old replica sets
scaledDown, err := dc.scaleDownOldReplicaSetsForRecreate(activeOldRSs, deployment) scaledDown, err := dc.scaleDownOldReplicaSetsForRecreate(activeOldRSs, d)
if err != nil { if err != nil {
return err return err
} }
if scaledDown { if scaledDown {
// Update DeploymentStatus // Update DeploymentStatus
return dc.syncRolloutStatus(allRSs, newRS, deployment) return dc.syncRolloutStatus(allRSs, newRS, d)
} }
newStatus := calculateStatus(allRSs, newRS, deployment) newStatus := calculateStatus(allRSs, newRS, d)
// Do not process a deployment when it has old pods running. // Do not process a deployment when it has old pods running.
if newStatus.UpdatedReplicas == 0 { if newStatus.UpdatedReplicas == 0 {
podList, err := dc.listPods(deployment) for _, podList := range podMap {
if err != nil { if len(podList.Items) > 0 {
return err return dc.syncRolloutStatus(allRSs, newRS, d)
} }
if len(podList.Items) > 0 {
return dc.syncRolloutStatus(allRSs, newRS, deployment)
} }
} }
// If we need to create a new RS, create it now // If we need to create a new RS, create it now
// TODO: Create a new RS without re-listing all RSs. // TODO: Create a new RS without re-listing all RSs.
if newRS == nil { if newRS == nil {
newRS, oldRSs, err = dc.getAllReplicaSetsAndSyncRevision(deployment, true) newRS, oldRSs, err = dc.getAllReplicaSetsAndSyncRevision(d, rsList, podMap, true)
if err != nil { if err != nil {
return err return err
} }
...@@ -64,17 +64,17 @@ func (dc *DeploymentController) rolloutRecreate(deployment *extensions.Deploymen ...@@ -64,17 +64,17 @@ func (dc *DeploymentController) rolloutRecreate(deployment *extensions.Deploymen
} }
// scale up new replica set // scale up new replica set
scaledUp, err := dc.scaleUpNewReplicaSetForRecreate(newRS, deployment) scaledUp, err := dc.scaleUpNewReplicaSetForRecreate(newRS, d)
if err != nil { if err != nil {
return err return err
} }
if scaledUp { if scaledUp {
// Update DeploymentStatus // Update DeploymentStatus
return dc.syncRolloutStatus(allRSs, newRS, deployment) return dc.syncRolloutStatus(allRSs, newRS, d)
} }
// Sync deployment status // Sync deployment status
return dc.syncRolloutStatus(allRSs, newRS, deployment) return dc.syncRolloutStatus(allRSs, newRS, d)
} }
// scaleDownOldReplicaSetsForRecreate scales down old replica sets when deployment strategy is "Recreate" // scaleDownOldReplicaSetsForRecreate scales down old replica sets when deployment strategy is "Recreate"
......
...@@ -21,14 +21,15 @@ import ( ...@@ -21,14 +21,15 @@ import (
"github.com/golang/glog" "github.com/golang/glog"
"k8s.io/apimachinery/pkg/types"
"k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/api/v1"
extensions "k8s.io/kubernetes/pkg/apis/extensions/v1beta1" extensions "k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util" deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util"
) )
// rollback the deployment to the specified revision. In any case cleanup the rollback spec. // rollback the deployment to the specified revision. In any case cleanup the rollback spec.
func (dc *DeploymentController) rollback(d *extensions.Deployment) error { func (dc *DeploymentController) rollback(d *extensions.Deployment, rsList []*extensions.ReplicaSet, podMap map[types.UID]*v1.PodList) error {
newRS, allOldRSs, err := dc.getAllReplicaSetsAndSyncRevision(d, true) newRS, allOldRSs, err := dc.getAllReplicaSetsAndSyncRevision(d, rsList, podMap, true)
if err != nil { if err != nil {
return err return err
} }
......
...@@ -21,42 +21,44 @@ import ( ...@@ -21,42 +21,44 @@ import (
"sort" "sort"
"github.com/golang/glog" "github.com/golang/glog"
"k8s.io/apimachinery/pkg/types"
"k8s.io/client-go/util/integer" "k8s.io/client-go/util/integer"
"k8s.io/kubernetes/pkg/api/v1"
extensions "k8s.io/kubernetes/pkg/apis/extensions/v1beta1" extensions "k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
"k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/controller"
deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util" deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util"
) )
// rolloutRolling implements the logic for rolling a new replica set. // rolloutRolling implements the logic for rolling a new replica set.
func (dc *DeploymentController) rolloutRolling(deployment *extensions.Deployment) error { func (dc *DeploymentController) rolloutRolling(d *extensions.Deployment, rsList []*extensions.ReplicaSet, podMap map[types.UID]*v1.PodList) error {
newRS, oldRSs, err := dc.getAllReplicaSetsAndSyncRevision(deployment, true) newRS, oldRSs, err := dc.getAllReplicaSetsAndSyncRevision(d, rsList, podMap, true)
if err != nil { if err != nil {
return err return err
} }
allRSs := append(oldRSs, newRS) allRSs := append(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, d)
if err != nil { if err != nil {
return err return err
} }
if scaledUp { if scaledUp {
// Update DeploymentStatus // Update DeploymentStatus
return dc.syncRolloutStatus(allRSs, newRS, deployment) return dc.syncRolloutStatus(allRSs, newRS, d)
} }
// Scale down, if we can. // Scale down, if we can.
scaledDown, err := dc.reconcileOldReplicaSets(allRSs, controller.FilterActiveReplicaSets(oldRSs), newRS, deployment) scaledDown, err := dc.reconcileOldReplicaSets(allRSs, controller.FilterActiveReplicaSets(oldRSs), newRS, d)
if err != nil { if err != nil {
return err return err
} }
if scaledDown { if scaledDown {
// Update DeploymentStatus // Update DeploymentStatus
return dc.syncRolloutStatus(allRSs, newRS, deployment) return dc.syncRolloutStatus(allRSs, newRS, d)
} }
// Sync deployment status // Sync deployment status
return dc.syncRolloutStatus(allRSs, newRS, deployment) return dc.syncRolloutStatus(allRSs, newRS, d)
} }
func (dc *DeploymentController) reconcileNewReplicaSet(allRSs []*extensions.ReplicaSet, newRS *extensions.ReplicaSet, deployment *extensions.Deployment) (bool, error) { func (dc *DeploymentController) reconcileNewReplicaSet(allRSs []*extensions.ReplicaSet, newRS *extensions.ReplicaSet, deployment *extensions.Deployment) (bool, error) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment