github.com/rakutentech/cli@v6.12.5-0.20151006231303-24468b65536e+incompatible/cf/commands/target.go (about) 1 package commands 2 3 import ( 4 "github.com/cloudfoundry/cli/cf/api/organizations" 5 "github.com/cloudfoundry/cli/cf/api/spaces" 6 "github.com/cloudfoundry/cli/cf/command_registry" 7 "github.com/cloudfoundry/cli/cf/configuration/core_config" 8 "github.com/cloudfoundry/cli/cf/errors" 9 . "github.com/cloudfoundry/cli/cf/i18n" 10 "github.com/cloudfoundry/cli/cf/models" 11 "github.com/cloudfoundry/cli/cf/requirements" 12 "github.com/cloudfoundry/cli/cf/terminal" 13 "github.com/cloudfoundry/cli/flags" 14 "github.com/cloudfoundry/cli/flags/flag" 15 ) 16 17 type Target struct { 18 ui terminal.UI 19 config core_config.ReadWriter 20 orgRepo organizations.OrganizationRepository 21 spaceRepo spaces.SpaceRepository 22 } 23 24 func init() { 25 command_registry.Register(&Target{}) 26 } 27 28 func (cmd *Target) MetaData() command_registry.CommandMetadata { 29 fs := make(map[string]flags.FlagSet) 30 fs["o"] = &cliFlags.StringFlag{Name: "o", Usage: T("organization")} 31 fs["s"] = &cliFlags.StringFlag{Name: "s", Usage: T("space")} 32 33 return command_registry.CommandMetadata{ 34 Name: "target", 35 ShortName: "t", 36 Description: T("Set or view the targeted org or space"), 37 Usage: T("CF_NAME target [-o ORG] [-s SPACE]"), 38 Flags: fs, 39 } 40 } 41 42 func (cmd *Target) Requirements(requirementsFactory requirements.Factory, fc flags.FlagContext) (reqs []requirements.Requirement, err error) { 43 if len(fc.Args()) != 0 { 44 cmd.ui.Failed(T("Incorrect Usage. No argument required\n\n") + command_registry.Commands.CommandUsage("target")) 45 } 46 47 reqs = []requirements.Requirement{ 48 requirementsFactory.NewApiEndpointRequirement(), 49 } 50 51 if fc.IsSet("o") || fc.IsSet("s") { 52 reqs = append(reqs, requirementsFactory.NewLoginRequirement()) 53 } 54 55 return 56 } 57 58 func (cmd *Target) SetDependency(deps command_registry.Dependency, _ bool) command_registry.Command { 59 cmd.ui = deps.Ui 60 cmd.config = deps.Config 61 cmd.orgRepo = deps.RepoLocator.GetOrganizationRepository() 62 cmd.spaceRepo = deps.RepoLocator.GetSpaceRepository() 63 return cmd 64 } 65 66 func (cmd *Target) Execute(c flags.FlagContext) { 67 orgName := c.String("o") 68 spaceName := c.String("s") 69 70 if orgName != "" { 71 err := cmd.setOrganization(orgName) 72 if err != nil { 73 cmd.ui.Failed(err.Error()) 74 } else if spaceName == "" { 75 spaceList, apiErr := cmd.getSpaceList() 76 if apiErr == nil && len(spaceList) == 1 { 77 cmd.setSpace(spaceList[0].Name) 78 } 79 } 80 } 81 82 if spaceName != "" { 83 err := cmd.setSpace(spaceName) 84 if err != nil { 85 cmd.ui.Failed(err.Error()) 86 } 87 } 88 89 cmd.ui.ShowConfiguration(cmd.config) 90 if !cmd.config.IsLoggedIn() { 91 cmd.ui.PanicQuietly() 92 } 93 cmd.ui.NotifyUpdateIfNeeded(cmd.config) 94 return 95 } 96 97 func (cmd Target) setOrganization(orgName string) error { 98 // setting an org necessarily invalidates any space you had previously targeted 99 cmd.config.SetOrganizationFields(models.OrganizationFields{}) 100 cmd.config.SetSpaceFields(models.SpaceFields{}) 101 102 org, apiErr := cmd.orgRepo.FindByName(orgName) 103 if apiErr != nil { 104 return errors.NewWithFmt(T("Could not target org.\n{{.ApiErr}}", 105 map[string]interface{}{"ApiErr": apiErr.Error()})) 106 } 107 108 cmd.config.SetOrganizationFields(org.OrganizationFields) 109 return nil 110 } 111 112 func (cmd Target) setSpace(spaceName string) error { 113 cmd.config.SetSpaceFields(models.SpaceFields{}) 114 115 if !cmd.config.HasOrganization() { 116 return errors.New(T("An org must be targeted before targeting a space")) 117 } 118 119 space, apiErr := cmd.spaceRepo.FindByName(spaceName) 120 if apiErr != nil { 121 return errors.NewWithFmt(T("Unable to access space {{.SpaceName}}.\n{{.ApiErr}}", 122 map[string]interface{}{"SpaceName": spaceName, "ApiErr": apiErr.Error()})) 123 } 124 125 cmd.config.SetSpaceFields(space.SpaceFields) 126 return nil 127 } 128 129 func (cmd Target) getSpaceList() ([]models.Space, error) { 130 spaceList := []models.Space{} 131 apiErr := cmd.spaceRepo.ListSpaces( 132 func(space models.Space) bool { 133 spaceList = append(spaceList, space) 134 return true 135 }) 136 return spaceList, apiErr 137 }