// Create generates a new DeploymentConfig representing a rollback. func (r *REST) Create(ctx kapi.Context, obj runtime.Object) (runtime.Object, error) { namespace, ok := kapi.NamespaceFrom(ctx) if !ok { return nil, kerrors.NewBadRequest("namespace parameter required.") } rollback, ok := obj.(*deployapi.DeploymentConfigRollback) if !ok { return nil, kerrors.NewBadRequest(fmt.Sprintf("not a rollback spec: %#v", obj)) } if errs := validation.ValidateDeploymentConfigRollback(rollback); len(errs) > 0 { return nil, kerrors.NewInvalid(deployapi.Kind("DeploymentConfigRollback"), rollback.Name, errs) } from, err := r.dn.DeploymentConfigs(namespace).Get(rollback.Name) if err != nil { return nil, newInvalidError(rollback, fmt.Sprintf("cannot get deployment config %q: %v", rollback.Name, err)) } switch from.Status.LatestVersion { case 0: return nil, newInvalidError(rollback, "cannot rollback an undeployed config") case 1: return nil, newInvalidError(rollback, fmt.Sprintf("no previous deployment exists for %q", deployutil.LabelForDeploymentConfig(from))) } revision := from.Status.LatestVersion - 1 if rollback.Spec.Revision > 0 { revision = rollback.Spec.Revision } // Find the target deployment and decode its config. name := deployutil.DeploymentNameForConfigVersion(from.Name, revision) targetDeployment, err := r.rn.ReplicationControllers(namespace).Get(name) if err != nil { return nil, newInvalidError(rollback, err.Error()) } to, err := deployutil.DecodeDeploymentConfig(targetDeployment, r.codec) if err != nil { return nil, newInvalidError(rollback, fmt.Sprintf("couldn't decode deployment config from deployment: %v", err)) } if from.Annotations == nil && len(rollback.UpdatedAnnotations) > 0 { from.Annotations = make(map[string]string) } for key, value := range rollback.UpdatedAnnotations { from.Annotations[key] = value } return r.generator.GenerateRollback(from, to, &rollback.Spec) }
// Create generates a new DeploymentConfig representing a rollback. func (s *REST) Create(ctx kapi.Context, obj runtime.Object) (runtime.Object, error) { rollback, ok := obj.(*deployapi.DeploymentConfigRollback) if !ok { return nil, kerrors.NewBadRequest(fmt.Sprintf("not a rollback spec: %#v", obj)) } if errs := validation.ValidateDeploymentConfigRollback(rollback); len(errs) > 0 { return nil, kerrors.NewInvalid("DeploymentConfigRollback", "", errs) } // Roll back "from" the current deployment "to" a target deployment // Find the target ("to") deployment and decode the DeploymentConfig targetDeployment, err := s.generator.GetDeployment(ctx, rollback.Spec.From.Name) if err != nil { if kerrors.IsNotFound(err) { return nil, newInvalidDeploymentError(rollback, "Deployment not found") } return nil, newInvalidDeploymentError(rollback, fmt.Sprintf("%v", err)) } to, err := deployutil.DecodeDeploymentConfig(targetDeployment, s.codec) if err != nil { return nil, newInvalidDeploymentError(rollback, fmt.Sprintf("couldn't decode DeploymentConfig from Deployment: %v", err)) } // Find the current ("from") version of the target deploymentConfig from, err := s.generator.GetDeploymentConfig(ctx, to.Name) if err != nil { if kerrors.IsNotFound(err) { return nil, newInvalidDeploymentError(rollback, fmt.Sprintf("couldn't find a current DeploymentConfig %s/%s", targetDeployment.Namespace, to.Name)) } return nil, newInvalidDeploymentError(rollback, fmt.Sprintf("error finding current DeploymentConfig %s/%s: %v", targetDeployment.Namespace, to.Name, err)) } return s.generator.GenerateRollback(from, to, &rollback.Spec) }