github.com/mook-as/cf-cli@v7.0.0-beta.28.0.20200120190804-b91c115fae48+incompatible/command/v7/start_command.go (about)

     1  package v7
     2  
     3  import (
     4  	"context"
     5  
     6  	"code.cloudfoundry.org/cli/actor/actionerror"
     7  	"code.cloudfoundry.org/cli/actor/sharedaction"
     8  	"code.cloudfoundry.org/cli/actor/v7action"
     9  	"code.cloudfoundry.org/cli/command"
    10  	"code.cloudfoundry.org/cli/command/flag"
    11  	"code.cloudfoundry.org/cli/command/v7/shared"
    12  	"code.cloudfoundry.org/clock"
    13  )
    14  
    15  //go:generate counterfeiter . StartActor
    16  
    17  type StartActor interface {
    18  	GetApplicationByNameAndSpace(appName string, spaceGUID string) (v7action.Application, v7action.Warnings, error)
    19  	GetDetailedAppSummary(appName string, spaceGUID string, withObfuscatedValues bool) (v7action.DetailedApplicationSummary, v7action.Warnings, error)
    20  	PollStart(appGUID string, noWait bool) (v7action.Warnings, error)
    21  	StartApplication(appGUID string) (v7action.Warnings, error)
    22  	GetUnstagedNewestPackageGUID(appGuid string) (string, v7action.Warnings, error)
    23  	StagePackage(packageGUID, appName, spaceGUID string) (<-chan v7action.Droplet, <-chan v7action.Warnings, <-chan error)
    24  	GetStreamingLogsForApplicationByNameAndSpace(appName string, spaceGUID string, client v7action.LogCacheClient) (<-chan v7action.LogMessage, <-chan error, context.CancelFunc, v7action.Warnings, error)
    25  	SetApplicationDroplet(appGUID string, dropletGUID string) (v7action.Warnings, error)
    26  }
    27  
    28  type StartCommand struct {
    29  	RequiredArgs        flag.AppName `positional-args:"yes"`
    30  	usage               interface{}  `usage:"CF_NAME start APP_NAME"`
    31  	relatedCommands     interface{}  `related_commands:"apps, logs, scale, ssh, stop, restart, run-task"`
    32  	envCFStagingTimeout interface{}  `environmentName:"CF_STAGING_TIMEOUT" environmentDescription:"Max wait time for staging, in minutes" environmentDefault:"15"`
    33  	envCFStartupTimeout interface{}  `environmentName:"CF_STARTUP_TIMEOUT" environmentDescription:"Max wait time for app instance startup, in minutes" environmentDefault:"5"`
    34  
    35  	UI             command.UI
    36  	Config         command.Config
    37  	LogCacheClient v7action.LogCacheClient
    38  	SharedActor    command.SharedActor
    39  	Actor          StartActor
    40  }
    41  
    42  func (cmd *StartCommand) Setup(config command.Config, ui command.UI) error {
    43  	cmd.UI = ui
    44  	cmd.Config = config
    45  	cmd.SharedActor = sharedaction.NewActor(config)
    46  
    47  	ccClient, _, err := shared.GetNewClientsAndConnectToCF(config, ui, "")
    48  	if err != nil {
    49  		return err
    50  	}
    51  
    52  	cmd.Actor = v7action.NewActor(ccClient, config, nil, nil, clock.NewClock())
    53  	cmd.LogCacheClient = shared.NewLogCacheClient(ccClient.Info.LogCache(), config, ui)
    54  
    55  	return nil
    56  }
    57  
    58  func (cmd StartCommand) Execute(args []string) error {
    59  	err := cmd.SharedActor.CheckTarget(true, true)
    60  	if err != nil {
    61  		return err
    62  	}
    63  
    64  	user, err := cmd.Config.CurrentUser()
    65  	if err != nil {
    66  		return err
    67  	}
    68  
    69  	app, warnings, err := cmd.Actor.GetApplicationByNameAndSpace(cmd.RequiredArgs.AppName, cmd.Config.TargetedSpace().GUID)
    70  	cmd.UI.DisplayWarnings(warnings)
    71  	if err != nil {
    72  		return err
    73  	}
    74  
    75  	if app.Started() {
    76  		cmd.UI.DisplayText("App '{{.AppName}}' is already started.",
    77  			map[string]interface{}{
    78  				"AppName": cmd.RequiredArgs.AppName,
    79  			})
    80  		cmd.UI.DisplayOK()
    81  		return nil
    82  	}
    83  
    84  	cmd.UI.DisplayTextWithFlavor("Starting app {{.AppName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.Username}}...", map[string]interface{}{
    85  		"AppName":   cmd.RequiredArgs.AppName,
    86  		"OrgName":   cmd.Config.TargetedOrganization().Name,
    87  		"SpaceName": cmd.Config.TargetedSpace().Name,
    88  		"Username":  user.Name,
    89  	})
    90  	cmd.UI.DisplayNewline()
    91  
    92  	packageGuid, warnings, err := cmd.Actor.GetUnstagedNewestPackageGUID(app.GUID)
    93  	cmd.UI.DisplayWarnings(warnings)
    94  	if err != nil {
    95  		return err
    96  	}
    97  	if packageGuid != "" {
    98  		cmd.UI.DisplayText("Staging app and tracing logs")
    99  
   100  		logStream, logErrStream, stopLogStreamFunc, logWarnings, logErr := cmd.Actor.GetStreamingLogsForApplicationByNameAndSpace(cmd.RequiredArgs.AppName, cmd.Config.TargetedSpace().GUID, cmd.LogCacheClient)
   101  		cmd.UI.DisplayWarnings(logWarnings)
   102  		if logErr != nil {
   103  			return logErr
   104  		}
   105  		defer stopLogStreamFunc()
   106  
   107  		dropletStream, warningsStream, errStream := cmd.Actor.StagePackage(packageGuid, cmd.RequiredArgs.AppName, cmd.Config.TargetedSpace().GUID)
   108  
   109  		droplet, err := shared.PollStage(dropletStream, warningsStream, errStream, logStream, logErrStream, cmd.UI)
   110  		if err != nil {
   111  			return err
   112  		}
   113  
   114  		warnings, err = cmd.Actor.SetApplicationDroplet(app.GUID, droplet.GUID)
   115  		cmd.UI.DisplayWarnings(warnings)
   116  		if err != nil {
   117  			return err
   118  		}
   119  	}
   120  
   121  	cmd.UI.DisplayText("\nWaiting for app to start...")
   122  
   123  	warnings, err = cmd.Actor.StartApplication(app.GUID)
   124  	cmd.UI.DisplayWarnings(warnings)
   125  	if err != nil {
   126  		return err
   127  	}
   128  
   129  	cmd.UI.DisplayNewline()
   130  
   131  	warnings, err = cmd.Actor.PollStart(app.GUID, false)
   132  	cmd.UI.DisplayWarnings(warnings)
   133  	if err != nil {
   134  		if _, ok := err.(actionerror.UserNotFoundError); ok {
   135  			cmd.UI.DisplayTextWithFlavor(err.Error())
   136  			cmd.UI.DisplayOK()
   137  			return nil
   138  		}
   139  		return err
   140  	}
   141  
   142  	appSummaryDisplayer := shared.NewAppSummaryDisplayer(cmd.UI)
   143  	summary, warnings, err := cmd.Actor.GetDetailedAppSummary(
   144  		cmd.RequiredArgs.AppName,
   145  		cmd.Config.TargetedSpace().GUID,
   146  		false,
   147  	)
   148  	cmd.UI.DisplayWarnings(warnings)
   149  	if err != nil {
   150  		return err
   151  	}
   152  
   153  	appSummaryDisplayer.AppDisplay(summary, false)
   154  	return nil
   155  }