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

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