// ValidatePetSetUpdate tests if required fields in the PetSet are set. func ValidatePetSetUpdate(petSet, oldPetSet *apps.PetSet) field.ErrorList { allErrs := field.ErrorList{} // TODO: For now we're taking the safe route and disallowing all updates to spec except for Spec.Replicas. // Enable on a case by case basis. restoreReplicas := petSet.Spec.Replicas petSet.Spec.Replicas = oldPetSet.Spec.Replicas // The generation changes for this update restoreGeneration := petSet.Generation petSet.Generation = oldPetSet.Generation if !reflect.DeepEqual(petSet, oldPetSet) { allErrs = append(allErrs, field.Forbidden(field.NewPath("spec"), "updates to petset spec for fields other than 'replicas' are forbidden.")) } petSet.Spec.Replicas = restoreReplicas petSet.Generation = restoreGeneration allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(petSet.Spec.Replicas), field.NewPath("spec", "replicas"))...) return allErrs }
// updatePetCount attempts to update the Status.Replicas of the given PetSet, with a single GET/PUT retry. func updatePetCount(kubeClient *client.Client, ps apps.PetSet, numPets int) (updateErr error) { if ps.Status.Replicas == numPets || kubeClient == nil { return nil } psClient := kubeClient.Apps().PetSets(ps.Namespace) var getErr error for i, ps := 0, &ps; ; i++ { glog.V(4).Infof(fmt.Sprintf("Updating replica count for PetSet: %s/%s, ", ps.Namespace, ps.Name) + fmt.Sprintf("replicas %d->%d (need %d), ", ps.Status.Replicas, numPets, ps.Spec.Replicas)) ps.Status = apps.PetSetStatus{Replicas: numPets} _, updateErr = psClient.UpdateStatus(ps) if updateErr == nil || i >= statusUpdateRetries { return updateErr } if ps, getErr = psClient.Get(ps.Name); getErr != nil { return getErr } } }