github.com/asifdxtreme/cli@v6.1.3-0.20150123051144-9ead8700b4ae+incompatible/cf/commands/application/copy_source.go (about)

     1  package application
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/cloudfoundry/cli/cf/api/applications"
     7  	"github.com/cloudfoundry/cli/cf/api/authentication"
     8  	"github.com/cloudfoundry/cli/cf/api/copy_application_source"
     9  	"github.com/cloudfoundry/cli/cf/api/organizations"
    10  	"github.com/cloudfoundry/cli/cf/api/spaces"
    11  	"github.com/cloudfoundry/cli/cf/command_metadata"
    12  	"github.com/cloudfoundry/cli/cf/configuration/core_config"
    13  	"github.com/cloudfoundry/cli/cf/flag_helpers"
    14  	. "github.com/cloudfoundry/cli/cf/i18n"
    15  	"github.com/cloudfoundry/cli/cf/models"
    16  	"github.com/cloudfoundry/cli/cf/requirements"
    17  	"github.com/cloudfoundry/cli/cf/terminal"
    18  	"github.com/codegangsta/cli"
    19  )
    20  
    21  type CopySource struct {
    22  	ui                terminal.UI
    23  	config            core_config.Reader
    24  	authRepo          authentication.AuthenticationRepository
    25  	appRepo           applications.ApplicationRepository
    26  	orgRepo           organizations.OrganizationRepository
    27  	spaceRepo         spaces.SpaceRepository
    28  	copyAppSourceRepo copy_application_source.CopyApplicationSourceRepository
    29  	appRestart        ApplicationRestarter
    30  }
    31  
    32  func NewCopySource(
    33  	ui terminal.UI,
    34  	config core_config.Reader,
    35  	authRepo authentication.AuthenticationRepository,
    36  	appRepo applications.ApplicationRepository,
    37  	orgRepo organizations.OrganizationRepository,
    38  	spaceRepo spaces.SpaceRepository,
    39  	copyAppSourceRepo copy_application_source.CopyApplicationSourceRepository,
    40  	appRestart ApplicationRestarter,
    41  ) *CopySource {
    42  
    43  	return &CopySource{
    44  		ui:                ui,
    45  		config:            config,
    46  		authRepo:          authRepo,
    47  		appRepo:           appRepo,
    48  		orgRepo:           orgRepo,
    49  		spaceRepo:         spaceRepo,
    50  		copyAppSourceRepo: copyAppSourceRepo,
    51  		appRestart:        appRestart,
    52  	}
    53  }
    54  
    55  func (cmd *CopySource) Metadata() command_metadata.CommandMetadata {
    56  	return command_metadata.CommandMetadata{
    57  		Name:        "copy-source",
    58  		Description: T("Make a copy of app source code from one application to another.  Unless overridden, the copy-source command will restart the application."),
    59  		Usage:       T("   CF_NAME copy-source SOURCE-APP TARGET-APP [-o TARGET-ORG] [-s TARGET-SPACE] [--no-restart]\n"),
    60  		Flags: []cli.Flag{
    61  			flag_helpers.NewStringFlag("o", T("Org that contains the target application")),
    62  			flag_helpers.NewStringFlag("s", T("Space that contains the target application")),
    63  			cli.BoolFlag{Name: "no-restart", Usage: T("Override restart of the application in target environment after copy-source completes")},
    64  		},
    65  	}
    66  }
    67  
    68  func (cmd *CopySource) GetRequirements(requirementsFactory requirements.Factory, c *cli.Context) (reqs []requirements.Requirement, err error) {
    69  	if len(c.Args()) != 2 {
    70  		cmd.ui.FailWithUsage(c)
    71  	}
    72  
    73  	reqs = []requirements.Requirement{
    74  		requirementsFactory.NewLoginRequirement(),
    75  		requirementsFactory.NewTargetedSpaceRequirement(),
    76  	}
    77  	return
    78  }
    79  
    80  func (cmd *CopySource) Run(c *cli.Context) {
    81  	sourceAppName := c.Args()[0]
    82  	targetAppName := c.Args()[1]
    83  
    84  	targetOrg := c.String("o")
    85  	targetSpace := c.String("s")
    86  
    87  	if targetOrg != "" && targetSpace == "" {
    88  		cmd.ui.Failed(T("Please provide the space within the organization containing the target application"))
    89  	}
    90  
    91  	_, apiErr := cmd.authRepo.RefreshAuthToken()
    92  	if apiErr != nil {
    93  		cmd.ui.Failed(apiErr.Error())
    94  	}
    95  
    96  	sourceApp, apiErr := cmd.appRepo.Read(sourceAppName)
    97  	if apiErr != nil {
    98  		cmd.ui.Failed(apiErr.Error())
    99  	}
   100  
   101  	var targetOrgName, targetSpaceName, spaceGuid, copyStr string
   102  	if targetOrg != "" && targetSpace != "" {
   103  		spaceGuid = cmd.findSpaceGuid(targetOrg, targetSpace)
   104  		targetOrgName = targetOrg
   105  		targetSpaceName = targetSpace
   106  	} else if targetSpace != "" {
   107  		space, err := cmd.spaceRepo.FindByName(targetSpace)
   108  		if err != nil {
   109  			cmd.ui.Failed(err.Error())
   110  		}
   111  		spaceGuid = space.Guid
   112  		targetOrgName = cmd.config.OrganizationFields().Name
   113  		targetSpaceName = targetSpace
   114  	} else {
   115  		spaceGuid = cmd.config.SpaceFields().Guid
   116  		targetOrgName = cmd.config.OrganizationFields().Name
   117  		targetSpaceName = cmd.config.SpaceFields().Name
   118  	}
   119  
   120  	copyStr = buildCopyString(sourceAppName, targetAppName, targetOrgName, targetSpaceName, cmd.config.Username())
   121  
   122  	targetApp, apiErr := cmd.appRepo.ReadFromSpace(targetAppName, spaceGuid)
   123  	if apiErr != nil {
   124  		cmd.ui.Failed(apiErr.Error())
   125  	}
   126  
   127  	cmd.ui.Say(copyStr)
   128  	cmd.ui.Say(T("Note: this may take some time"))
   129  	cmd.ui.Say("")
   130  
   131  	apiErr = cmd.copyAppSourceRepo.CopyApplication(sourceApp.Guid, targetApp.Guid)
   132  	if apiErr != nil {
   133  		cmd.ui.Failed(apiErr.Error())
   134  	}
   135  
   136  	if !c.Bool("no-restart") {
   137  		cmd.appRestart.ApplicationRestart(targetApp, targetOrgName, targetSpaceName)
   138  	}
   139  
   140  	cmd.ui.Ok()
   141  }
   142  
   143  func (cmd *CopySource) findSpaceGuid(targetOrg, targetSpace string) string {
   144  	org, err := cmd.orgRepo.FindByName(targetOrg)
   145  	if err != nil {
   146  		cmd.ui.Failed(err.Error())
   147  	}
   148  
   149  	var space models.SpaceFields
   150  	var foundSpace bool
   151  	for _, s := range org.Spaces {
   152  		if s.Name == targetSpace {
   153  			space = s
   154  			foundSpace = true
   155  		}
   156  	}
   157  
   158  	if !foundSpace {
   159  		cmd.ui.Failed(fmt.Sprintf(T("Could not find space {{.Space}} in organization {{.Org}}",
   160  			map[string]interface{}{
   161  				"Space": terminal.EntityNameColor(targetSpace),
   162  				"Org":   terminal.EntityNameColor(targetOrg),
   163  			},
   164  		)))
   165  	}
   166  
   167  	return space.Guid
   168  }
   169  
   170  func buildCopyString(sourceAppName, targetAppName, targetOrgName, targetSpaceName, username string) string {
   171  	return fmt.Sprintf(T("Copying source from app {{.SourceApp}} to target app {{.TargetApp}} in org {{.OrgName}} / space {{.SpaceName}} as {{.Username}}...",
   172  		map[string]interface{}{
   173  			"SourceApp": terminal.EntityNameColor(sourceAppName),
   174  			"TargetApp": terminal.EntityNameColor(targetAppName),
   175  			"OrgName":   terminal.EntityNameColor(targetOrgName),
   176  			"SpaceName": terminal.EntityNameColor(targetSpaceName),
   177  			"Username":  terminal.EntityNameColor(username),
   178  		},
   179  	))
   180  
   181  }