github.com/franc20/ayesa_sap@v7.0.0-beta.28.0.20200124003224-302d4d52fa6c+incompatible/command/v7/start_command.go (about)

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