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 }