github.com/sleungcy/cli@v7.1.0+incompatible/command/v7/labels_command.go (about)

     1  package v7
     2  
     3  import (
     4  	"fmt"
     5  	"sort"
     6  	"strings"
     7  
     8  	"code.cloudfoundry.org/cli/actor/v7action"
     9  	"code.cloudfoundry.org/cli/command/flag"
    10  	"code.cloudfoundry.org/cli/command/translatableerror"
    11  	"code.cloudfoundry.org/cli/types"
    12  	"code.cloudfoundry.org/cli/util/ui"
    13  )
    14  
    15  type ResourceType string
    16  
    17  const (
    18  	App             ResourceType = "app"
    19  	Buildpack       ResourceType = "buildpack"
    20  	Domain          ResourceType = "domain"
    21  	Org             ResourceType = "org"
    22  	Route           ResourceType = "route"
    23  	Space           ResourceType = "space"
    24  	Stack           ResourceType = "stack"
    25  	ServiceBroker   ResourceType = "service-broker"
    26  	ServiceOffering ResourceType = "service-offering"
    27  	ServicePlan     ResourceType = "service-plan"
    28  )
    29  
    30  type LabelsCommand struct {
    31  	BaseCommand
    32  
    33  	RequiredArgs    flag.LabelsArgs `positional-args:"yes"`
    34  	BuildpackStack  string          `long:"stack" short:"s" description:"Specify stack to disambiguate buildpacks with the same name"`
    35  	usage           interface{}     `usage:"CF_NAME labels RESOURCE RESOURCE_NAME\n\nEXAMPLES:\n   cf labels app dora\n   cf labels org business\n   cf labels buildpack go_buildpack --stack cflinuxfs3 \n\nRESOURCES:\n   app\n   buildpack\n   domain\n   org\n   route\n   service-broker\n   service-offering\n   service-plan\n   space\n   stack"`
    36  	relatedCommands interface{}     `related_commands:"set-label, unset-label"`
    37  	ServiceBroker   string          `long:"broker" short:"b" description:"Specify a service broker to disambiguate service offerings or service plans with the same name."`
    38  	ServiceOffering string          `long:"offering" short:"e" description:"Specify a service offering to disambiguate service plans with the same name."`
    39  
    40  	username string
    41  }
    42  
    43  func (cmd LabelsCommand) Execute(args []string) error {
    44  	var (
    45  		labels   map[string]types.NullString
    46  		warnings v7action.Warnings
    47  		err      error
    48  	)
    49  
    50  	cmd.username, err = cmd.Config.CurrentUserName()
    51  	if err != nil {
    52  		return err
    53  	}
    54  
    55  	if err := cmd.validateFlags(); err != nil {
    56  		return err
    57  	}
    58  
    59  	if err := cmd.checkTarget(); err != nil {
    60  		return err
    61  	}
    62  
    63  	switch cmd.canonicalResourceTypeForName() {
    64  	case App:
    65  		cmd.displayMessageWithOrgAndSpace()
    66  		labels, warnings, err = cmd.Actor.GetApplicationLabels(cmd.RequiredArgs.ResourceName, cmd.Config.TargetedSpace().GUID)
    67  	case Buildpack:
    68  		cmd.displayMessageWithStack()
    69  		labels, warnings, err = cmd.Actor.GetBuildpackLabels(cmd.RequiredArgs.ResourceName, cmd.BuildpackStack)
    70  	case Domain:
    71  		cmd.displayMessageDefault()
    72  		labels, warnings, err = cmd.Actor.GetDomainLabels(cmd.RequiredArgs.ResourceName)
    73  	case Org:
    74  		cmd.displayMessageDefault()
    75  		labels, warnings, err = cmd.Actor.GetOrganizationLabels(cmd.RequiredArgs.ResourceName)
    76  	case Route:
    77  		cmd.displayMessageWithOrgAndSpace()
    78  		labels, warnings, err = cmd.Actor.GetRouteLabels(cmd.RequiredArgs.ResourceName, cmd.Config.TargetedSpace().GUID)
    79  	case ServiceBroker:
    80  		cmd.displayMessageDefault()
    81  		labels, warnings, err = cmd.Actor.GetServiceBrokerLabels(cmd.RequiredArgs.ResourceName)
    82  	case ServiceOffering:
    83  		cmd.displayMessageForServiceCommands()
    84  		labels, warnings, err = cmd.Actor.GetServiceOfferingLabels(cmd.RequiredArgs.ResourceName, cmd.ServiceBroker)
    85  	case ServicePlan:
    86  		cmd.displayMessageForServiceCommands()
    87  		labels, warnings, err = cmd.Actor.GetServicePlanLabels(cmd.RequiredArgs.ResourceName, cmd.ServiceOffering, cmd.ServiceBroker)
    88  	case Space:
    89  		cmd.displayMessageWithOrg()
    90  		labels, warnings, err = cmd.Actor.GetSpaceLabels(cmd.RequiredArgs.ResourceName, cmd.Config.TargetedOrganization().GUID)
    91  	case Stack:
    92  		cmd.displayMessageDefault()
    93  		labels, warnings, err = cmd.Actor.GetStackLabels(cmd.RequiredArgs.ResourceName)
    94  	default:
    95  		err = fmt.Errorf("Unsupported resource type of '%s'", cmd.RequiredArgs.ResourceType)
    96  	}
    97  	cmd.UI.DisplayWarnings(warnings)
    98  	if err != nil {
    99  		return err
   100  	}
   101  
   102  	cmd.printLabels(labels)
   103  	return nil
   104  }
   105  
   106  func (cmd LabelsCommand) canonicalResourceTypeForName() ResourceType {
   107  	return ResourceType(strings.ToLower(cmd.RequiredArgs.ResourceType))
   108  }
   109  
   110  func (cmd LabelsCommand) printLabels(labels map[string]types.NullString) {
   111  	if len(labels) == 0 {
   112  		cmd.UI.DisplayText("No labels found.")
   113  		return
   114  	}
   115  
   116  	keys := make([]string, 0, len(labels))
   117  	for key := range labels {
   118  		keys = append(keys, key)
   119  	}
   120  	sort.Strings(keys)
   121  
   122  	table := [][]string{
   123  		{
   124  			cmd.UI.TranslateText("key"),
   125  			cmd.UI.TranslateText("value"),
   126  		},
   127  	}
   128  
   129  	for _, key := range keys {
   130  		table = append(table, []string{key, labels[key].Value})
   131  	}
   132  
   133  	cmd.UI.DisplayTableWithHeader("", table, ui.DefaultTableSpacePadding)
   134  }
   135  
   136  func (cmd LabelsCommand) validateFlags() error {
   137  	resourceType := cmd.canonicalResourceTypeForName()
   138  	if cmd.BuildpackStack != "" && resourceType != Buildpack {
   139  		return translatableerror.ArgumentCombinationError{
   140  			Args: []string{
   141  				cmd.RequiredArgs.ResourceType, "--stack, -s",
   142  			},
   143  		}
   144  	}
   145  
   146  	if cmd.ServiceBroker != "" && !(resourceType == ServiceOffering || resourceType == ServicePlan) {
   147  		return translatableerror.ArgumentCombinationError{
   148  			Args: []string{
   149  				cmd.RequiredArgs.ResourceType, "--broker, -b",
   150  			},
   151  		}
   152  	}
   153  
   154  	if cmd.ServiceOffering != "" && resourceType != ServicePlan {
   155  		return translatableerror.ArgumentCombinationError{
   156  			Args: []string{
   157  				cmd.RequiredArgs.ResourceType, "--offering, -o",
   158  			},
   159  		}
   160  	}
   161  
   162  	return nil
   163  }
   164  
   165  func (cmd LabelsCommand) checkTarget() error {
   166  	switch ResourceType(cmd.RequiredArgs.ResourceType) {
   167  	case App, Route:
   168  		return cmd.SharedActor.CheckTarget(true, true)
   169  	case Space:
   170  		return cmd.SharedActor.CheckTarget(true, false)
   171  	default:
   172  		return cmd.SharedActor.CheckTarget(false, false)
   173  	}
   174  }
   175  
   176  func (cmd LabelsCommand) displayMessageDefault() {
   177  	cmd.UI.DisplayTextWithFlavor(fmt.Sprintf("Getting labels for %s {{.ResourceName}} as {{.User}}...", cmd.RequiredArgs.ResourceType), map[string]interface{}{
   178  		"ResourceName": cmd.RequiredArgs.ResourceName,
   179  		"User":         cmd.username,
   180  	})
   181  
   182  	cmd.UI.DisplayNewline()
   183  }
   184  
   185  func (cmd LabelsCommand) displayMessageWithOrgAndSpace() {
   186  	cmd.UI.DisplayTextWithFlavor(fmt.Sprintf("Getting labels for %s {{.ResourceName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.User}}...", cmd.RequiredArgs.ResourceType), map[string]interface{}{
   187  		"ResourceName": cmd.RequiredArgs.ResourceName,
   188  		"OrgName":      cmd.Config.TargetedOrganization().Name,
   189  		"SpaceName":    cmd.Config.TargetedSpace().Name,
   190  		"User":         cmd.username,
   191  	})
   192  
   193  	cmd.UI.DisplayNewline()
   194  }
   195  
   196  func (cmd LabelsCommand) displayMessageWithOrg() {
   197  	cmd.UI.DisplayTextWithFlavor(fmt.Sprintf("Getting labels for %s {{.ResourceName}} in org {{.OrgName}} as {{.User}}...", cmd.RequiredArgs.ResourceType), map[string]interface{}{
   198  		"ResourceName": cmd.RequiredArgs.ResourceName,
   199  		"OrgName":      cmd.Config.TargetedOrganization().Name,
   200  		"User":         cmd.username,
   201  	})
   202  
   203  	cmd.UI.DisplayNewline()
   204  }
   205  
   206  func (cmd LabelsCommand) displayMessageWithStack() {
   207  	var template string
   208  	if cmd.BuildpackStack == "" {
   209  		template = fmt.Sprintf("Getting labels for %s {{.ResourceName}} as {{.User}}...", cmd.RequiredArgs.ResourceType)
   210  	} else {
   211  		template = fmt.Sprintf("Getting labels for %s {{.ResourceName}} with stack {{.StackName}} as {{.User}}...", cmd.RequiredArgs.ResourceType)
   212  	}
   213  
   214  	cmd.UI.DisplayTextWithFlavor(template, map[string]interface{}{
   215  		"ResourceName": cmd.RequiredArgs.ResourceName,
   216  		"StackName":    cmd.BuildpackStack,
   217  		"User":         cmd.username,
   218  	})
   219  
   220  	cmd.UI.DisplayNewline()
   221  }
   222  
   223  func (cmd LabelsCommand) displayMessageForServiceCommands() {
   224  	var template string
   225  	template = fmt.Sprintf("Getting labels for %s {{.ResourceName}}", cmd.RequiredArgs.ResourceType)
   226  
   227  	if cmd.ServiceOffering != "" || cmd.ServiceBroker != "" {
   228  		template += " from"
   229  	}
   230  	if cmd.ServiceOffering != "" {
   231  		template += " service offering {{.ServiceOffering}}"
   232  		if cmd.ServiceBroker != "" {
   233  			template += " /"
   234  		}
   235  	}
   236  
   237  	if cmd.ServiceBroker != "" {
   238  		template += " service broker {{.ServiceBroker}}"
   239  	}
   240  
   241  	template += " as {{.User}}..."
   242  
   243  	cmd.UI.DisplayTextWithFlavor(template, map[string]interface{}{
   244  		"ResourceName":    cmd.RequiredArgs.ResourceName,
   245  		"ServiceBroker":   cmd.ServiceBroker,
   246  		"ServiceOffering": cmd.ServiceOffering,
   247  		"User":            cmd.username,
   248  	})
   249  
   250  	cmd.UI.DisplayNewline()
   251  }