// newHelper makes a hew helper using real clients. func newHelper(oClient client.Interface, kClient kclient.Interface) *helper { return &helper{ generateRollback: func(namespace string, config *deployapi.DeploymentConfigRollback) (*deployapi.DeploymentConfig, error) { return oClient.DeploymentConfigs(namespace).Rollback(config) }, describe: func(config *deployapi.DeploymentConfig) (string, error) { describer := describe.NewDeploymentConfigDescriberForConfig(oClient, kClient, config) return describer.Describe(config.Namespace, config.Name) }, updateConfig: func(namespace string, config *deployapi.DeploymentConfig) (*deployapi.DeploymentConfig, error) { return oClient.DeploymentConfigs(namespace).Update(config) }, } }
// Run performs a rollback. func (o *RollbackOptions) Run() error { // Get the resource referenced in the command args. obj, err := o.findResource(o.TargetName) if err != nil { return err } // Interpret the resource to resolve a target for rollback. var target *kapi.ReplicationController switch r := obj.(type) { case *kapi.ReplicationController: // A specific deployment was used. target = r case *deployapi.DeploymentConfig: // A deploymentconfig was used. Find the target deployment by the // specified version, or by a lookup of the last completed deployment if // no version was supplied. deployment, err := o.findTargetDeployment(r, o.DesiredVersion) if err != nil { return err } target = deployment } if target == nil { return fmt.Errorf("%s is not a valid deployment or deploymentconfig", o.TargetName) } // Set up the rollback and generate a new rolled back config. rollback := &deployapi.DeploymentConfigRollback{ Spec: deployapi.DeploymentConfigRollbackSpec{ From: kapi.ObjectReference{ Name: target.Name, }, IncludeTemplate: true, IncludeTriggers: o.IncludeTriggers, IncludeStrategy: o.IncludeStrategy, IncludeReplicationMeta: o.IncludeScalingSettings, }, } newConfig, err := o.oc.DeploymentConfigs(o.Namespace).Rollback(rollback) if err != nil { return err } // If this is a dry run, print and exit. if o.DryRun { describer := describe.NewDeploymentConfigDescriberForConfig(o.oc, o.kc, newConfig) description, err := describer.Describe(newConfig.Namespace, newConfig.Name) if err != nil { return err } o.out.Write([]byte(description)) return nil } // If an output format is specified, print and exit. if len(o.Format) > 0 { printer, _, err := kubectl.GetPrinter(o.Format, o.Template) if err != nil { return err } versionedPrinter := kubectl.NewVersionedPrinter(printer, kapi.Scheme, latest.Version) versionedPrinter.PrintObj(newConfig, o.out) return nil } // Perform a real rollback. rolledback, err := o.oc.DeploymentConfigs(newConfig.Namespace).Update(newConfig) if err != nil { return err } // Print warnings about any image triggers disabled during the rollback. fmt.Fprintf(o.out, "#%d rolled back to %s\n", rolledback.LatestVersion, rollback.Spec.From.Name) for _, trigger := range rolledback.Triggers { disabled := []string{} if trigger.Type == deployapi.DeploymentTriggerOnImageChange && !trigger.ImageChangeParams.Automatic { disabled = append(disabled, trigger.ImageChangeParams.From.Name) } if len(disabled) > 0 { reenable := fmt.Sprintf("oc deploy %s --enable-triggers -n %s", rolledback.Name, o.Namespace) fmt.Fprintf(o.out, "Warning: the following images triggers were disabled: %s\n You can re-enable them with: %s\n", strings.Join(disabled, ","), reenable) } } return nil }