github.com/loafoe/cli@v7.1.0+incompatible/command/v7/copy_source_command.go (about) 1 package v7 2 3 import ( 4 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant" 5 "code.cloudfoundry.org/cli/command" 6 "code.cloudfoundry.org/cli/command/flag" 7 "code.cloudfoundry.org/cli/command/translatableerror" 8 "code.cloudfoundry.org/cli/command/v7/shared" 9 "code.cloudfoundry.org/cli/util/configv3" 10 ) 11 12 type CopySourceCommand struct { 13 BaseCommand 14 15 RequiredArgs flag.CopySourceArgs `positional-args:"yes"` 16 usage interface{} `usage:"CF_NAME copy-source SOURCE_APP DESTINATION_APP [-s TARGET_SPACE [-o TARGET_ORG]] [--no-restart] [--strategy STRATEGY] [--no-wait]"` 17 Strategy flag.DeploymentStrategy `long:"strategy" description:"Deployment strategy, either rolling or null"` 18 NoWait bool `long:"no-wait" description:"Exit when the first instance of the web process is healthy"` 19 NoRestart bool `long:"no-restart" description:"Do not restage the destination application"` 20 Organization string `short:"o" long:"organization" description:"Org that contains the destination application"` 21 Space string `short:"s" long:"space" description:"Space that contains the destination application"` 22 relatedCommands interface{} `related_commands:"apps, push, restage, restart, target"` 23 envCFStagingTimeout interface{} `environmentName:"CF_STAGING_TIMEOUT" environmentDescription:"Max wait time for staging, in minutes" environmentDefault:"15"` 24 envCFStartupTimeout interface{} `environmentName:"CF_STARTUP_TIMEOUT" environmentDescription:"Max wait time for app instance startup, in minutes" environmentDefault:"5"` 25 26 Stager shared.AppStager 27 } 28 29 func (cmd *CopySourceCommand) ValidateFlags() error { 30 if cmd.Organization != "" && cmd.Space == "" { 31 return translatableerror.RequiredFlagsError{ 32 Arg1: "--organization, -o", 33 Arg2: "--space, -s", 34 } 35 } 36 37 if cmd.NoRestart && cmd.Strategy.Name != constant.DeploymentStrategyDefault { 38 return translatableerror.ArgumentCombinationError{ 39 Args: []string{"--no-restart", "--strategy"}, 40 } 41 } 42 43 if cmd.NoRestart && cmd.NoWait { 44 return translatableerror.ArgumentCombinationError{ 45 Args: []string{"--no-restart", "--no-wait"}, 46 } 47 } 48 49 return nil 50 } 51 52 func (cmd *CopySourceCommand) Setup(config command.Config, ui command.UI) error { 53 err := cmd.BaseCommand.Setup(config, ui) 54 if err != nil { 55 return err 56 } 57 58 logCacheEndpoint, _, err := cmd.Actor.GetLogCacheEndpoint() 59 if err != nil { 60 return err 61 } 62 logCacheClient := command.NewLogCacheClient(logCacheEndpoint, config, ui) 63 cmd.Stager = shared.NewAppStager(cmd.Actor, cmd.UI, cmd.Config, logCacheClient) 64 65 return nil 66 } 67 68 func (cmd CopySourceCommand) Execute(args []string) error { 69 err := cmd.SharedActor.CheckTarget(true, true) 70 if err != nil { 71 return err 72 } 73 74 user, err := cmd.Config.CurrentUser() 75 if err != nil { 76 return err 77 } 78 79 err = cmd.ValidateFlags() 80 if err != nil { 81 return err 82 } 83 84 targetOrgName := cmd.Config.TargetedOrganization().Name 85 targetSpaceName := cmd.Config.TargetedSpace().Name 86 if cmd.Organization != "" { 87 targetOrgName = cmd.Organization 88 } 89 if cmd.Space != "" { 90 targetSpaceName = cmd.Space 91 } 92 93 cmd.UI.DisplayTextWithFlavor( 94 "Copying source from app {{.SourceApp}} to target app {{.TargetApp}} in org {{.Org}} / space {{.Space}} as {{.UserName}}...", 95 map[string]interface{}{ 96 "SourceApp": cmd.RequiredArgs.SourceAppName, 97 "TargetApp": cmd.RequiredArgs.TargetAppName, 98 "Org": targetOrgName, 99 "Space": targetSpaceName, 100 "UserName": user.Name, 101 }, 102 ) 103 cmd.UI.DisplayNewline() 104 105 targetOrg := cmd.Config.TargetedOrganization() 106 targetSpace := cmd.Config.TargetedSpace() 107 if cmd.Organization != "" { 108 org, warnings, err := cmd.Actor.GetOrganizationByName(cmd.Organization) 109 cmd.UI.DisplayWarnings(warnings) 110 if err != nil { 111 return err 112 } 113 targetOrg = configv3.Organization{ 114 GUID: org.GUID, 115 Name: org.Name, 116 } 117 } 118 if cmd.Space != "" { 119 space, warnings, err := cmd.Actor.GetSpaceByNameAndOrganization(cmd.Space, targetOrg.GUID) 120 cmd.UI.DisplayWarnings(warnings) 121 if err != nil { 122 return err 123 } 124 targetSpace = configv3.Space{ 125 GUID: space.GUID, 126 Name: space.Name, 127 } 128 } 129 130 sourceApp, warnings, err := cmd.Actor.GetApplicationByNameAndSpace(cmd.RequiredArgs.SourceAppName, cmd.Config.TargetedSpace().GUID) 131 cmd.UI.DisplayWarnings(warnings) 132 if err != nil { 133 return err 134 } 135 136 targetApp, warnings, err := cmd.Actor.GetApplicationByNameAndSpace(cmd.RequiredArgs.TargetAppName, targetSpace.GUID) 137 cmd.UI.DisplayWarnings(warnings) 138 if err != nil { 139 return err 140 } 141 142 pkg, warnings, err := cmd.Actor.CopyPackage(sourceApp, targetApp) 143 cmd.UI.DisplayWarnings(warnings) 144 if err != nil { 145 return err 146 } 147 148 if !cmd.NoRestart { 149 cmd.UI.DisplayTextWithFlavor( 150 "Staging app {{.TargetApp}} in org {{.TargetOrg}} / space {{.TargetSpace}} as {{.UserName}}...", 151 map[string]interface{}{ 152 "TargetApp": cmd.RequiredArgs.TargetAppName, 153 "TargetOrg": targetOrgName, 154 "TargetSpace": targetSpaceName, 155 "UserName": user.Name, 156 }, 157 ) 158 cmd.UI.DisplayNewline() 159 160 err = cmd.Stager.StageAndStart( 161 targetApp, 162 targetSpace, 163 targetOrg, 164 pkg.GUID, 165 cmd.Strategy.Name, 166 cmd.NoWait, 167 constant.ApplicationRestarting, 168 ) 169 if err != nil { 170 return mapErr(cmd.Config, targetApp.Name, err) 171 } 172 } else { 173 cmd.UI.DisplayOK() 174 } 175 176 return nil 177 }