github.com/cloudfoundry-community/cloudfoundry-cli@v6.44.1-0.20240130060226-cda5ed8e89a5+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/v7/shared" 12 "code.cloudfoundry.org/cli/types" 13 ) 14 15 //go:generate counterfeiter . SetLabelActor 16 17 type SetLabelActor interface { 18 UpdateApplicationLabelsByApplicationName(string, string, map[string]types.NullString) (v7action.Warnings, error) 19 UpdateOrganizationLabelsByOrganizationName(string, map[string]types.NullString) (v7action.Warnings, error) 20 } 21 22 type SetLabelCommand struct { 23 RequiredArgs flag.SetLabelArgs `positional-args:"yes"` 24 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 space business_space public-facing=false owner=jane_doe\n\nRESOURCES:\n app\n org\n space\n\nSEE ALSO:\n delete-label, labels"` 25 UI command.UI 26 Config command.Config 27 SharedActor command.SharedActor 28 Actor SetLabelActor 29 } 30 31 func (cmd *SetLabelCommand) Setup(config command.Config, ui command.UI) error { 32 cmd.UI = ui 33 cmd.Config = config 34 cmd.SharedActor = sharedaction.NewActor(config) 35 ccClient, _, err := shared.NewClients(config, ui, true, "") 36 if err != nil { 37 return err 38 } 39 cmd.Actor = v7action.NewActor(ccClient, config, nil, nil) 40 return nil 41 } 42 43 func (cmd SetLabelCommand) Execute(args []string) error { 44 45 labels := make(map[string]types.NullString) 46 for _, label := range cmd.RequiredArgs.Labels { 47 parts := strings.SplitN(label, "=", 2) 48 if len(parts) < 2 { 49 return fmt.Errorf("Metadata error: no value provided for label '%s'", label) 50 } 51 labels[parts[0]] = types.NewNullString(parts[1]) 52 } 53 54 username, err := cmd.Config.CurrentUserName() 55 if err != nil { 56 return err 57 } 58 59 switch cmd.RequiredArgs.ResourceType { 60 case "app": 61 err = cmd.executeApp(username, labels) 62 63 case "org": 64 err = cmd.executeOrg(username, labels) 65 default: 66 err = fmt.Errorf("Unsupported resource type of '%s'", cmd.RequiredArgs.ResourceType) 67 } 68 69 if err != nil { 70 return err 71 } 72 73 cmd.UI.DisplayOK() 74 return nil 75 } 76 77 func (cmd SetLabelCommand) executeOrg(username string, labels map[string]types.NullString) error { 78 err := cmd.SharedActor.CheckTarget(false, false) 79 if err != nil { 80 return err 81 } 82 83 preFlavoringText := fmt.Sprintf("Setting label(s) for %s {{.ResourceName}} as {{.User}}...", cmd.RequiredArgs.ResourceType) 84 cmd.UI.DisplayTextWithFlavor( 85 preFlavoringText, 86 map[string]interface{}{ 87 "ResourceName": cmd.RequiredArgs.ResourceName, 88 "OrgName": cmd.Config.TargetedOrganization().Name, 89 "User": username, 90 }, 91 ) 92 93 warnings, err := cmd.Actor.UpdateOrganizationLabelsByOrganizationName(cmd.RequiredArgs.ResourceName, 94 labels) 95 cmd.UI.DisplayWarnings(warnings) 96 97 return err 98 } 99 100 func (cmd SetLabelCommand) executeApp(username string, labels map[string]types.NullString) error { 101 err := cmd.SharedActor.CheckTarget(true, true) 102 if err != nil { 103 return err 104 } 105 106 appName := cmd.RequiredArgs.ResourceName 107 108 preFlavoringText := fmt.Sprintf("Setting label(s) for %s {{.ResourceName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.User}}...", cmd.RequiredArgs.ResourceType) 109 cmd.UI.DisplayTextWithFlavor( 110 preFlavoringText, 111 map[string]interface{}{ 112 "ResourceName": appName, 113 "OrgName": cmd.Config.TargetedOrganization().Name, 114 "SpaceName": cmd.Config.TargetedSpace().Name, 115 "User": username, 116 }, 117 ) 118 119 warnings, err := cmd.Actor.UpdateApplicationLabelsByApplicationName(appName, 120 cmd.Config.TargetedSpace().GUID, 121 labels) 122 123 cmd.UI.DisplayWarnings(warnings) 124 if err != nil { 125 return err 126 } 127 128 return nil 129 }