// SetCondition adds/replaces the given condition in the replication controller status. func SetCondition(status *api.ReplicationControllerStatus, condition api.ReplicationControllerCondition) { currentCond := GetCondition(*status, condition.Type) if currentCond != nil && currentCond.Status == condition.Status && currentCond.Reason == condition.Reason { return } newConditions := filterOutCondition(status.Conditions, condition.Type) status.Conditions = append(newConditions, condition) }
// updateReplicationControllerStatus attempts to update the Status.Replicas of the given controller, with a single GET/PUT retry. func updateReplicationControllerStatus(c unversionedcore.ReplicationControllerInterface, rc api.ReplicationController, newStatus api.ReplicationControllerStatus) (updateErr error) { // This is the steady state. It happens when the rc doesn't have any expectations, since // we do a periodic relist every 30s. If the generations differ but the replicas are // the same, a caller might've resized to the same replica count. if rc.Status.Replicas == newStatus.Replicas && rc.Status.FullyLabeledReplicas == newStatus.FullyLabeledReplicas && rc.Status.ReadyReplicas == newStatus.ReadyReplicas && rc.Status.AvailableReplicas == newStatus.AvailableReplicas && rc.Generation == rc.Status.ObservedGeneration && reflect.DeepEqual(rc.Status.Conditions, newStatus.Conditions) { return nil } // Save the generation number we acted on, otherwise we might wrongfully indicate // that we've seen a spec update when we retry. // TODO: This can clobber an update if we allow multiple agents to write to the // same status. newStatus.ObservedGeneration = rc.Generation var getErr error for i, rc := 0, &rc; ; i++ { glog.V(4).Infof(fmt.Sprintf("Updating replica count for rc: %s/%s, ", rc.Namespace, rc.Name) + fmt.Sprintf("replicas %d->%d (need %d), ", rc.Status.Replicas, newStatus.Replicas, rc.Spec.Replicas) + fmt.Sprintf("fullyLabeledReplicas %d->%d, ", rc.Status.FullyLabeledReplicas, newStatus.FullyLabeledReplicas) + fmt.Sprintf("readyReplicas %d->%d, ", rc.Status.ReadyReplicas, newStatus.ReadyReplicas) + fmt.Sprintf("availableReplicas %d->%d, ", rc.Status.AvailableReplicas, newStatus.AvailableReplicas) + fmt.Sprintf("sequence No: %v->%v", rc.Status.ObservedGeneration, newStatus.ObservedGeneration)) rc.Status = newStatus _, updateErr = c.UpdateStatus(rc) if updateErr == nil || i >= statusUpdateRetries { return updateErr } // Update the controller with the latest resource version for the next poll if rc, getErr = c.Get(rc.Name); getErr != nil { // If the GET fails we can't trust status.Replicas anymore. This error // is bound to be more interesting than the update failure. return getErr } } }
// RemoveCondition removes the condition with the provided type from the replication controller status. func RemoveCondition(status *api.ReplicationControllerStatus, condType api.ReplicationControllerConditionType) { status.Conditions = filterOutCondition(status.Conditions, condType) }