github.com/jghiloni/cli@v6.28.1-0.20170628223758-0ce05fe032a2+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, true) 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 err := command.WarnAPIVersionCheck(cmd.Config, cmd.UI) 48 if err != nil { 49 return err 50 } 51 52 err = cmd.SharedActor.CheckTarget(cmd.Config, false, false) 53 if err != nil { 54 return shared.HandleError(err) 55 } 56 57 user, err := cmd.Config.CurrentUser() 58 if err != nil { 59 cmd.clearTargets() 60 return shared.HandleError(err) 61 } 62 63 switch { 64 case cmd.Organization != "" && cmd.Space != "": 65 err = cmd.setOrgAndSpace() 66 if err != nil { 67 cmd.clearTargets() 68 return err 69 } 70 case cmd.Organization != "": 71 err = cmd.setOrg() 72 if err != nil { 73 cmd.clearTargets() 74 return err 75 } 76 err = cmd.autoTargetSpace(cmd.Config.TargetedOrganization().GUID) 77 if err != nil { 78 cmd.clearTargets() 79 return err 80 } 81 case cmd.Space != "": 82 err = cmd.setSpace() 83 if err != nil { 84 cmd.clearTargets() 85 return err 86 } 87 } 88 89 cmd.displayTargetTable(user) 90 91 if !cmd.Config.HasTargetedOrganization() { 92 cmd.UI.DisplayText("No org or space targeted, use '{{.CFTargetCommand}}'", 93 map[string]interface{}{ 94 "CFTargetCommand": fmt.Sprintf("%s target -o ORG -s SPACE", cmd.Config.BinaryName()), 95 }) 96 return nil 97 } 98 99 if !cmd.Config.HasTargetedSpace() { 100 cmd.UI.DisplayText("No space targeted, use '{{.CFTargetCommand}}'", 101 map[string]interface{}{ 102 "CFTargetCommand": fmt.Sprintf("%s target -s SPACE", cmd.Config.BinaryName()), 103 }) 104 } 105 106 return nil 107 } 108 109 func (cmd TargetCommand) clearTargets() { 110 if cmd.Organization != "" { 111 cmd.Config.UnsetOrganizationInformation() 112 cmd.Config.UnsetSpaceInformation() 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 shared.HandleError(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 shared.HandleError(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 shared.HandleError(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 shared.HandleError(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 command.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 shared.HandleError(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 }