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