github.com/cloudfoundry-attic/cli-with-i18n@v6.32.1-0.20171002233121-7401370d3b85+incompatible/command/v3/tasks_command.go (about)

     1  package v3
     2  
     3  import (
     4  	"net/http"
     5  	"strconv"
     6  	"time"
     7  
     8  	"code.cloudfoundry.org/cli/actor/sharedaction"
     9  	"code.cloudfoundry.org/cli/actor/v3action"
    10  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccerror"
    11  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccversion"
    12  	"code.cloudfoundry.org/cli/command"
    13  	"code.cloudfoundry.org/cli/command/flag"
    14  	"code.cloudfoundry.org/cli/command/translatableerror"
    15  	"code.cloudfoundry.org/cli/command/v3/shared"
    16  	"code.cloudfoundry.org/cli/util/ui"
    17  )
    18  
    19  //These constants are only for filling in translations.
    20  const (
    21  	runningState   = "RUNNING"
    22  	cancelingState = "CANCELING"
    23  	pendingState   = "PENDING"
    24  	succeededState = "SUCCEEDED"
    25  )
    26  
    27  //go:generate counterfeiter . TasksActor
    28  
    29  type TasksActor interface {
    30  	GetApplicationByNameAndSpace(appName string, spaceGUID string) (v3action.Application, v3action.Warnings, error)
    31  	GetApplicationTasks(appGUID string, sortOrder v3action.SortOrder) ([]v3action.Task, v3action.Warnings, error)
    32  	CloudControllerAPIVersion() string
    33  }
    34  
    35  type TasksCommand struct {
    36  	RequiredArgs    flag.AppName `positional-args:"yes"`
    37  	usage           interface{}  `usage:"CF_NAME tasks APP_NAME"`
    38  	relatedCommands interface{}  `related_commands:"apps, logs, run-task, terminate-task"`
    39  
    40  	UI          command.UI
    41  	Config      command.Config
    42  	SharedActor command.SharedActor
    43  	Actor       TasksActor
    44  }
    45  
    46  func (cmd *TasksCommand) Setup(config command.Config, ui command.UI) error {
    47  	cmd.UI = ui
    48  	cmd.Config = config
    49  	cmd.SharedActor = sharedaction.NewActor(config)
    50  
    51  	client, _, err := shared.NewClients(config, ui, true)
    52  	if err != nil {
    53  		if v3Err, ok := err.(ccerror.V3UnexpectedResponseError); ok && v3Err.ResponseCode == http.StatusNotFound {
    54  			return translatableerror.MinimumAPIVersionNotMetError{MinimumVersion: ccversion.MinVersionRunTaskV3}
    55  		}
    56  
    57  		return err
    58  	}
    59  	cmd.Actor = v3action.NewActor(nil, client, config)
    60  
    61  	return nil
    62  }
    63  
    64  func (cmd TasksCommand) Execute(args []string) error {
    65  	err := command.MinimumAPIVersionCheck(cmd.Actor.CloudControllerAPIVersion(), ccversion.MinVersionRunTaskV3)
    66  	if err != nil {
    67  		return err
    68  	}
    69  
    70  	err = cmd.SharedActor.CheckTarget(cmd.Config, true, true)
    71  	if err != nil {
    72  		return shared.HandleError(err)
    73  	}
    74  
    75  	space := cmd.Config.TargetedSpace()
    76  
    77  	user, err := cmd.Config.CurrentUser()
    78  	if err != nil {
    79  		return err
    80  	}
    81  
    82  	application, warnings, err := cmd.Actor.GetApplicationByNameAndSpace(cmd.RequiredArgs.AppName, space.GUID)
    83  	cmd.UI.DisplayWarnings(warnings)
    84  	if err != nil {
    85  		return shared.HandleError(err)
    86  	}
    87  
    88  	cmd.UI.DisplayTextWithFlavor("Getting tasks for app {{.AppName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.CurrentUser}}...", map[string]interface{}{
    89  		"AppName":     cmd.RequiredArgs.AppName,
    90  		"OrgName":     cmd.Config.TargetedOrganization().Name,
    91  		"SpaceName":   space.Name,
    92  		"CurrentUser": user.Name,
    93  	})
    94  
    95  	tasks, warnings, err := cmd.Actor.GetApplicationTasks(application.GUID, v3action.Descending)
    96  	cmd.UI.DisplayWarnings(warnings)
    97  	if err != nil {
    98  		return shared.HandleError(err)
    99  	}
   100  
   101  	cmd.UI.DisplayOK()
   102  	cmd.UI.DisplayNewline()
   103  
   104  	table := [][]string{
   105  		{
   106  			cmd.UI.TranslateText("id"),
   107  			cmd.UI.TranslateText("name"),
   108  			cmd.UI.TranslateText("state"),
   109  			cmd.UI.TranslateText("start time"),
   110  			cmd.UI.TranslateText("command"),
   111  		},
   112  	}
   113  	for _, task := range tasks {
   114  		t, err := time.Parse(time.RFC3339, task.CreatedAt)
   115  		if err != nil {
   116  			return err
   117  		}
   118  
   119  		if task.Command == "" {
   120  			task.Command = "[hidden]"
   121  		}
   122  
   123  		table = append(table, []string{
   124  			strconv.Itoa(task.SequenceID),
   125  			task.Name,
   126  			cmd.UI.TranslateText(task.State),
   127  			t.Format(time.RFC1123),
   128  			task.Command,
   129  		})
   130  	}
   131  
   132  	cmd.UI.DisplayTableWithHeader("", table, ui.DefaultTableSpacePadding)
   133  
   134  	return nil
   135  }