code.cloudfoundry.org/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  }