github.com/dcarley/cf-cli@v6.24.1-0.20170220111324-4225ff346898+incompatible/command/v2/start_command.go (about) 1 package v2 2 3 import ( 4 "os" 5 6 "github.com/cloudfoundry/noaa/consumer" 7 8 "code.cloudfoundry.org/cli/actor/sharedaction" 9 "code.cloudfoundry.org/cli/actor/v2action" 10 oldCmd "code.cloudfoundry.org/cli/cf/cmd" 11 "code.cloudfoundry.org/cli/command" 12 "code.cloudfoundry.org/cli/command/flag" 13 "code.cloudfoundry.org/cli/command/v2/shared" 14 ) 15 16 //go:generate counterfeiter . StartActor 17 18 type StartActor interface { 19 GetApplicationByNameAndSpace(name string, spaceGUID string) (v2action.Application, v2action.Warnings, error) 20 GetApplicationSummaryByNameAndSpace(name string, spaceGUID string) (v2action.ApplicationSummary, v2action.Warnings, error) 21 StartApplication(app v2action.Application, client v2action.NOAAClient, config v2action.Config) (<-chan *v2action.LogMessage, <-chan error, <-chan string, <-chan error) 22 } 23 24 type StartCommand struct { 25 RequiredArgs flag.AppName `positional-args:"yes"` 26 usage interface{} `usage:"CF_NAME start APP_NAME"` 27 envCFStagingTimeout interface{} `environmentName:"CF_STAGING_TIMEOUT" environmentDescription:"Max wait time for buildpack staging, in minutes" environmentDefault:"15"` 28 envCFStartupTimeout interface{} `environmentName:"CF_STARTUP_TIMEOUT" environmentDescription:"Max wait time for app instance startup, in minutes" environmentDefault:"5"` 29 30 UI command.UI 31 Config command.Config 32 SharedActor command.SharedActor 33 Actor StartActor 34 NOAAClient *consumer.Consumer 35 } 36 37 func (cmd *StartCommand) Setup(config command.Config, ui command.UI) error { 38 cmd.UI = ui 39 cmd.Config = config 40 cmd.SharedActor = sharedaction.NewActor() 41 42 ccClient, uaaClient, err := shared.NewClients(config, ui) 43 if err != nil { 44 return err 45 } 46 cmd.Actor = v2action.NewActor(ccClient, uaaClient) 47 48 cmd.NOAAClient = shared.NewNOAAClient(ccClient.DopplerEndpoint(), config, uaaClient, ui) 49 50 return nil 51 } 52 53 func (cmd StartCommand) Execute(args []string) error { 54 if cmd.Config.Experimental() == false { 55 oldCmd.Main(os.Getenv("CF_TRACE"), os.Args) 56 return nil 57 } 58 59 cmd.UI.DisplayText(command.ExperimentalWarning) 60 cmd.UI.DisplayNewline() 61 62 err := cmd.SharedActor.CheckTarget(cmd.Config, true, true) 63 if err != nil { 64 return shared.HandleError(err) 65 } 66 67 user, err := cmd.Config.CurrentUser() 68 if err != nil { 69 return shared.HandleError(err) 70 } 71 72 cmd.UI.DisplayTextWithFlavor("Starting app {{.AppName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.CurrentUser}}...", 73 map[string]interface{}{ 74 "AppName": cmd.RequiredArgs.AppName, 75 "OrgName": cmd.Config.TargetedOrganization().Name, 76 "SpaceName": cmd.Config.TargetedSpace().Name, 77 "CurrentUser": user.Name, 78 }) 79 80 app, warnings, err := cmd.Actor.GetApplicationByNameAndSpace(cmd.RequiredArgs.AppName, cmd.Config.TargetedSpace().GUID) 81 cmd.UI.DisplayWarnings(warnings) 82 if err != nil { 83 return shared.HandleError(err) 84 } 85 86 if app.Started() { 87 cmd.UI.DisplayText("App {{.AppName}} is already started", 88 map[string]interface{}{ 89 "AppName": cmd.RequiredArgs.AppName, 90 }) 91 return nil 92 } 93 94 messages, logErrs, apiWarnings, errs := cmd.Actor.StartApplication(app, cmd.NOAAClient, cmd.Config) 95 cmd.UI.DisplayNewline() 96 97 dance: 98 for { 99 select { 100 case message, ok := <-messages: 101 if !ok { 102 break dance 103 } 104 cmd.UI.DisplayLogMessage(message, false) 105 case warning, ok := <-apiWarnings: 106 if !ok { 107 break dance 108 } 109 cmd.UI.DisplayWarning(warning) 110 case logErr, ok := <-logErrs: 111 if !ok { 112 break dance 113 } 114 return shared.HandleError(logErr) 115 case apiErr, ok := <-errs: 116 if !ok { 117 break dance 118 } 119 if stgErr, ok := apiErr.(v2action.StagingFailedError); ok { 120 return shared.StagingFailedError{ 121 BinaryName: cmd.Config.BinaryName(), 122 Message: stgErr.Error(), 123 } 124 } 125 return shared.HandleError(apiErr) 126 } 127 } 128 129 cmd.UI.DisplayNewline() 130 131 appSummary, warnings, err := cmd.Actor.GetApplicationSummaryByNameAndSpace(cmd.RequiredArgs.AppName, cmd.Config.TargetedSpace().GUID) 132 cmd.UI.DisplayWarnings(warnings) 133 if err != nil { 134 return shared.HandleError(err) 135 } 136 137 shared.DisplayAppSummary(cmd.UI, appSummary, true) 138 return nil 139 }