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 }