github.com/loafoe/cli@v7.1.0+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/v7action" 9 "code.cloudfoundry.org/cli/command/flag" 10 "code.cloudfoundry.org/cli/command/translatableerror" 11 "code.cloudfoundry.org/cli/types" 12 "code.cloudfoundry.org/cli/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 ServiceOffering ResourceType = "service-offering" 27 ServicePlan ResourceType = "service-plan" 28 ) 29 30 type LabelsCommand struct { 31 BaseCommand 32 33 RequiredArgs flag.LabelsArgs `positional-args:"yes"` 34 BuildpackStack string `long:"stack" short:"s" description:"Specify stack to disambiguate buildpacks with the same name"` 35 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 service-offering\n service-plan\n space\n stack"` 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 cmd.username, err = cmd.Config.CurrentUserName() 51 if err != nil { 52 return err 53 } 54 55 if err := cmd.validateFlags(); err != nil { 56 return err 57 } 58 59 if err := cmd.checkTarget(); err != nil { 60 return err 61 } 62 63 switch cmd.canonicalResourceTypeForName() { 64 case App: 65 cmd.displayMessageWithOrgAndSpace() 66 labels, warnings, err = cmd.Actor.GetApplicationLabels(cmd.RequiredArgs.ResourceName, cmd.Config.TargetedSpace().GUID) 67 case Buildpack: 68 cmd.displayMessageWithStack() 69 labels, warnings, err = cmd.Actor.GetBuildpackLabels(cmd.RequiredArgs.ResourceName, cmd.BuildpackStack) 70 case Domain: 71 cmd.displayMessageDefault() 72 labels, warnings, err = cmd.Actor.GetDomainLabels(cmd.RequiredArgs.ResourceName) 73 case Org: 74 cmd.displayMessageDefault() 75 labels, warnings, err = cmd.Actor.GetOrganizationLabels(cmd.RequiredArgs.ResourceName) 76 case Route: 77 cmd.displayMessageWithOrgAndSpace() 78 labels, warnings, err = cmd.Actor.GetRouteLabels(cmd.RequiredArgs.ResourceName, cmd.Config.TargetedSpace().GUID) 79 case ServiceBroker: 80 cmd.displayMessageDefault() 81 labels, warnings, err = cmd.Actor.GetServiceBrokerLabels(cmd.RequiredArgs.ResourceName) 82 case ServiceOffering: 83 cmd.displayMessageForServiceCommands() 84 labels, warnings, err = cmd.Actor.GetServiceOfferingLabels(cmd.RequiredArgs.ResourceName, cmd.ServiceBroker) 85 case ServicePlan: 86 cmd.displayMessageForServiceCommands() 87 labels, warnings, err = cmd.Actor.GetServicePlanLabels(cmd.RequiredArgs.ResourceName, cmd.ServiceOffering, cmd.ServiceBroker) 88 case Space: 89 cmd.displayMessageWithOrg() 90 labels, warnings, err = cmd.Actor.GetSpaceLabels(cmd.RequiredArgs.ResourceName, cmd.Config.TargetedOrganization().GUID) 91 case Stack: 92 cmd.displayMessageDefault() 93 labels, warnings, err = cmd.Actor.GetStackLabels(cmd.RequiredArgs.ResourceName) 94 default: 95 err = fmt.Errorf("Unsupported resource type of '%s'", cmd.RequiredArgs.ResourceType) 96 } 97 cmd.UI.DisplayWarnings(warnings) 98 if err != nil { 99 return err 100 } 101 102 cmd.printLabels(labels) 103 return nil 104 } 105 106 func (cmd LabelsCommand) canonicalResourceTypeForName() ResourceType { 107 return ResourceType(strings.ToLower(cmd.RequiredArgs.ResourceType)) 108 } 109 110 func (cmd LabelsCommand) printLabels(labels map[string]types.NullString) { 111 if len(labels) == 0 { 112 cmd.UI.DisplayText("No labels found.") 113 return 114 } 115 116 keys := make([]string, 0, len(labels)) 117 for key := range labels { 118 keys = append(keys, key) 119 } 120 sort.Strings(keys) 121 122 table := [][]string{ 123 { 124 cmd.UI.TranslateText("key"), 125 cmd.UI.TranslateText("value"), 126 }, 127 } 128 129 for _, key := range keys { 130 table = append(table, []string{key, labels[key].Value}) 131 } 132 133 cmd.UI.DisplayTableWithHeader("", table, ui.DefaultTableSpacePadding) 134 } 135 136 func (cmd LabelsCommand) validateFlags() error { 137 resourceType := cmd.canonicalResourceTypeForName() 138 if cmd.BuildpackStack != "" && resourceType != Buildpack { 139 return translatableerror.ArgumentCombinationError{ 140 Args: []string{ 141 cmd.RequiredArgs.ResourceType, "--stack, -s", 142 }, 143 } 144 } 145 146 if cmd.ServiceBroker != "" && !(resourceType == ServiceOffering || resourceType == ServicePlan) { 147 return translatableerror.ArgumentCombinationError{ 148 Args: []string{ 149 cmd.RequiredArgs.ResourceType, "--broker, -b", 150 }, 151 } 152 } 153 154 if cmd.ServiceOffering != "" && resourceType != ServicePlan { 155 return translatableerror.ArgumentCombinationError{ 156 Args: []string{ 157 cmd.RequiredArgs.ResourceType, "--offering, -o", 158 }, 159 } 160 } 161 162 return nil 163 } 164 165 func (cmd LabelsCommand) checkTarget() error { 166 switch ResourceType(cmd.RequiredArgs.ResourceType) { 167 case App, Route: 168 return cmd.SharedActor.CheckTarget(true, true) 169 case Space: 170 return cmd.SharedActor.CheckTarget(true, false) 171 default: 172 return cmd.SharedActor.CheckTarget(false, false) 173 } 174 } 175 176 func (cmd LabelsCommand) displayMessageDefault() { 177 cmd.UI.DisplayTextWithFlavor(fmt.Sprintf("Getting labels for %s {{.ResourceName}} as {{.User}}...", cmd.RequiredArgs.ResourceType), map[string]interface{}{ 178 "ResourceName": cmd.RequiredArgs.ResourceName, 179 "User": cmd.username, 180 }) 181 182 cmd.UI.DisplayNewline() 183 } 184 185 func (cmd LabelsCommand) displayMessageWithOrgAndSpace() { 186 cmd.UI.DisplayTextWithFlavor(fmt.Sprintf("Getting labels for %s {{.ResourceName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.User}}...", cmd.RequiredArgs.ResourceType), map[string]interface{}{ 187 "ResourceName": cmd.RequiredArgs.ResourceName, 188 "OrgName": cmd.Config.TargetedOrganization().Name, 189 "SpaceName": cmd.Config.TargetedSpace().Name, 190 "User": cmd.username, 191 }) 192 193 cmd.UI.DisplayNewline() 194 } 195 196 func (cmd LabelsCommand) displayMessageWithOrg() { 197 cmd.UI.DisplayTextWithFlavor(fmt.Sprintf("Getting labels for %s {{.ResourceName}} in org {{.OrgName}} as {{.User}}...", cmd.RequiredArgs.ResourceType), map[string]interface{}{ 198 "ResourceName": cmd.RequiredArgs.ResourceName, 199 "OrgName": cmd.Config.TargetedOrganization().Name, 200 "User": cmd.username, 201 }) 202 203 cmd.UI.DisplayNewline() 204 } 205 206 func (cmd LabelsCommand) displayMessageWithStack() { 207 var template string 208 if cmd.BuildpackStack == "" { 209 template = fmt.Sprintf("Getting labels for %s {{.ResourceName}} as {{.User}}...", cmd.RequiredArgs.ResourceType) 210 } else { 211 template = fmt.Sprintf("Getting labels for %s {{.ResourceName}} with stack {{.StackName}} as {{.User}}...", cmd.RequiredArgs.ResourceType) 212 } 213 214 cmd.UI.DisplayTextWithFlavor(template, map[string]interface{}{ 215 "ResourceName": cmd.RequiredArgs.ResourceName, 216 "StackName": cmd.BuildpackStack, 217 "User": cmd.username, 218 }) 219 220 cmd.UI.DisplayNewline() 221 } 222 223 func (cmd LabelsCommand) displayMessageForServiceCommands() { 224 var template string 225 template = fmt.Sprintf("Getting labels for %s {{.ResourceName}}", cmd.RequiredArgs.ResourceType) 226 227 if cmd.ServiceOffering != "" || cmd.ServiceBroker != "" { 228 template += " from" 229 } 230 if cmd.ServiceOffering != "" { 231 template += " service offering {{.ServiceOffering}}" 232 if cmd.ServiceBroker != "" { 233 template += " /" 234 } 235 } 236 237 if cmd.ServiceBroker != "" { 238 template += " service broker {{.ServiceBroker}}" 239 } 240 241 template += " as {{.User}}..." 242 243 cmd.UI.DisplayTextWithFlavor(template, map[string]interface{}{ 244 "ResourceName": cmd.RequiredArgs.ResourceName, 245 "ServiceBroker": cmd.ServiceBroker, 246 "ServiceOffering": cmd.ServiceOffering, 247 "User": cmd.username, 248 }) 249 250 cmd.UI.DisplayNewline() 251 }