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