github.com/franc20/ayesa_sap@v7.0.0-beta.28.0.20200124003224-302d4d52fa6c+incompatible/command/v7/labels_command.go (about) 1 package v7 2 3 import ( 4 "fmt" 5 "sort" 6 "strings" 7 8 "code.cloudfoundry.org/cli/actor/sharedaction" 9 "code.cloudfoundry.org/cli/actor/v7action" 10 "code.cloudfoundry.org/cli/command" 11 "code.cloudfoundry.org/cli/command/flag" 12 "code.cloudfoundry.org/cli/command/translatableerror" 13 "code.cloudfoundry.org/cli/command/v7/shared" 14 "code.cloudfoundry.org/cli/types" 15 "code.cloudfoundry.org/cli/util/ui" 16 "code.cloudfoundry.org/clock" 17 ) 18 19 type ResourceType string 20 21 const ( 22 App ResourceType = "app" 23 Buildpack ResourceType = "buildpack" 24 Domain ResourceType = "domain" 25 Org ResourceType = "org" 26 Route ResourceType = "route" 27 Space ResourceType = "space" 28 Stack ResourceType = "stack" 29 ServiceBroker ResourceType = "service-broker" 30 ) 31 32 //go:generate counterfeiter . LabelsActor 33 34 type LabelsActor interface { 35 GetApplicationLabels(appName string, spaceGUID string) (map[string]types.NullString, v7action.Warnings, error) 36 GetDomainLabels(domainName string) (map[string]types.NullString, v7action.Warnings, error) 37 GetOrganizationLabels(orgName string) (map[string]types.NullString, v7action.Warnings, error) 38 GetRouteLabels(routeName string, spaceGUID string) (map[string]types.NullString, v7action.Warnings, error) 39 GetSpaceLabels(spaceName string, orgGUID string) (map[string]types.NullString, v7action.Warnings, error) 40 GetBuildpackLabels(buildpackName string, buildpackStack string) (map[string]types.NullString, v7action.Warnings, error) 41 GetStackLabels(stackName string) (map[string]types.NullString, v7action.Warnings, error) 42 GetServiceBrokerLabels(serviceBrokerName string) (map[string]types.NullString, v7action.Warnings, error) 43 } 44 45 type LabelsCommand struct { 46 RequiredArgs flag.LabelsArgs `positional-args:"yes"` 47 BuildpackStack string `long:"stack" short:"s" description:"Specify stack to disambiguate buildpacks with the same name"` 48 usage interface{} `usage:"CF_NAME labels RESOURCE RESOURCE_NAME\n\nEXAMPLES:\n cf labels app dora\n cf labels org business\n cf labels buildpack go_buildpack --stack cflinuxfs3 \n\nRESOURCES:\n app\n buildpack\n domain\n org\n route\n service-broker\n space\n stack"` 49 relatedCommands interface{} `related_commands:"set-label, unset-label"` 50 UI command.UI 51 Config command.Config 52 SharedActor command.SharedActor 53 Actor LabelsActor 54 } 55 56 func (cmd *LabelsCommand) Setup(config command.Config, ui command.UI) error { 57 cmd.UI = ui 58 cmd.Config = config 59 cmd.SharedActor = sharedaction.NewActor(config) 60 ccClient, _, err := shared.GetNewClientsAndConnectToCF(config, ui, "") 61 if err != nil { 62 return err 63 } 64 cmd.Actor = v7action.NewActor(ccClient, config, nil, nil, clock.NewClock()) 65 return nil 66 } 67 68 func (cmd LabelsCommand) Execute(args []string) error { 69 var ( 70 labels map[string]types.NullString 71 warnings v7action.Warnings 72 ) 73 username, err := cmd.Config.CurrentUserName() 74 if err != nil { 75 return err 76 } 77 78 err = cmd.validateFlags() 79 if err != nil { 80 return err 81 } 82 83 switch cmd.canonicalResourceTypeForName() { 84 case App: 85 labels, warnings, err = cmd.fetchAppLabels(username) 86 case Buildpack: 87 labels, warnings, err = cmd.fetchBuildpackLabels(username) 88 case Domain: 89 labels, warnings, err = cmd.fetchDomainLabels(username) 90 case Org: 91 labels, warnings, err = cmd.fetchOrgLabels(username) 92 case Route: 93 labels, warnings, err = cmd.fetchRouteLabels(username) 94 case ServiceBroker: 95 labels, warnings, err = cmd.fetchServiceBrokerLabels(username) 96 case Space: 97 labels, warnings, err = cmd.fetchSpaceLabels(username) 98 case Stack: 99 labels, warnings, err = cmd.fetchStackLabels(username) 100 default: 101 err = fmt.Errorf("Unsupported resource type of '%s'", cmd.RequiredArgs.ResourceType) 102 } 103 cmd.UI.DisplayWarnings(warnings) 104 if err != nil { 105 return err 106 } 107 108 cmd.printLabels(labels) 109 return nil 110 } 111 112 func (cmd LabelsCommand) fetchAppLabels(username string) (map[string]types.NullString, v7action.Warnings, error) { 113 err := cmd.SharedActor.CheckTarget(true, true) 114 if err != nil { 115 return nil, nil, err 116 } 117 118 cmd.UI.DisplayTextWithFlavor("Getting labels for app {{.AppName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.Username}}...", map[string]interface{}{ 119 "AppName": cmd.RequiredArgs.ResourceName, 120 "OrgName": cmd.Config.TargetedOrganization().Name, 121 "SpaceName": cmd.Config.TargetedSpace().Name, 122 "Username": username, 123 }) 124 125 cmd.UI.DisplayNewline() 126 return cmd.Actor.GetApplicationLabels(cmd.RequiredArgs.ResourceName, cmd.Config.TargetedSpace().GUID) 127 } 128 129 func (cmd LabelsCommand) fetchDomainLabels(username string) (map[string]types.NullString, v7action.Warnings, error) { 130 err := cmd.SharedActor.CheckTarget(false, false) 131 if err != nil { 132 return nil, nil, err 133 } 134 135 cmd.UI.DisplayTextWithFlavor("Getting labels for domain {{.DomainName}} as {{.Username}}...", map[string]interface{}{ 136 "DomainName": cmd.RequiredArgs.ResourceName, 137 "Username": username, 138 }) 139 140 cmd.UI.DisplayNewline() 141 142 return cmd.Actor.GetDomainLabels(cmd.RequiredArgs.ResourceName) 143 } 144 145 func (cmd LabelsCommand) fetchOrgLabels(username string) (map[string]types.NullString, v7action.Warnings, error) { 146 err := cmd.SharedActor.CheckTarget(false, false) 147 if err != nil { 148 return nil, nil, err 149 } 150 151 cmd.UI.DisplayTextWithFlavor("Getting labels for org {{.OrgName}} as {{.Username}}...", map[string]interface{}{ 152 "OrgName": cmd.RequiredArgs.ResourceName, 153 "Username": username, 154 }) 155 156 cmd.UI.DisplayNewline() 157 return cmd.Actor.GetOrganizationLabels(cmd.RequiredArgs.ResourceName) 158 } 159 160 func (cmd LabelsCommand) fetchRouteLabels(username string) (map[string]types.NullString, v7action.Warnings, error) { 161 err := cmd.SharedActor.CheckTarget(true, true) 162 if err != nil { 163 return nil, nil, err 164 } 165 166 cmd.UI.DisplayTextWithFlavor("Getting labels for route {{.RouteName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.Username}}...", map[string]interface{}{ 167 "RouteName": cmd.RequiredArgs.ResourceName, 168 "OrgName": cmd.Config.TargetedOrganization().Name, 169 "SpaceName": cmd.Config.TargetedSpace().Name, 170 "Username": username, 171 }) 172 173 cmd.UI.DisplayNewline() 174 175 return cmd.Actor.GetRouteLabels(cmd.RequiredArgs.ResourceName, cmd.Config.TargetedSpace().GUID) 176 } 177 178 func (cmd LabelsCommand) fetchServiceBrokerLabels(username string) (map[string]types.NullString, v7action.Warnings, error) { 179 err := cmd.SharedActor.CheckTarget(false, false) 180 if err != nil { 181 return nil, nil, err 182 } 183 184 cmd.UI.DisplayTextWithFlavor("Getting labels for service-broker {{.ServiceBrokerName}} as {{.Username}}...", map[string]interface{}{ 185 "ServiceBrokerName": cmd.RequiredArgs.ResourceName, 186 "Username": username, 187 }) 188 189 cmd.UI.DisplayNewline() 190 191 return cmd.Actor.GetServiceBrokerLabels(cmd.RequiredArgs.ResourceName) 192 } 193 194 func (cmd LabelsCommand) fetchSpaceLabels(username string) (map[string]types.NullString, v7action.Warnings, error) { 195 err := cmd.SharedActor.CheckTarget(true, false) 196 if err != nil { 197 return nil, nil, err 198 } 199 cmd.UI.DisplayTextWithFlavor("Getting labels for space {{.SpaceName}} in org {{.OrgName}} as {{.Username}}...", map[string]interface{}{ 200 "SpaceName": cmd.RequiredArgs.ResourceName, 201 "OrgName": cmd.Config.TargetedOrganization().Name, 202 "Username": username, 203 }) 204 205 cmd.UI.DisplayNewline() 206 207 return cmd.Actor.GetSpaceLabels(cmd.RequiredArgs.ResourceName, cmd.Config.TargetedOrganization().GUID) 208 } 209 210 func (cmd LabelsCommand) fetchStackLabels(username string) (map[string]types.NullString, v7action.Warnings, error) { 211 err := cmd.SharedActor.CheckTarget(false, false) 212 if err != nil { 213 return nil, nil, err 214 } 215 216 cmd.UI.DisplayTextWithFlavor("Getting labels for stack {{.StackName}} as {{.Username}}...", map[string]interface{}{ 217 "StackName": cmd.RequiredArgs.ResourceName, 218 "Username": username, 219 }) 220 221 cmd.UI.DisplayNewline() 222 223 return cmd.Actor.GetStackLabels(cmd.RequiredArgs.ResourceName) 224 } 225 226 func (cmd LabelsCommand) fetchBuildpackLabels(username string) (map[string]types.NullString, v7action.Warnings, error) { 227 err := cmd.SharedActor.CheckTarget(false, false) 228 if err != nil { 229 return nil, nil, err 230 } 231 232 var template string 233 if cmd.BuildpackStack != "" { 234 template = "Getting labels for %s {{.ResourceName}} with stack {{.StackName}} as {{.User}}..." 235 } else { 236 template = "Getting labels for %s {{.ResourceName}} as {{.User}}..." 237 } 238 preFlavoringText := fmt.Sprintf(template, cmd.RequiredArgs.ResourceType) 239 cmd.UI.DisplayTextWithFlavor( 240 preFlavoringText, 241 map[string]interface{}{ 242 "ResourceName": cmd.RequiredArgs.ResourceName, 243 "StackName": cmd.BuildpackStack, 244 "User": username, 245 }, 246 ) 247 248 cmd.UI.DisplayNewline() 249 250 return cmd.Actor.GetBuildpackLabels(cmd.RequiredArgs.ResourceName, cmd.BuildpackStack) 251 } 252 253 func (cmd LabelsCommand) canonicalResourceTypeForName() ResourceType { 254 return ResourceType(strings.ToLower(cmd.RequiredArgs.ResourceType)) 255 } 256 257 func (cmd LabelsCommand) printLabels(labels map[string]types.NullString) { 258 if len(labels) == 0 { 259 cmd.UI.DisplayText("No labels found.") 260 return 261 } 262 263 keys := make([]string, 0, len(labels)) 264 for key := range labels { 265 keys = append(keys, key) 266 } 267 sort.Strings(keys) 268 269 table := [][]string{ 270 { 271 cmd.UI.TranslateText("key"), 272 cmd.UI.TranslateText("value"), 273 }, 274 } 275 276 for _, key := range keys { 277 table = append(table, []string{key, labels[key].Value}) 278 } 279 280 cmd.UI.DisplayTableWithHeader("", table, ui.DefaultTableSpacePadding) 281 } 282 283 func (cmd LabelsCommand) validateFlags() error { 284 if cmd.BuildpackStack != "" && cmd.canonicalResourceTypeForName() != Buildpack { 285 return translatableerror.ArgumentCombinationError{ 286 Args: []string{ 287 cmd.RequiredArgs.ResourceType, "--stack, -s", 288 }, 289 } 290 } 291 return nil 292 }