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