github.com/franc20/ayesa_sap@v7.0.0-beta.28.0.20200124003224-302d4d52fa6c+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 16 type TargetActor interface { 17 GetOrganizationByName(orgName string) (v2action.Organization, v2action.Warnings, error) 18 GetOrganizationSpaces(orgGUID string) ([]v2action.Space, v2action.Warnings, error) 19 GetSpaceByOrganizationAndName(orgGUID string, spaceName string) (v2action.Space, v2action.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.GetNewClientsAndConnectToCF(config, ui) 41 if err != nil { 42 return err 43 } 44 cmd.Actor = v2action.NewActor(ccClient, uaaClient, config) 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 org, warnings, err := cmd.Actor.GetOrganizationByName(cmd.Organization) 123 cmd.UI.DisplayWarnings(warnings) 124 if err != nil { 125 return err 126 } 127 128 space, warnings, err := cmd.Actor.GetSpaceByOrganizationAndName(org.GUID, cmd.Space) 129 cmd.UI.DisplayWarnings(warnings) 130 if err != nil { 131 return err 132 } 133 134 cmd.Config.SetOrganizationInformation(org.GUID, cmd.Organization) 135 cmd.Config.SetSpaceInformation(space.GUID, space.Name, space.AllowSSH) 136 137 return nil 138 } 139 140 // setOrg sets organization 141 func (cmd *TargetCommand) setOrg() error { 142 org, warnings, err := cmd.Actor.GetOrganizationByName(cmd.Organization) 143 cmd.UI.DisplayWarnings(warnings) 144 if err != nil { 145 return err 146 } 147 148 cmd.Config.SetOrganizationInformation(org.GUID, cmd.Organization) 149 cmd.Config.UnsetSpaceInformation() 150 151 return nil 152 } 153 154 // autoTargetSpace targets the space if there is only one space in the org 155 // and no space arg was provided. 156 func (cmd *TargetCommand) autoTargetSpace(orgGUID string) error { 157 spaces, warnings, err := cmd.Actor.GetOrganizationSpaces(orgGUID) 158 cmd.UI.DisplayWarnings(warnings) 159 if err != nil { 160 return err 161 } 162 163 if len(spaces) == 1 { 164 space := spaces[0] 165 cmd.Config.SetSpaceInformation(space.GUID, space.Name, space.AllowSSH) 166 } 167 168 return nil 169 } 170 171 // setSpace sets space 172 func (cmd *TargetCommand) setSpace() error { 173 if !cmd.Config.HasTargetedOrganization() { 174 return translatableerror.NoOrganizationTargetedError{BinaryName: cmd.Config.BinaryName()} 175 } 176 177 space, warnings, err := cmd.Actor.GetSpaceByOrganizationAndName(cmd.Config.TargetedOrganization().GUID, cmd.Space) 178 cmd.UI.DisplayWarnings(warnings) 179 if err != nil { 180 return err 181 } 182 183 cmd.Config.SetSpaceInformation(space.GUID, space.Name, space.AllowSSH) 184 185 return nil 186 } 187 188 // displayTargetTable neatly displays target information. 189 func (cmd *TargetCommand) displayTargetTable(user configv3.User) { 190 table := [][]string{ 191 {cmd.UI.TranslateText("api endpoint:"), cmd.Config.Target()}, 192 {cmd.UI.TranslateText("api version:"), cmd.Actor.CloudControllerAPIVersion()}, 193 {cmd.UI.TranslateText("user:"), user.Name}, 194 } 195 196 if cmd.Config.HasTargetedOrganization() { 197 table = append(table, []string{ 198 cmd.UI.TranslateText("org:"), cmd.Config.TargetedOrganization().Name, 199 }) 200 } 201 202 if cmd.Config.HasTargetedSpace() { 203 table = append(table, []string{ 204 cmd.UI.TranslateText("space:"), cmd.Config.TargetedSpace().Name, 205 }) 206 } 207 cmd.UI.DisplayKeyValueTable("", table, 3) 208 }