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 }