github.com/dcarley/cf-cli@v6.24.1-0.20170220111324-4225ff346898+incompatible/command/v2/target_command.go (about) 1 package v2 2 3 import ( 4 "fmt" 5 6 "code.cloudfoundry.org/cli/actor/sharedaction" 7 "code.cloudfoundry.org/cli/actor/v2action" 8 "code.cloudfoundry.org/cli/command" 9 "code.cloudfoundry.org/cli/command/v2/shared" 10 "code.cloudfoundry.org/cli/util/configv3" 11 ) 12 13 //go:generate counterfeiter . TargetActor 14 type TargetActor interface { 15 GetOrganizationByName(orgName string) (v2action.Organization, v2action.Warnings, error) 16 GetOrganizationSpaces(orgGUID string) ([]v2action.Space, v2action.Warnings, error) 17 GetSpaceByOrganizationAndName(orgGUID string, spaceName string) (v2action.Space, v2action.Warnings, error) 18 } 19 20 type TargetCommand struct { 21 Organization string `short:"o" description:"Organization"` 22 Space string `short:"s" description:"Space"` 23 usage interface{} `usage:"CF_NAME target [-o ORG] [-s SPACE]"` 24 relatedCommands interface{} `related_commands:"create-org, create-space, login, orgs, spaces"` 25 26 UI command.UI 27 Config command.Config 28 SharedActor command.SharedActor 29 Actor TargetActor 30 } 31 32 func (cmd *TargetCommand) Setup(config command.Config, ui command.UI) error { 33 cmd.Config = config 34 cmd.UI = ui 35 cmd.SharedActor = sharedaction.NewActor() 36 37 ccClient, uaaClient, err := shared.NewClients(config, ui) 38 if err != nil { 39 return err 40 } 41 cmd.Actor = v2action.NewActor(ccClient, uaaClient) 42 43 return nil 44 } 45 46 func (cmd *TargetCommand) Execute(args []string) error { 47 cmd.notifyCLIUpdateIfNeeded() 48 49 err := cmd.SharedActor.CheckTarget(cmd.Config, false, false) 50 if err != nil { 51 return shared.HandleError(err) 52 } 53 54 user, err := cmd.Config.CurrentUser() 55 if err != nil { 56 cmd.clearTargets() 57 return shared.HandleError(err) 58 } 59 60 switch { 61 case cmd.Organization != "" && cmd.Space != "": 62 err = cmd.setOrgAndSpace() 63 if err != nil { 64 cmd.clearTargets() 65 return err 66 } 67 case cmd.Organization != "": 68 err = cmd.setOrg() 69 if err != nil { 70 cmd.clearTargets() 71 return err 72 } 73 err = cmd.autoTargetSpace(cmd.Config.TargetedOrganization().GUID) 74 if err != nil { 75 cmd.clearTargets() 76 return err 77 } 78 case cmd.Space != "": 79 err = cmd.setSpace() 80 if err != nil { 81 cmd.clearTargets() 82 return err 83 } 84 } 85 86 cmd.displayTargetTable(user) 87 88 if !cmd.Config.HasTargetedOrganization() { 89 cmd.UI.DisplayText("No org or space targeted, use '{{.CFTargetCommand}}'", 90 map[string]interface{}{ 91 "CFTargetCommand": fmt.Sprintf("%s target -o ORG -s SPACE", cmd.Config.BinaryName()), 92 }) 93 return nil 94 } 95 96 if !cmd.Config.HasTargetedSpace() { 97 cmd.UI.DisplayText("No space targeted, use '{{.CFTargetCommand}}'", 98 map[string]interface{}{ 99 "CFTargetCommand": fmt.Sprintf("%s target -s SPACE", cmd.Config.BinaryName()), 100 }) 101 } 102 103 return nil 104 } 105 106 func (cmd *TargetCommand) notifyCLIUpdateIfNeeded() { 107 err := command.MinimumAPIVersionCheck(cmd.Config.BinaryVersion(), cmd.Config.MinCLIVersion()) 108 109 if _, ok := err.(command.MinimumAPIVersionNotMetError); ok { 110 cmd.UI.DisplayWarning("Cloud Foundry API version {{.APIVersion}} requires CLI version {{.MinCLIVersion}}. You are currently on version {{.BinaryVersion}}. To upgrade your CLI, please visit: https://github.com/cloudfoundry/cli#downloads", 111 map[string]interface{}{ 112 "APIVersion": cmd.Config.APIVersion(), 113 "MinCLIVersion": cmd.Config.MinCLIVersion(), 114 "BinaryVersion": cmd.Config.BinaryVersion(), 115 }) 116 } 117 } 118 119 func (cmd TargetCommand) clearTargets() { 120 if cmd.Organization != "" { 121 cmd.Config.UnsetOrganizationInformation() 122 cmd.Config.UnsetSpaceInformation() 123 } else if cmd.Space != "" { 124 cmd.Config.UnsetSpaceInformation() 125 } 126 } 127 128 // setOrgAndSpace sets organization and space 129 func (cmd *TargetCommand) setOrgAndSpace() error { 130 org, warnings, err := cmd.Actor.GetOrganizationByName(cmd.Organization) 131 cmd.UI.DisplayWarnings(warnings) 132 if err != nil { 133 return shared.HandleError(err) 134 } 135 136 space, warnings, err := cmd.Actor.GetSpaceByOrganizationAndName(org.GUID, cmd.Space) 137 cmd.UI.DisplayWarnings(warnings) 138 if err != nil { 139 return shared.HandleError(err) 140 } 141 142 cmd.Config.SetOrganizationInformation(org.GUID, cmd.Organization) 143 cmd.Config.SetSpaceInformation(space.GUID, space.Name, space.AllowSSH) 144 145 return nil 146 } 147 148 // setOrg sets organization 149 func (cmd *TargetCommand) setOrg() error { 150 org, warnings, err := cmd.Actor.GetOrganizationByName(cmd.Organization) 151 cmd.UI.DisplayWarnings(warnings) 152 if err != nil { 153 return shared.HandleError(err) 154 } 155 156 cmd.Config.SetOrganizationInformation(org.GUID, cmd.Organization) 157 cmd.Config.UnsetSpaceInformation() 158 159 return nil 160 } 161 162 // autoTargetSpace targets the space if there is only one space in the org 163 // and no space arg was provided. 164 func (cmd *TargetCommand) autoTargetSpace(orgGUID string) error { 165 spaces, warnings, err := cmd.Actor.GetOrganizationSpaces(orgGUID) 166 cmd.UI.DisplayWarnings(warnings) 167 if err != nil { 168 return shared.HandleError(err) 169 } 170 171 if len(spaces) == 1 { 172 space := spaces[0] 173 cmd.Config.SetSpaceInformation(space.GUID, space.Name, space.AllowSSH) 174 } 175 176 return nil 177 } 178 179 // setSpace sets space 180 func (cmd *TargetCommand) setSpace() error { 181 if !cmd.Config.HasTargetedOrganization() { 182 return shared.NoOrganizationTargetedError{} 183 } 184 185 space, warnings, err := cmd.Actor.GetSpaceByOrganizationAndName(cmd.Config.TargetedOrganization().GUID, cmd.Space) 186 cmd.UI.DisplayWarnings(warnings) 187 if err != nil { 188 return shared.HandleError(err) 189 } 190 191 cmd.Config.SetSpaceInformation(space.GUID, space.Name, space.AllowSSH) 192 193 return nil 194 } 195 196 // displayTargetTable neatly displays target information. 197 func (cmd *TargetCommand) displayTargetTable(user configv3.User) { 198 table := [][]string{ 199 {cmd.UI.TranslateText("API endpoint:"), cmd.Config.Target()}, 200 {cmd.UI.TranslateText("API version:"), cmd.Config.APIVersion()}, 201 {cmd.UI.TranslateText("User:"), user.Name}, 202 } 203 204 if cmd.Config.HasTargetedOrganization() { 205 table = append(table, []string{ 206 cmd.UI.TranslateText("Org:"), cmd.Config.TargetedOrganization().Name, 207 }) 208 } 209 210 if cmd.Config.HasTargetedSpace() { 211 table = append(table, []string{ 212 cmd.UI.TranslateText("Space:"), cmd.Config.TargetedSpace().Name, 213 }) 214 } 215 cmd.UI.DisplayTable("", table, 3) 216 }