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