github.com/cloudfoundry-attic/cli-with-i18n@v6.32.1-0.20171002233121-7401370d3b85+incompatible/command/v3/run_task_command.go (about) 1 package v3 2 3 import ( 4 "fmt" 5 "net/http" 6 7 "code.cloudfoundry.org/cli/actor/sharedaction" 8 "code.cloudfoundry.org/cli/actor/v3action" 9 "code.cloudfoundry.org/cli/api/cloudcontroller/ccerror" 10 "code.cloudfoundry.org/cli/api/cloudcontroller/ccversion" 11 "code.cloudfoundry.org/cli/command" 12 "code.cloudfoundry.org/cli/command/flag" 13 "code.cloudfoundry.org/cli/command/translatableerror" 14 "code.cloudfoundry.org/cli/command/v3/shared" 15 ) 16 17 //go:generate counterfeiter . RunTaskActor 18 19 type RunTaskActor interface { 20 GetApplicationByNameAndSpace(appName string, spaceGUID string) (v3action.Application, v3action.Warnings, error) 21 RunTask(appGUID string, task v3action.Task) (v3action.Task, v3action.Warnings, error) 22 CloudControllerAPIVersion() string 23 } 24 25 type RunTaskCommand struct { 26 RequiredArgs flag.RunTaskArgs `positional-args:"yes"` 27 Disk flag.Megabytes `short:"k" description:"Disk limit (e.g. 256M, 1024M, 1G)"` 28 Memory flag.Megabytes `short:"m" description:"Memory limit (e.g. 256M, 1024M, 1G)"` 29 Name string `long:"name" description:"Name to give the task (generated if omitted)"` 30 usage interface{} `usage:"CF_NAME run-task APP_NAME COMMAND [-k DISK] [-m MEMORY] [--name TASK_NAME]\n\nTIP:\n Use 'cf logs' to display the logs of the app and all its tasks. If your task name is unique, grep this command's output for the task name to view task-specific logs.\n\nEXAMPLES:\n CF_NAME run-task my-app \"bundle exec rake db:migrate\" --name migrate"` 31 relatedCommands interface{} `related_commands:"logs, tasks, terminate-task"` 32 33 UI command.UI 34 Config command.Config 35 SharedActor command.SharedActor 36 Actor RunTaskActor 37 } 38 39 func (cmd *RunTaskCommand) Setup(config command.Config, ui command.UI) error { 40 cmd.UI = ui 41 cmd.Config = config 42 cmd.SharedActor = sharedaction.NewActor(config) 43 44 client, _, err := shared.NewClients(config, ui, true) 45 if err != nil { 46 if v3Err, ok := err.(ccerror.V3UnexpectedResponseError); ok && v3Err.ResponseCode == http.StatusNotFound { 47 return translatableerror.MinimumAPIVersionNotMetError{MinimumVersion: ccversion.MinVersionRunTaskV3} 48 } 49 50 return err 51 } 52 cmd.Actor = v3action.NewActor(nil, client, config) 53 54 return nil 55 } 56 57 func (cmd RunTaskCommand) Execute(args []string) error { 58 err := command.MinimumAPIVersionCheck(cmd.Actor.CloudControllerAPIVersion(), ccversion.MinVersionRunTaskV3) 59 if err != nil { 60 return err 61 } 62 63 err = cmd.SharedActor.CheckTarget(cmd.Config, true, true) 64 if err != nil { 65 return shared.HandleError(err) 66 } 67 68 space := cmd.Config.TargetedSpace() 69 70 user, err := cmd.Config.CurrentUser() 71 if err != nil { 72 return err 73 } 74 75 application, warnings, err := cmd.Actor.GetApplicationByNameAndSpace(cmd.RequiredArgs.AppName, space.GUID) 76 cmd.UI.DisplayWarnings(warnings) 77 if err != nil { 78 return shared.HandleError(err) 79 } 80 81 cmd.UI.DisplayTextWithFlavor("Creating task for app {{.AppName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.CurrentUser}}...", map[string]interface{}{ 82 "AppName": cmd.RequiredArgs.AppName, 83 "OrgName": cmd.Config.TargetedOrganization().Name, 84 "SpaceName": space.Name, 85 "CurrentUser": user.Name, 86 }) 87 88 inputTask := v3action.Task{ 89 Command: cmd.RequiredArgs.Command, 90 } 91 92 if cmd.Name != "" { 93 inputTask.Name = cmd.Name 94 } 95 if cmd.Disk.IsSet { 96 inputTask.DiskInMB = cmd.Disk.Value 97 } 98 if cmd.Memory.IsSet { 99 inputTask.MemoryInMB = cmd.Memory.Value 100 } 101 102 task, warnings, err := cmd.Actor.RunTask(application.GUID, inputTask) 103 cmd.UI.DisplayWarnings(warnings) 104 if err != nil { 105 return shared.HandleError(err) 106 } 107 108 cmd.UI.DisplayOK() 109 cmd.UI.DisplayNewline() 110 cmd.UI.DisplayText("Task has been submitted successfully for execution.") 111 cmd.UI.DisplayKeyValueTable("", [][]string{ 112 {cmd.UI.TranslateText("task name:"), task.Name}, 113 {cmd.UI.TranslateText("task id:"), fmt.Sprint(task.SequenceID)}, 114 }, 3) 115 116 return nil 117 }