github.com/LukasHeimann/cloudfoundrycli/v8@v8.4.4/command/v7/rollback_command.go (about)

     1  package v7
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/LukasHeimann/cloudfoundrycli/v8/actor/sharedaction"
     7  	"github.com/LukasHeimann/cloudfoundrycli/v8/api/cloudcontroller/ccv3/constant"
     8  	"github.com/LukasHeimann/cloudfoundrycli/v8/cf/errors"
     9  	"github.com/LukasHeimann/cloudfoundrycli/v8/command"
    10  	"github.com/LukasHeimann/cloudfoundrycli/v8/command/flag"
    11  	"github.com/LukasHeimann/cloudfoundrycli/v8/command/v7/shared"
    12  )
    13  
    14  type RollbackCommand struct {
    15  	BaseCommand
    16  
    17  	Force           bool          `short:"f" description:"Force rollback without confirmation"`
    18  	RequiredArgs    flag.AppName  `positional-args:"yes"`
    19  	Version         flag.Revision `long:"version" required:"true" description:"Roll back to the specified revision"`
    20  	relatedCommands interface{}   `related_commands:"revisions"`
    21  	usage           interface{}   `usage:"CF_NAME rollback APP_NAME [--version VERSION] [-f]"`
    22  
    23  	LogCacheClient sharedaction.LogCacheClient
    24  	Stager         shared.AppStager
    25  }
    26  
    27  func (cmd *RollbackCommand) Setup(config command.Config, ui command.UI) error {
    28  	err := cmd.BaseCommand.Setup(config, ui)
    29  	if err != nil {
    30  		return err
    31  	}
    32  
    33  	cmd.Stager = shared.NewAppStager(cmd.Actor, cmd.UI, cmd.Config, cmd.LogCacheClient)
    34  	return nil
    35  }
    36  
    37  func (cmd RollbackCommand) Execute(args []string) error {
    38  	cmd.UI.DisplayWarning(command.ExperimentalWarning)
    39  	cmd.UI.DisplayNewline()
    40  
    41  	targetRevision := int(cmd.Version.Value)
    42  	err := cmd.SharedActor.CheckTarget(true, true)
    43  	if err != nil {
    44  		return err
    45  	}
    46  
    47  	user, err := cmd.Actor.GetCurrentUser()
    48  	if err != nil {
    49  		return err
    50  	}
    51  
    52  	app, warnings, err := cmd.Actor.GetApplicationByNameAndSpace(cmd.RequiredArgs.AppName, cmd.Config.TargetedSpace().GUID)
    53  	cmd.UI.DisplayWarnings(warnings)
    54  	if err != nil {
    55  		return err
    56  	}
    57  
    58  	revisions, warnings, err := cmd.Actor.GetRevisionsByApplicationNameAndSpace(app.Name, cmd.Config.TargetedSpace().GUID)
    59  	cmd.UI.DisplayWarnings(warnings)
    60  	if err != nil {
    61  		return err
    62  	}
    63  
    64  	if len(revisions) == 0 {
    65  		return errors.New(fmt.Sprintf("No revisions for app %s", cmd.RequiredArgs.AppName))
    66  	}
    67  
    68  	revision, warnings, err := cmd.Actor.GetRevisionByApplicationAndVersion(app.GUID, targetRevision)
    69  	cmd.UI.DisplayWarnings(warnings)
    70  	if err != nil {
    71  		return err
    72  	}
    73  
    74  	if err != nil {
    75  		return err
    76  	}
    77  
    78  	// TODO Localization?
    79  	if !cmd.Force {
    80  		cmd.UI.DisplayTextWithFlavor("Rolling '{{.AppName}}' back to revision '{{.TargetRevision}}' will create a new revision. The new revision will use the settings from revision '{{.TargetRevision}}'.", map[string]interface{}{
    81  			"AppName":        cmd.RequiredArgs.AppName,
    82  			"TargetRevision": targetRevision,
    83  		})
    84  
    85  		prompt := "Are you sure you want to continue?"
    86  		response, promptErr := cmd.UI.DisplayBoolPrompt(false, prompt, nil)
    87  
    88  		if promptErr != nil {
    89  			return promptErr
    90  		}
    91  
    92  		if !response {
    93  			cmd.UI.DisplayText("App '{{.AppName}}' has not been rolled back to revision '{{.TargetRevision}}'.", map[string]interface{}{
    94  				"AppName":        cmd.RequiredArgs.AppName,
    95  				"TargetRevision": targetRevision,
    96  			})
    97  			return nil
    98  		}
    99  	}
   100  
   101  	cmd.UI.DisplayTextWithFlavor("Rolling back to revision {{.TargetRevision}} for app {{.AppName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.Username}}...", map[string]interface{}{
   102  		"AppName":        cmd.RequiredArgs.AppName,
   103  		"TargetRevision": targetRevision,
   104  		"OrgName":        cmd.Config.TargetedOrganization().Name,
   105  		"SpaceName":      cmd.Config.TargetedSpace().Name,
   106  		"Username":       user.Name,
   107  	})
   108  
   109  	startAppErr := cmd.Stager.StartApp(
   110  		app,
   111  		revision.GUID,
   112  		constant.DeploymentStrategyRolling,
   113  		false,
   114  		cmd.Config.TargetedSpace(),
   115  		cmd.Config.TargetedOrganization(),
   116  		constant.ApplicationRollingBack,
   117  	)
   118  	if startAppErr != nil {
   119  		return startAppErr
   120  	}
   121  
   122  	cmd.UI.DisplayOK()
   123  
   124  	return nil
   125  }