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