// StatefulSetHasDesiredPets returns a conditon that checks the number of petset replicas func StatefulSetHasDesiredPets(psClient appsclient.StatefulSetsGetter, petset *apps.StatefulSet) wait.ConditionFunc { // TODO: Differentiate between 0 pets and a really quick scale down using generation. return func() (bool, error) { ps, err := psClient.StatefulSets(petset.Namespace).Get(petset.Name) if err != nil { return false, err } return ps.Status.Replicas == ps.Spec.Replicas, nil } }
// updatePetCount attempts to update the Status.Replicas of the given StatefulSet, with a single GET/PUT retry. func updatePetCount(psClient appsclientset.StatefulSetsGetter, ps apps.StatefulSet, numPets int) (updateErr error) { if ps.Status.Replicas == int32(numPets) || psClient == nil { return nil } var getErr error for i, ps := 0, &ps; ; i++ { glog.V(4).Infof(fmt.Sprintf("Updating replica count for StatefulSet: %s/%s, ", ps.Namespace, ps.Name) + fmt.Sprintf("replicas %d->%d (need %d), ", ps.Status.Replicas, numPets, ps.Spec.Replicas)) ps.Status = apps.StatefulSetStatus{Replicas: int32(numPets)} _, updateErr = psClient.StatefulSets(ps.Namespace).UpdateStatus(ps) if updateErr == nil || i >= statusUpdateRetries { return updateErr } if ps, getErr = psClient.StatefulSets(ps.Namespace).Get(ps.Name); getErr != nil { return getErr } } }