Error out when any RS has more available pods then its spec replicas

This commit is contained in:
Janet Kuo 2016-07-29 16:24:02 -07:00
parent f0fa9e588f
commit 32ababbe1b
2 changed files with 19 additions and 6 deletions

View File

@ -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
}

View File

@ -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