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  }