diff --git a/pkg/controller/deployment/rolling_test.go b/pkg/controller/deployment/rolling_test.go index 5407a1e2c72..da929b95de7 100644 --- a/pkg/controller/deployment/rolling_test.go +++ b/pkg/controller/deployment/rolling_test.go @@ -390,6 +390,7 @@ func TestDeploymentController_scaleDownOldReplicaSetsForRollingUpdate(t *testing oldReplicas int scaleExpected bool expectedOldReplicas int + errorExpected bool }{ { deploymentReplicas: 10, @@ -398,6 +399,7 @@ func TestDeploymentController_scaleDownOldReplicaSetsForRollingUpdate(t *testing oldReplicas: 10, scaleExpected: true, expectedOldReplicas: 9, + errorExpected: false, }, { deploymentReplicas: 10, @@ -406,6 +408,7 @@ func TestDeploymentController_scaleDownOldReplicaSetsForRollingUpdate(t *testing oldReplicas: 10, scaleExpected: true, expectedOldReplicas: 8, + errorExpected: false, }, { deploymentReplicas: 10, @@ -413,6 +416,7 @@ func TestDeploymentController_scaleDownOldReplicaSetsForRollingUpdate(t *testing readyPods: 8, oldReplicas: 10, scaleExpected: false, + errorExpected: false, }, { deploymentReplicas: 10, @@ -420,6 +424,7 @@ func TestDeploymentController_scaleDownOldReplicaSetsForRollingUpdate(t *testing readyPods: 10, oldReplicas: 0, scaleExpected: false, + errorExpected: true, }, { deploymentReplicas: 10, @@ -427,6 +432,7 @@ func TestDeploymentController_scaleDownOldReplicaSetsForRollingUpdate(t *testing readyPods: 1, oldReplicas: 10, scaleExpected: false, + errorExpected: false, }, } @@ -466,7 +472,7 @@ func TestDeploymentController_scaleDownOldReplicaSetsForRollingUpdate(t *testing eventRecorder: &record.FakeRecorder{}, } scaled, err := controller.scaleDownOldReplicaSetsForRollingUpdate(allRSs, oldRSs, &deployment) - if err != nil { + if !test.errorExpected && err != nil { t.Errorf("unexpected error: %v", err) continue } diff --git a/pkg/controller/deployment/util/deployment_util.go b/pkg/controller/deployment/util/deployment_util.go index 7ca9611c58e..e09aea55a68 100644 --- a/pkg/controller/deployment/util/deployment_util.go +++ b/pkg/controller/deployment/util/deployment_util.go @@ -585,7 +585,7 @@ func GetAvailablePodsForReplicaSets(c clientset.Interface, deployment *extension // CountAvailablePodsForReplicaSets returns the number of available pods corresponding to the given pod list and replica sets. // Note that the input pod list should be the pods targeted by the deployment of input replica sets. func CountAvailablePodsForReplicaSets(podList *api.PodList, rss []*extensions.ReplicaSet, minReadySeconds int32) (int32, error) { - rsPods, err := filterPodsMatchingReplicaSets(rss, podList) + rsPods, err := filterPodsMatchingReplicaSets(rss, podList, minReadySeconds) if err != nil { return 0, err } @@ -638,8 +638,8 @@ func IsPodAvailable(pod *api.Pod, minReadySeconds int32, now time.Time) bool { } // filterPodsMatchingReplicaSets filters the given pod list and only return the ones targeted by the input replicasets -func filterPodsMatchingReplicaSets(replicaSets []*extensions.ReplicaSet, podList *api.PodList) ([]api.Pod, error) { - rsPods := []api.Pod{} +func filterPodsMatchingReplicaSets(replicaSets []*extensions.ReplicaSet, podList *api.PodList, minReadySeconds int32) ([]api.Pod, error) { + allRSPods := []api.Pod{} for _, rs := range replicaSets { matchingFunc, err := rsutil.MatchingPodsFunc(rs) if err != nil { @@ -648,9 +648,16 @@ func filterPodsMatchingReplicaSets(replicaSets []*extensions.ReplicaSet, podList if matchingFunc == nil { continue } - rsPods = append(rsPods, podutil.Filter(podList, matchingFunc)...) + rsPods := podutil.Filter(podList, matchingFunc) + avaPodsCount := countAvailablePods(rsPods, minReadySeconds) + if avaPodsCount > rs.Spec.Replicas { + msg := fmt.Sprintf("Found %s/%s with %d available pods, more than its spec replicas %d", rs.Namespace, rs.Name, avaPodsCount, rs.Spec.Replicas) + glog.Errorf("ERROR: %s", msg) + return nil, fmt.Errorf(msg) + } + allRSPods = append(allRSPods, podutil.Filter(podList, matchingFunc)...) } - return rsPods, nil + return allRSPods, nil } // Revision returns the revision number of the input replica set