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  }