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