github.com/loafoe/cli@v7.1.0+incompatible/command/v7/restage_command.go (about) 1 package v7 2 3 import ( 4 "code.cloudfoundry.org/cli/actor/actionerror" 5 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant" 6 "code.cloudfoundry.org/cli/command" 7 "code.cloudfoundry.org/cli/command/flag" 8 "code.cloudfoundry.org/cli/command/translatableerror" 9 "code.cloudfoundry.org/cli/command/v7/shared" 10 ) 11 12 type RestageCommand struct { 13 BaseCommand 14 15 RequiredArgs flag.AppName `positional-args:"yes"` 16 Strategy flag.DeploymentStrategy `long:"strategy" description:"Deployment strategy, either rolling or null."` 17 NoWait bool `long:"no-wait" description:"Exit when the first instance of the web process is healthy"` 18 usage interface{} `usage:"CF_NAME restage APP_NAME\n\n This command will cause downtime unless you use '--strategy rolling'.\n\nEXAMPLES:\n CF_NAME restage APP_NAME\n CF_NAME restage APP_NAME --strategy rolling\n CF_NAME restage APP_NAME --strategy rolling --no-wait"` 19 relatedCommands interface{} `related_commands:"restart"` 20 envCFStagingTimeout interface{} `environmentName:"CF_STAGING_TIMEOUT" environmentDescription:"Max wait time for staging, in minutes" environmentDefault:"15"` 21 envCFStartupTimeout interface{} `environmentName:"CF_STARTUP_TIMEOUT" environmentDescription:"Max wait time for app instance startup, in minutes" environmentDefault:"5"` 22 23 Stager shared.AppStager 24 } 25 26 func (cmd *RestageCommand) Setup(config command.Config, ui command.UI) error { 27 err := cmd.BaseCommand.Setup(config, ui) 28 if err != nil { 29 return err 30 } 31 32 logCacheEndpoint, _, err := cmd.Actor.GetLogCacheEndpoint() 33 if err != nil { 34 return err 35 } 36 logCacheClient := command.NewLogCacheClient(logCacheEndpoint, config, ui) 37 cmd.Stager = shared.NewAppStager(cmd.Actor, cmd.UI, cmd.Config, logCacheClient) 38 39 return nil 40 } 41 42 func (cmd RestageCommand) Execute(args []string) error { 43 err := cmd.SharedActor.CheckTarget(true, true) 44 if err != nil { 45 return err 46 } 47 48 user, err := cmd.Config.CurrentUser() 49 if err != nil { 50 return err 51 } 52 53 if cmd.Strategy.Name != constant.DeploymentStrategyRolling { 54 cmd.UI.DisplayWarning("This action will cause app downtime.") 55 } 56 57 cmd.UI.DisplayNewline() 58 cmd.UI.DisplayTextWithFlavor("Restaging app {{.AppName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.Username}}...", map[string]interface{}{ 59 "AppName": cmd.RequiredArgs.AppName, 60 "OrgName": cmd.Config.TargetedOrganization().Name, 61 "SpaceName": cmd.Config.TargetedSpace().Name, 62 "Username": user.Name, 63 }) 64 cmd.UI.DisplayNewline() 65 66 app, warnings, err := cmd.Actor.GetApplicationByNameAndSpace(cmd.RequiredArgs.AppName, cmd.Config.TargetedSpace().GUID) 67 cmd.UI.DisplayWarnings(warnings) 68 if err != nil { 69 return err 70 } 71 72 pkg, warnings, err := cmd.Actor.GetNewestReadyPackageForApplication(app) 73 cmd.UI.DisplayWarnings(warnings) 74 if err != nil { 75 return mapErr(cmd.Config, cmd.RequiredArgs.AppName, err) 76 } 77 78 err = cmd.Stager.StageAndStart( 79 app, 80 cmd.Config.TargetedSpace(), 81 cmd.Config.TargetedOrganization(), 82 pkg.GUID, 83 cmd.Strategy.Name, 84 cmd.NoWait, 85 constant.ApplicationRestarting, 86 ) 87 if err != nil { 88 return mapErr(cmd.Config, cmd.RequiredArgs.AppName, err) 89 } 90 91 return nil 92 } 93 94 func mapErr(config command.Config, appName string, err error) error { 95 switch err.(type) { 96 case actionerror.AllInstancesCrashedError: 97 return translatableerror.ApplicationUnableToStartError{ 98 AppName: appName, 99 BinaryName: config.BinaryName(), 100 } 101 case actionerror.StartupTimeoutError: 102 return translatableerror.StartupTimeoutError{ 103 AppName: appName, 104 BinaryName: config.BinaryName(), 105 } 106 case actionerror.StagingFailedNoAppDetectedError: 107 return translatableerror.StagingFailedNoAppDetectedError{ 108 Message: err.Error(), 109 BinaryName: config.BinaryName(), 110 } 111 case actionerror.NoEligiblePackagesError: 112 return translatableerror.NoEligiblePackagesError{ 113 AppName: appName, 114 BinaryName: config.BinaryName(), 115 } 116 } 117 return err 118 }