github.com/randomtask1155/cli@v6.41.1-0.20181227003417-a98eed78cbde+incompatible/command/v7/target_command.go (about) 1 package v7 2 3 import ( 4 "fmt" 5 6 "code.cloudfoundry.org/cli/actor/sharedaction" 7 "code.cloudfoundry.org/cli/actor/v7action" 8 "code.cloudfoundry.org/cli/command" 9 "code.cloudfoundry.org/cli/command/translatableerror" 10 "code.cloudfoundry.org/cli/command/v7/shared" 11 "code.cloudfoundry.org/cli/util/configv3" 12 ) 13 14 //go:generate counterfeiter . TargetActor 15 type TargetActor interface { 16 GetOrganizationByName(orgName string) (v7action.Organization, v7action.Warnings, error) 17 GetOrganizationSpaces(orgGUID string) ([]v7action.Space, v7action.Warnings, error) 18 GetSpaceByNameAndOrganization(spaceName string, orgGUID string) (v7action.Space, v7action.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 = v7action.NewActor(ccClient, config, nil, uaaClient) 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 err := cmd.setOrg() 122 if err != nil { 123 return err 124 } 125 126 err = cmd.setSpace() 127 if err != nil { 128 return err 129 } 130 131 return nil 132 } 133 134 // setOrg sets organization 135 func (cmd *TargetCommand) setOrg() error { 136 org, warnings, err := cmd.Actor.GetOrganizationByName(cmd.Organization) 137 cmd.UI.DisplayWarnings(warnings) 138 if err != nil { 139 return err 140 } 141 142 cmd.Config.SetOrganizationInformation(org.GUID, cmd.Organization) 143 cmd.Config.UnsetSpaceInformation() 144 145 return nil 146 } 147 148 // autoTargetSpace targets the space if there is only one space in the org 149 // and no space arg was provided. 150 func (cmd *TargetCommand) autoTargetSpace(orgGUID string) error { 151 spaces, warnings, err := cmd.Actor.GetOrganizationSpaces(orgGUID) 152 cmd.UI.DisplayWarnings(warnings) 153 if err != nil { 154 return err 155 } 156 157 if len(spaces) == 1 { 158 space := spaces[0] 159 cmd.Config.V7SetSpaceInformation(space.GUID, space.Name) 160 } 161 162 return nil 163 } 164 165 // setSpace sets space 166 func (cmd *TargetCommand) setSpace() error { 167 if !cmd.Config.HasTargetedOrganization() { 168 return translatableerror.NoOrganizationTargetedError{BinaryName: cmd.Config.BinaryName()} 169 } 170 171 space, warnings, err := cmd.Actor.GetSpaceByNameAndOrganization(cmd.Space, cmd.Config.TargetedOrganization().GUID) 172 cmd.UI.DisplayWarnings(warnings) 173 if err != nil { 174 return err 175 } 176 177 cmd.Config.V7SetSpaceInformation(space.GUID, space.Name) 178 179 return nil 180 } 181 182 // displayTargetTable neatly displays target information. 183 func (cmd *TargetCommand) displayTargetTable(user configv3.User) { 184 table := [][]string{ 185 {cmd.UI.TranslateText("api endpoint:"), cmd.Config.Target()}, 186 {cmd.UI.TranslateText("api version:"), cmd.Actor.CloudControllerAPIVersion()}, 187 {cmd.UI.TranslateText("user:"), user.Name}, 188 } 189 190 if cmd.Config.HasTargetedOrganization() { 191 table = append(table, []string{ 192 cmd.UI.TranslateText("org:"), cmd.Config.TargetedOrganization().Name, 193 }) 194 } 195 196 if cmd.Config.HasTargetedSpace() { 197 table = append(table, []string{ 198 cmd.UI.TranslateText("space:"), cmd.Config.TargetedSpace().Name, 199 }) 200 } 201 cmd.UI.DisplayKeyValueTable("", table, 3) 202 }