github.com/mook-as/cf-cli@v7.0.0-beta.28.0.20200120190804-b91c115fae48+incompatible/command/v7/restart_command.go (about) 1 package v7 2 3 import ( 4 "code.cloudfoundry.org/cli/actor/sharedaction" 5 "code.cloudfoundry.org/cli/actor/v7action" 6 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant" 7 "code.cloudfoundry.org/cli/command" 8 "code.cloudfoundry.org/cli/command/flag" 9 "code.cloudfoundry.org/cli/command/v7/shared" 10 "code.cloudfoundry.org/clock" 11 ) 12 13 //go:generate counterfeiter . RestartActor 14 15 type RestartActor interface { 16 GetApplicationByNameAndSpace(appName string, spaceGUID string) (v7action.Application, v7action.Warnings, error) 17 GetDetailedAppSummary(appName string, spaceGUID string, withObfuscatedValues bool) (v7action.DetailedApplicationSummary, v7action.Warnings, error) 18 PollStart(appGUID string, noWait bool) (v7action.Warnings, error) 19 StartApplication(appGUID string) (v7action.Warnings, error) 20 StopApplication(appGUID string) (v7action.Warnings, error) 21 CreateDeployment(appGUID string, dropletGUID string) (string, v7action.Warnings, error) 22 PollStartForRolling(appGUID string, deploymentGUID string, noWait bool) (v7action.Warnings, error) 23 } 24 25 type RestartCommand struct { 26 RequiredArgs flag.AppName `positional-args:"yes"` 27 Strategy flag.DeploymentStrategy `long:"strategy" description:"Deployment strategy, either rolling or null."` 28 NoWait bool `long:"no-wait" description:"Do not wait for the long-running operation to complete; push exits when one instance of the web process is healthy"` 29 usage interface{} `usage:"CF_NAME restart APP_NAME"` 30 relatedCommands interface{} `related_commands:"restage, restart-app-instance"` 31 envCFStagingTimeout interface{} `environmentName:"CF_STAGING_TIMEOUT" environmentDescription:"Max wait time for staging, in minutes" environmentDefault:"15"` 32 envCFStartupTimeout interface{} `environmentName:"CF_STARTUP_TIMEOUT" environmentDescription:"Max wait time for app instance startup, in minutes" environmentDefault:"5"` 33 34 UI command.UI 35 Config command.Config 36 SharedActor command.SharedActor 37 Actor RestartActor 38 } 39 40 func (cmd *RestartCommand) Setup(config command.Config, ui command.UI) error { 41 cmd.UI = ui 42 cmd.Config = config 43 cmd.SharedActor = sharedaction.NewActor(config) 44 45 ccClient, _, err := shared.GetNewClientsAndConnectToCF(config, ui, "") 46 if err != nil { 47 return err 48 } 49 50 cmd.Actor = v7action.NewActor(ccClient, config, nil, nil, clock.NewClock()) 51 52 return nil 53 } 54 55 func (cmd RestartCommand) Execute(args []string) error { 56 err := cmd.SharedActor.CheckTarget(true, true) 57 if err != nil { 58 return err 59 } 60 61 user, err := cmd.Config.CurrentUser() 62 if err != nil { 63 return err 64 } 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 cmd.UI.DisplayTextWithFlavor("Restarting app {{.AppName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.Username}}...\n", map[string]interface{}{ 72 "AppName": cmd.RequiredArgs.AppName, 73 "OrgName": cmd.Config.TargetedOrganization().Name, 74 "SpaceName": cmd.Config.TargetedSpace().Name, 75 "Username": user.Name, 76 }) 77 switch cmd.Strategy.Name { 78 case constant.DeploymentStrategyRolling: 79 err = cmd.zeroDowntimeRestart(app) 80 default: 81 err = cmd.downtimeRestart(app) 82 } 83 if err != nil { 84 return err 85 } 86 87 appSummaryDisplayer := shared.NewAppSummaryDisplayer(cmd.UI) 88 summary, warnings, err := cmd.Actor.GetDetailedAppSummary( 89 cmd.RequiredArgs.AppName, 90 cmd.Config.TargetedSpace().GUID, 91 false, 92 ) 93 cmd.UI.DisplayWarnings(warnings) 94 if err != nil { 95 return err 96 } 97 appSummaryDisplayer.AppDisplay(summary, false) 98 99 return nil 100 } 101 102 func (cmd RestartCommand) downtimeRestart(app v7action.Application) error { 103 var warnings v7action.Warnings 104 var err error 105 if app.Started() { 106 cmd.UI.DisplayText("Stopping app...\n") 107 108 warnings, err = cmd.Actor.StopApplication(app.GUID) 109 cmd.UI.DisplayWarnings(warnings) 110 if err != nil { 111 return err 112 } 113 } 114 115 warnings, err = cmd.Actor.StartApplication(app.GUID) 116 cmd.UI.DisplayWarnings(warnings) 117 if err != nil { 118 return err 119 } 120 121 cmd.UI.DisplayText("Waiting for app to start...\n") 122 warnings, err = cmd.Actor.PollStart(app.GUID, cmd.NoWait) 123 cmd.UI.DisplayWarnings(warnings) 124 return err 125 } 126 127 func (cmd RestartCommand) zeroDowntimeRestart(app v7action.Application) error { 128 cmd.UI.DisplayText("Creating deployment for app {{.AppName}}...\n", 129 map[string]interface{}{ 130 "AppName": cmd.RequiredArgs.AppName, 131 }, 132 ) 133 134 deploymentGUID, warnings, err := cmd.Actor.CreateDeployment(app.GUID, "") 135 cmd.UI.DisplayWarnings(warnings) 136 if err != nil { 137 return err 138 } 139 140 cmd.UI.DisplayText("Waiting for app to deploy...\n") 141 warnings, err = cmd.Actor.PollStartForRolling(app.GUID, deploymentGUID, cmd.NoWait) 142 cmd.UI.DisplayWarnings(warnings) 143 if err != nil { 144 return err 145 } 146 return err 147 }