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  }