github.com/LukasHeimann/cloudfoundrycli/v8@v8.4.4/command/v7/labels_command.go (about)

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