github.com/arunkumar7540/cli@v6.45.0+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  	UpdateSpaceLabelsBySpaceName(string, string, map[string]types.NullString) (v7action.Warnings, error)
    21  }
    22  
    23  type SetLabelCommand struct {
    24  	RequiredArgs flag.SetLabelArgs `positional-args:"yes"`
    25  	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"`
    26  	UI           command.UI
    27  	Config       command.Config
    28  	SharedActor  command.SharedActor
    29  	Actor        SetLabelActor
    30  }
    31  
    32  func (cmd *SetLabelCommand) Setup(config command.Config, ui command.UI) error {
    33  	cmd.UI = ui
    34  	cmd.Config = config
    35  	cmd.SharedActor = sharedaction.NewActor(config)
    36  	ccClient, _, err := shared.NewClients(config, ui, true, "")
    37  	if err != nil {
    38  		return err
    39  	}
    40  	cmd.Actor = v7action.NewActor(ccClient, config, nil, nil)
    41  	return nil
    42  }
    43  
    44  func (cmd SetLabelCommand) Execute(args []string) error {
    45  
    46  	labels := make(map[string]types.NullString)
    47  	for _, label := range cmd.RequiredArgs.Labels {
    48  		parts := strings.SplitN(label, "=", 2)
    49  		if len(parts) < 2 {
    50  			return fmt.Errorf("Metadata error: no value provided for label '%s'", label)
    51  		}
    52  		labels[parts[0]] = types.NewNullString(parts[1])
    53  	}
    54  
    55  	username, err := cmd.Config.CurrentUserName()
    56  	if err != nil {
    57  		return err
    58  	}
    59  
    60  	switch ResourceType(cmd.RequiredArgs.ResourceType) {
    61  	case App:
    62  		err = cmd.executeApp(username, labels)
    63  	case Org:
    64  		err = cmd.executeOrg(username, labels)
    65  	case Space:
    66  		err = cmd.executeSpace(username, labels)
    67  	default:
    68  		err = fmt.Errorf("Unsupported resource type of '%s'", cmd.RequiredArgs.ResourceType)
    69  	}
    70  
    71  	if err != nil {
    72  		return err
    73  	}
    74  
    75  	cmd.UI.DisplayOK()
    76  	return nil
    77  }
    78  
    79  func (cmd SetLabelCommand) executeOrg(username string, labels map[string]types.NullString) error {
    80  	err := cmd.SharedActor.CheckTarget(false, false)
    81  	if err != nil {
    82  		return err
    83  	}
    84  
    85  	preFlavoringText := fmt.Sprintf("Setting label(s) for %s {{.ResourceName}} as {{.User}}...", cmd.RequiredArgs.ResourceType)
    86  	cmd.UI.DisplayTextWithFlavor(
    87  		preFlavoringText,
    88  		map[string]interface{}{
    89  			"ResourceName": cmd.RequiredArgs.ResourceName,
    90  			"OrgName":      cmd.Config.TargetedOrganization().Name,
    91  			"User":         username,
    92  		},
    93  	)
    94  
    95  	warnings, err := cmd.Actor.UpdateOrganizationLabelsByOrganizationName(cmd.RequiredArgs.ResourceName,
    96  		labels)
    97  	cmd.UI.DisplayWarnings(warnings)
    98  
    99  	return err
   100  }
   101  
   102  func (cmd SetLabelCommand) executeApp(username string, labels map[string]types.NullString) error {
   103  	err := cmd.SharedActor.CheckTarget(true, true)
   104  	if err != nil {
   105  		return err
   106  	}
   107  
   108  	appName := cmd.RequiredArgs.ResourceName
   109  
   110  	preFlavoringText := fmt.Sprintf("Setting label(s) for %s {{.ResourceName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.User}}...", cmd.RequiredArgs.ResourceType)
   111  	cmd.UI.DisplayTextWithFlavor(
   112  		preFlavoringText,
   113  		map[string]interface{}{
   114  			"ResourceName": appName,
   115  			"OrgName":      cmd.Config.TargetedOrganization().Name,
   116  			"SpaceName":    cmd.Config.TargetedSpace().Name,
   117  			"User":         username,
   118  		},
   119  	)
   120  
   121  	warnings, err := cmd.Actor.UpdateApplicationLabelsByApplicationName(appName,
   122  		cmd.Config.TargetedSpace().GUID,
   123  		labels)
   124  
   125  	cmd.UI.DisplayWarnings(warnings)
   126  	if err != nil {
   127  		return err
   128  	}
   129  
   130  	return nil
   131  }
   132  
   133  func (cmd SetLabelCommand) executeSpace(username string, labels map[string]types.NullString) error {
   134  	err := cmd.SharedActor.CheckTarget(true, false)
   135  	if err != nil {
   136  		return err
   137  	}
   138  
   139  	spaceName := cmd.RequiredArgs.ResourceName
   140  
   141  	preFlavoringText := fmt.Sprintf("Setting label(s) for %s {{.ResourceName}} in org {{.OrgName}} as {{.User}}...", cmd.RequiredArgs.ResourceType)
   142  	cmd.UI.DisplayTextWithFlavor(
   143  		preFlavoringText,
   144  		map[string]interface{}{
   145  			"ResourceName": spaceName,
   146  			"OrgName":      cmd.Config.TargetedOrganization().Name,
   147  			"User":         username,
   148  		},
   149  	)
   150  
   151  	warnings, err := cmd.Actor.UpdateSpaceLabelsBySpaceName(spaceName,
   152  		cmd.Config.TargetedOrganization().GUID,
   153  		labels)
   154  
   155  	cmd.UI.DisplayWarnings(warnings)
   156  	if err != nil {
   157  		return err
   158  	}
   159  
   160  	return nil
   161  }