code.cloudfoundry.org/cli@v7.1.0+incompatible/command/v7/rollback_command.go (about)

     1  package v7
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"code.cloudfoundry.org/cli/cf/errors"
     7  	"code.cloudfoundry.org/cli/command"
     8  	"code.cloudfoundry.org/cli/command/flag"
     9  )
    10  
    11  type RollbackCommand struct {
    12  	BaseCommand
    13  
    14  	Force           bool                 `short:"f" description:"Force rollback without confirmation"`
    15  	RequiredArgs    flag.AppName         `positional-args:"yes"`
    16  	Version         flag.PositiveInteger `long:"revision" required:"true" description:"Roll back to the given app revision"`
    17  	relatedCommands interface{}          `related_commands:"revisions"`
    18  	usage           interface{}          `usage:"CF_NAME rollback APP_NAME [--revision REVISION_NUMBER] [-f]"`
    19  }
    20  
    21  func (cmd RollbackCommand) Execute(args []string) error {
    22  	cmd.UI.DisplayWarning(command.ExperimentalWarning)
    23  	cmd.UI.DisplayNewline()
    24  
    25  	targetRevision := int(cmd.Version.Value)
    26  	err := cmd.SharedActor.CheckTarget(true, true)
    27  	if err != nil {
    28  		return err
    29  	}
    30  
    31  	user, err := cmd.Config.CurrentUser()
    32  	if err != nil {
    33  		return err
    34  	}
    35  
    36  	app, warnings, _ := cmd.Actor.GetApplicationByNameAndSpace(cmd.RequiredArgs.AppName, cmd.Config.TargetedSpace().GUID)
    37  	cmd.UI.DisplayWarnings(warnings)
    38  
    39  	revisions, warnings, _ := cmd.Actor.GetRevisionsByApplicationNameAndSpace(app.Name, cmd.Config.TargetedSpace().GUID)
    40  
    41  	cmd.UI.DisplayWarnings(warnings)
    42  	if len(revisions) == 0 {
    43  		return errors.New(fmt.Sprintf("No revisions for app %s", cmd.RequiredArgs.AppName))
    44  	}
    45  	newRevision := revisions[0].Version + 1
    46  	revision, warnings, _ := cmd.Actor.GetRevisionByApplicationAndVersion(app.GUID, targetRevision)
    47  	cmd.UI.DisplayWarnings(warnings)
    48  
    49  	// TODO Localization?
    50  
    51  	if !cmd.Force {
    52  		cmd.UI.DisplayTextWithFlavor("Rolling '{{.AppName}}' back to revision '{{.TargetRevision}}' will create a new revision. The new revision '{{.NewRevision}}' will use the settings from revision '{{.TargetRevision}}'.", map[string]interface{}{
    53  			"AppName":        cmd.RequiredArgs.AppName,
    54  			"TargetRevision": targetRevision,
    55  			"NewRevision":    newRevision,
    56  		})
    57  
    58  		prompt := "Are you sure you want to continue?"
    59  		response, promptErr := cmd.UI.DisplayBoolPrompt(false, prompt, nil)
    60  
    61  		if promptErr != nil {
    62  			return promptErr
    63  		}
    64  
    65  		if !response {
    66  			cmd.UI.DisplayText("App '{{.AppName}}' has not been rolled back to revision '{{.TargetRevision}}'.", map[string]interface{}{
    67  				"AppName":        cmd.RequiredArgs.AppName,
    68  				"TargetRevision": targetRevision,
    69  			})
    70  			return nil
    71  		}
    72  	}
    73  	cmd.UI.DisplayTextWithFlavor("Rolling back to revision {{.TargetRevision}} for app {{.AppName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.Username}}...", map[string]interface{}{
    74  		"AppName":        cmd.RequiredArgs.AppName,
    75  		"TargetRevision": targetRevision,
    76  		"OrgName":        cmd.Config.TargetedOrganization().Name,
    77  		"SpaceName":      cmd.Config.TargetedSpace().Name,
    78  		"Username":       user.Name,
    79  	})
    80  	cmd.UI.DisplayNewline()
    81  
    82  	_, warnings, _ = cmd.Actor.CreateDeploymentByApplicationAndRevision(app.GUID, revision.GUID)
    83  	cmd.UI.DisplayWarnings(warnings)
    84  
    85  	cmd.UI.DisplayOK()
    86  	return nil
    87  }