github.com/mook-as/cf-cli@v7.0.0-beta.28.0.20200120190804-b91c115fae48+incompatible/command/v7/start_command.go (about) 1 package v7 2 3 import ( 4 "context" 5 6 "code.cloudfoundry.org/cli/actor/actionerror" 7 "code.cloudfoundry.org/cli/actor/sharedaction" 8 "code.cloudfoundry.org/cli/actor/v7action" 9 "code.cloudfoundry.org/cli/command" 10 "code.cloudfoundry.org/cli/command/flag" 11 "code.cloudfoundry.org/cli/command/v7/shared" 12 "code.cloudfoundry.org/clock" 13 ) 14 15 //go:generate counterfeiter . StartActor 16 17 type StartActor interface { 18 GetApplicationByNameAndSpace(appName string, spaceGUID string) (v7action.Application, v7action.Warnings, error) 19 GetDetailedAppSummary(appName string, spaceGUID string, withObfuscatedValues bool) (v7action.DetailedApplicationSummary, v7action.Warnings, error) 20 PollStart(appGUID string, noWait bool) (v7action.Warnings, error) 21 StartApplication(appGUID string) (v7action.Warnings, error) 22 GetUnstagedNewestPackageGUID(appGuid string) (string, v7action.Warnings, error) 23 StagePackage(packageGUID, appName, spaceGUID string) (<-chan v7action.Droplet, <-chan v7action.Warnings, <-chan error) 24 GetStreamingLogsForApplicationByNameAndSpace(appName string, spaceGUID string, client v7action.LogCacheClient) (<-chan v7action.LogMessage, <-chan error, context.CancelFunc, v7action.Warnings, error) 25 SetApplicationDroplet(appGUID string, dropletGUID string) (v7action.Warnings, error) 26 } 27 28 type StartCommand struct { 29 RequiredArgs flag.AppName `positional-args:"yes"` 30 usage interface{} `usage:"CF_NAME start APP_NAME"` 31 relatedCommands interface{} `related_commands:"apps, logs, scale, ssh, stop, restart, run-task"` 32 envCFStagingTimeout interface{} `environmentName:"CF_STAGING_TIMEOUT" environmentDescription:"Max wait time for staging, in minutes" environmentDefault:"15"` 33 envCFStartupTimeout interface{} `environmentName:"CF_STARTUP_TIMEOUT" environmentDescription:"Max wait time for app instance startup, in minutes" environmentDefault:"5"` 34 35 UI command.UI 36 Config command.Config 37 LogCacheClient v7action.LogCacheClient 38 SharedActor command.SharedActor 39 Actor StartActor 40 } 41 42 func (cmd *StartCommand) Setup(config command.Config, ui command.UI) error { 43 cmd.UI = ui 44 cmd.Config = config 45 cmd.SharedActor = sharedaction.NewActor(config) 46 47 ccClient, _, err := shared.GetNewClientsAndConnectToCF(config, ui, "") 48 if err != nil { 49 return err 50 } 51 52 cmd.Actor = v7action.NewActor(ccClient, config, nil, nil, clock.NewClock()) 53 cmd.LogCacheClient = shared.NewLogCacheClient(ccClient.Info.LogCache(), config, ui) 54 55 return nil 56 } 57 58 func (cmd StartCommand) Execute(args []string) error { 59 err := cmd.SharedActor.CheckTarget(true, true) 60 if err != nil { 61 return err 62 } 63 64 user, err := cmd.Config.CurrentUser() 65 if err != nil { 66 return err 67 } 68 69 app, warnings, err := cmd.Actor.GetApplicationByNameAndSpace(cmd.RequiredArgs.AppName, cmd.Config.TargetedSpace().GUID) 70 cmd.UI.DisplayWarnings(warnings) 71 if err != nil { 72 return err 73 } 74 75 if app.Started() { 76 cmd.UI.DisplayText("App '{{.AppName}}' is already started.", 77 map[string]interface{}{ 78 "AppName": cmd.RequiredArgs.AppName, 79 }) 80 cmd.UI.DisplayOK() 81 return nil 82 } 83 84 cmd.UI.DisplayTextWithFlavor("Starting app {{.AppName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.Username}}...", map[string]interface{}{ 85 "AppName": cmd.RequiredArgs.AppName, 86 "OrgName": cmd.Config.TargetedOrganization().Name, 87 "SpaceName": cmd.Config.TargetedSpace().Name, 88 "Username": user.Name, 89 }) 90 cmd.UI.DisplayNewline() 91 92 packageGuid, warnings, err := cmd.Actor.GetUnstagedNewestPackageGUID(app.GUID) 93 cmd.UI.DisplayWarnings(warnings) 94 if err != nil { 95 return err 96 } 97 if packageGuid != "" { 98 cmd.UI.DisplayText("Staging app and tracing logs") 99 100 logStream, logErrStream, stopLogStreamFunc, logWarnings, logErr := cmd.Actor.GetStreamingLogsForApplicationByNameAndSpace(cmd.RequiredArgs.AppName, cmd.Config.TargetedSpace().GUID, cmd.LogCacheClient) 101 cmd.UI.DisplayWarnings(logWarnings) 102 if logErr != nil { 103 return logErr 104 } 105 defer stopLogStreamFunc() 106 107 dropletStream, warningsStream, errStream := cmd.Actor.StagePackage(packageGuid, cmd.RequiredArgs.AppName, cmd.Config.TargetedSpace().GUID) 108 109 droplet, err := shared.PollStage(dropletStream, warningsStream, errStream, logStream, logErrStream, cmd.UI) 110 if err != nil { 111 return err 112 } 113 114 warnings, err = cmd.Actor.SetApplicationDroplet(app.GUID, droplet.GUID) 115 cmd.UI.DisplayWarnings(warnings) 116 if err != nil { 117 return err 118 } 119 } 120 121 cmd.UI.DisplayText("\nWaiting for app to start...") 122 123 warnings, err = cmd.Actor.StartApplication(app.GUID) 124 cmd.UI.DisplayWarnings(warnings) 125 if err != nil { 126 return err 127 } 128 129 cmd.UI.DisplayNewline() 130 131 warnings, err = cmd.Actor.PollStart(app.GUID, false) 132 cmd.UI.DisplayWarnings(warnings) 133 if err != nil { 134 if _, ok := err.(actionerror.UserNotFoundError); ok { 135 cmd.UI.DisplayTextWithFlavor(err.Error()) 136 cmd.UI.DisplayOK() 137 return nil 138 } 139 return err 140 } 141 142 appSummaryDisplayer := shared.NewAppSummaryDisplayer(cmd.UI) 143 summary, warnings, err := cmd.Actor.GetDetailedAppSummary( 144 cmd.RequiredArgs.AppName, 145 cmd.Config.TargetedSpace().GUID, 146 false, 147 ) 148 cmd.UI.DisplayWarnings(warnings) 149 if err != nil { 150 return err 151 } 152 153 appSummaryDisplayer.AppDisplay(summary, false) 154 return nil 155 }