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