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