github.com/jenspinney/cli@v6.42.1-0.20190207184520-7450c600020e+incompatible/command/v6/v3_stage_command.go (about)

     1  package v6
     2  
     3  import (
     4  	"strings"
     5  	"time"
     6  
     7  	"code.cloudfoundry.org/cli/actor/sharedaction"
     8  	"code.cloudfoundry.org/cli/actor/v3action"
     9  	"code.cloudfoundry.org/cli/command"
    10  	"code.cloudfoundry.org/cli/command/flag"
    11  	"code.cloudfoundry.org/cli/command/v6/shared"
    12  )
    13  
    14  //go:generate counterfeiter . V3StageActor
    15  
    16  type V3StageActor interface {
    17  	GetStreamingLogsForApplicationByNameAndSpace(appName string, spaceGUID string, client v3action.NOAAClient) (<-chan *v3action.LogMessage, <-chan error, v3action.Warnings, error)
    18  	StagePackage(packageGUID string, appName string) (<-chan v3action.Droplet, <-chan v3action.Warnings, <-chan error)
    19  }
    20  
    21  type V3StageCommand struct {
    22  	RequiredArgs        flag.AppName `positional-args:"yes"`
    23  	PackageGUID         string       `long:"package-guid" description:"The guid of the package to stage" required:"true"`
    24  	usage               interface{}  `usage:"CF_NAME v3-stage APP_NAME --package-guid PACKAGE_GUID"`
    25  	envCFStagingTimeout interface{}  `environmentName:"CF_STAGING_TIMEOUT" environmentDescription:"Max wait time for buildpack staging, in minutes" environmentDefault:"15"`
    26  
    27  	UI          command.UI
    28  	Config      command.Config
    29  	NOAAClient  v3action.NOAAClient
    30  	SharedActor command.SharedActor
    31  	Actor       V3StageActor
    32  }
    33  
    34  func (cmd *V3StageCommand) Setup(config command.Config, ui command.UI) error {
    35  	cmd.UI = ui
    36  	cmd.Config = config
    37  	cmd.SharedActor = sharedaction.NewActor(config)
    38  
    39  	ccClient, uaaClient, err := shared.NewV3BasedClients(config, ui, true, "")
    40  	if err != nil {
    41  		return err
    42  	}
    43  
    44  	cmd.Actor = v3action.NewActor(ccClient, config, nil, nil)
    45  	cmd.NOAAClient = shared.NewNOAAClient(ccClient.Info.Logging(), config, uaaClient, ui)
    46  
    47  	return nil
    48  }
    49  
    50  func (cmd V3StageCommand) Execute(args []string) error {
    51  	cmd.UI.DisplayWarning(command.ExperimentalWarning)
    52  
    53  	err := cmd.SharedActor.CheckTarget(true, true)
    54  	if err != nil {
    55  		return err
    56  	}
    57  
    58  	user, err := cmd.Config.CurrentUser()
    59  	if err != nil {
    60  		return err
    61  	}
    62  
    63  	cmd.UI.DisplayTextWithFlavor("Staging package for {{.AppName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.Username}}...", map[string]interface{}{
    64  		"AppName":   cmd.RequiredArgs.AppName,
    65  		"OrgName":   cmd.Config.TargetedOrganization().Name,
    66  		"SpaceName": cmd.Config.TargetedSpace().Name,
    67  		"Username":  user.Name,
    68  	})
    69  
    70  	logStream, logErrStream, logWarnings, logErr := cmd.Actor.GetStreamingLogsForApplicationByNameAndSpace(cmd.RequiredArgs.AppName, cmd.Config.TargetedSpace().GUID, cmd.NOAAClient)
    71  	cmd.UI.DisplayWarnings(logWarnings)
    72  	if logErr != nil {
    73  		return logErr
    74  	}
    75  
    76  	dropletStream, warningsStream, errStream := cmd.Actor.StagePackage(cmd.PackageGUID, cmd.RequiredArgs.AppName)
    77  	var droplet v3action.Droplet
    78  	droplet, err = shared.PollStage(dropletStream, warningsStream, errStream, logStream, logErrStream, cmd.UI)
    79  	if err != nil {
    80  		return err
    81  	}
    82  
    83  	cmd.UI.DisplayNewline()
    84  	cmd.UI.DisplayText("Package staged")
    85  
    86  	t, err := time.Parse(time.RFC3339, droplet.CreatedAt)
    87  	if err != nil {
    88  		return err
    89  	}
    90  
    91  	table := [][]string{
    92  		{cmd.UI.TranslateText("droplet guid:"), droplet.GUID},
    93  		{cmd.UI.TranslateText("state:"), strings.ToLower(string(droplet.State))},
    94  		{cmd.UI.TranslateText("created:"), cmd.UI.UserFriendlyDate(t)},
    95  	}
    96  
    97  	cmd.UI.DisplayKeyValueTable("", table, 3)
    98  	return nil
    99  }