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  }