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 }