github.com/franc20/ayesa_sap@v7.0.0-beta.28.0.20200124003224-302d4d52fa6c+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/sharedaction"
     9  	"code.cloudfoundry.org/cli/actor/v7action"
    10  	"code.cloudfoundry.org/cli/command"
    11  	"code.cloudfoundry.org/cli/command/flag"
    12  	"code.cloudfoundry.org/cli/command/translatableerror"
    13  	"code.cloudfoundry.org/cli/command/v7/shared"
    14  	"code.cloudfoundry.org/cli/types"
    15  	"code.cloudfoundry.org/cli/util/ui"
    16  	"code.cloudfoundry.org/clock"
    17  )
    18  
    19  type ResourceType string
    20  
    21  const (
    22  	App           ResourceType = "app"
    23  	Buildpack     ResourceType = "buildpack"
    24  	Domain        ResourceType = "domain"
    25  	Org           ResourceType = "org"
    26  	Route         ResourceType = "route"
    27  	Space         ResourceType = "space"
    28  	Stack         ResourceType = "stack"
    29  	ServiceBroker ResourceType = "service-broker"
    30  )
    31  
    32  //go:generate counterfeiter . LabelsActor
    33  
    34  type LabelsActor interface {
    35  	GetApplicationLabels(appName string, spaceGUID string) (map[string]types.NullString, v7action.Warnings, error)
    36  	GetDomainLabels(domainName string) (map[string]types.NullString, v7action.Warnings, error)
    37  	GetOrganizationLabels(orgName string) (map[string]types.NullString, v7action.Warnings, error)
    38  	GetRouteLabels(routeName string, spaceGUID string) (map[string]types.NullString, v7action.Warnings, error)
    39  	GetSpaceLabels(spaceName string, orgGUID string) (map[string]types.NullString, v7action.Warnings, error)
    40  	GetBuildpackLabels(buildpackName string, buildpackStack string) (map[string]types.NullString, v7action.Warnings, error)
    41  	GetStackLabels(stackName string) (map[string]types.NullString, v7action.Warnings, error)
    42  	GetServiceBrokerLabels(serviceBrokerName string) (map[string]types.NullString, v7action.Warnings, error)
    43  }
    44  
    45  type LabelsCommand struct {
    46  	RequiredArgs    flag.LabelsArgs `positional-args:"yes"`
    47  	BuildpackStack  string          `long:"stack" short:"s" description:"Specify stack to disambiguate buildpacks with the same name"`
    48  	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   space\n   stack"`
    49  	relatedCommands interface{}     `related_commands:"set-label, unset-label"`
    50  	UI              command.UI
    51  	Config          command.Config
    52  	SharedActor     command.SharedActor
    53  	Actor           LabelsActor
    54  }
    55  
    56  func (cmd *LabelsCommand) Setup(config command.Config, ui command.UI) error {
    57  	cmd.UI = ui
    58  	cmd.Config = config
    59  	cmd.SharedActor = sharedaction.NewActor(config)
    60  	ccClient, _, err := shared.GetNewClientsAndConnectToCF(config, ui, "")
    61  	if err != nil {
    62  		return err
    63  	}
    64  	cmd.Actor = v7action.NewActor(ccClient, config, nil, nil, clock.NewClock())
    65  	return nil
    66  }
    67  
    68  func (cmd LabelsCommand) Execute(args []string) error {
    69  	var (
    70  		labels   map[string]types.NullString
    71  		warnings v7action.Warnings
    72  	)
    73  	username, err := cmd.Config.CurrentUserName()
    74  	if err != nil {
    75  		return err
    76  	}
    77  
    78  	err = cmd.validateFlags()
    79  	if err != nil {
    80  		return err
    81  	}
    82  
    83  	switch cmd.canonicalResourceTypeForName() {
    84  	case App:
    85  		labels, warnings, err = cmd.fetchAppLabels(username)
    86  	case Buildpack:
    87  		labels, warnings, err = cmd.fetchBuildpackLabels(username)
    88  	case Domain:
    89  		labels, warnings, err = cmd.fetchDomainLabels(username)
    90  	case Org:
    91  		labels, warnings, err = cmd.fetchOrgLabels(username)
    92  	case Route:
    93  		labels, warnings, err = cmd.fetchRouteLabels(username)
    94  	case ServiceBroker:
    95  		labels, warnings, err = cmd.fetchServiceBrokerLabels(username)
    96  	case Space:
    97  		labels, warnings, err = cmd.fetchSpaceLabels(username)
    98  	case Stack:
    99  		labels, warnings, err = cmd.fetchStackLabels(username)
   100  	default:
   101  		err = fmt.Errorf("Unsupported resource type of '%s'", cmd.RequiredArgs.ResourceType)
   102  	}
   103  	cmd.UI.DisplayWarnings(warnings)
   104  	if err != nil {
   105  		return err
   106  	}
   107  
   108  	cmd.printLabels(labels)
   109  	return nil
   110  }
   111  
   112  func (cmd LabelsCommand) fetchAppLabels(username string) (map[string]types.NullString, v7action.Warnings, error) {
   113  	err := cmd.SharedActor.CheckTarget(true, true)
   114  	if err != nil {
   115  		return nil, nil, err
   116  	}
   117  
   118  	cmd.UI.DisplayTextWithFlavor("Getting labels for app {{.AppName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.Username}}...", map[string]interface{}{
   119  		"AppName":   cmd.RequiredArgs.ResourceName,
   120  		"OrgName":   cmd.Config.TargetedOrganization().Name,
   121  		"SpaceName": cmd.Config.TargetedSpace().Name,
   122  		"Username":  username,
   123  	})
   124  
   125  	cmd.UI.DisplayNewline()
   126  	return cmd.Actor.GetApplicationLabels(cmd.RequiredArgs.ResourceName, cmd.Config.TargetedSpace().GUID)
   127  }
   128  
   129  func (cmd LabelsCommand) fetchDomainLabels(username string) (map[string]types.NullString, v7action.Warnings, error) {
   130  	err := cmd.SharedActor.CheckTarget(false, false)
   131  	if err != nil {
   132  		return nil, nil, err
   133  	}
   134  
   135  	cmd.UI.DisplayTextWithFlavor("Getting labels for domain {{.DomainName}} as {{.Username}}...", map[string]interface{}{
   136  		"DomainName": cmd.RequiredArgs.ResourceName,
   137  		"Username":   username,
   138  	})
   139  
   140  	cmd.UI.DisplayNewline()
   141  
   142  	return cmd.Actor.GetDomainLabels(cmd.RequiredArgs.ResourceName)
   143  }
   144  
   145  func (cmd LabelsCommand) fetchOrgLabels(username string) (map[string]types.NullString, v7action.Warnings, error) {
   146  	err := cmd.SharedActor.CheckTarget(false, false)
   147  	if err != nil {
   148  		return nil, nil, err
   149  	}
   150  
   151  	cmd.UI.DisplayTextWithFlavor("Getting labels for org {{.OrgName}} as {{.Username}}...", map[string]interface{}{
   152  		"OrgName":  cmd.RequiredArgs.ResourceName,
   153  		"Username": username,
   154  	})
   155  
   156  	cmd.UI.DisplayNewline()
   157  	return cmd.Actor.GetOrganizationLabels(cmd.RequiredArgs.ResourceName)
   158  }
   159  
   160  func (cmd LabelsCommand) fetchRouteLabels(username string) (map[string]types.NullString, v7action.Warnings, error) {
   161  	err := cmd.SharedActor.CheckTarget(true, true)
   162  	if err != nil {
   163  		return nil, nil, err
   164  	}
   165  
   166  	cmd.UI.DisplayTextWithFlavor("Getting labels for route {{.RouteName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.Username}}...", map[string]interface{}{
   167  		"RouteName": cmd.RequiredArgs.ResourceName,
   168  		"OrgName":   cmd.Config.TargetedOrganization().Name,
   169  		"SpaceName": cmd.Config.TargetedSpace().Name,
   170  		"Username":  username,
   171  	})
   172  
   173  	cmd.UI.DisplayNewline()
   174  
   175  	return cmd.Actor.GetRouteLabels(cmd.RequiredArgs.ResourceName, cmd.Config.TargetedSpace().GUID)
   176  }
   177  
   178  func (cmd LabelsCommand) fetchServiceBrokerLabels(username string) (map[string]types.NullString, v7action.Warnings, error) {
   179  	err := cmd.SharedActor.CheckTarget(false, false)
   180  	if err != nil {
   181  		return nil, nil, err
   182  	}
   183  
   184  	cmd.UI.DisplayTextWithFlavor("Getting labels for service-broker {{.ServiceBrokerName}} as {{.Username}}...", map[string]interface{}{
   185  		"ServiceBrokerName": cmd.RequiredArgs.ResourceName,
   186  		"Username":          username,
   187  	})
   188  
   189  	cmd.UI.DisplayNewline()
   190  
   191  	return cmd.Actor.GetServiceBrokerLabels(cmd.RequiredArgs.ResourceName)
   192  }
   193  
   194  func (cmd LabelsCommand) fetchSpaceLabels(username string) (map[string]types.NullString, v7action.Warnings, error) {
   195  	err := cmd.SharedActor.CheckTarget(true, false)
   196  	if err != nil {
   197  		return nil, nil, err
   198  	}
   199  	cmd.UI.DisplayTextWithFlavor("Getting labels for space {{.SpaceName}} in org {{.OrgName}} as {{.Username}}...", map[string]interface{}{
   200  		"SpaceName": cmd.RequiredArgs.ResourceName,
   201  		"OrgName":   cmd.Config.TargetedOrganization().Name,
   202  		"Username":  username,
   203  	})
   204  
   205  	cmd.UI.DisplayNewline()
   206  
   207  	return cmd.Actor.GetSpaceLabels(cmd.RequiredArgs.ResourceName, cmd.Config.TargetedOrganization().GUID)
   208  }
   209  
   210  func (cmd LabelsCommand) fetchStackLabels(username string) (map[string]types.NullString, v7action.Warnings, error) {
   211  	err := cmd.SharedActor.CheckTarget(false, false)
   212  	if err != nil {
   213  		return nil, nil, err
   214  	}
   215  
   216  	cmd.UI.DisplayTextWithFlavor("Getting labels for stack {{.StackName}} as {{.Username}}...", map[string]interface{}{
   217  		"StackName": cmd.RequiredArgs.ResourceName,
   218  		"Username":  username,
   219  	})
   220  
   221  	cmd.UI.DisplayNewline()
   222  
   223  	return cmd.Actor.GetStackLabels(cmd.RequiredArgs.ResourceName)
   224  }
   225  
   226  func (cmd LabelsCommand) fetchBuildpackLabels(username string) (map[string]types.NullString, v7action.Warnings, error) {
   227  	err := cmd.SharedActor.CheckTarget(false, false)
   228  	if err != nil {
   229  		return nil, nil, err
   230  	}
   231  
   232  	var template string
   233  	if cmd.BuildpackStack != "" {
   234  		template = "Getting labels for %s {{.ResourceName}} with stack {{.StackName}} as {{.User}}..."
   235  	} else {
   236  		template = "Getting labels for %s {{.ResourceName}} as {{.User}}..."
   237  	}
   238  	preFlavoringText := fmt.Sprintf(template, cmd.RequiredArgs.ResourceType)
   239  	cmd.UI.DisplayTextWithFlavor(
   240  		preFlavoringText,
   241  		map[string]interface{}{
   242  			"ResourceName": cmd.RequiredArgs.ResourceName,
   243  			"StackName":    cmd.BuildpackStack,
   244  			"User":         username,
   245  		},
   246  	)
   247  
   248  	cmd.UI.DisplayNewline()
   249  
   250  	return cmd.Actor.GetBuildpackLabels(cmd.RequiredArgs.ResourceName, cmd.BuildpackStack)
   251  }
   252  
   253  func (cmd LabelsCommand) canonicalResourceTypeForName() ResourceType {
   254  	return ResourceType(strings.ToLower(cmd.RequiredArgs.ResourceType))
   255  }
   256  
   257  func (cmd LabelsCommand) printLabels(labels map[string]types.NullString) {
   258  	if len(labels) == 0 {
   259  		cmd.UI.DisplayText("No labels found.")
   260  		return
   261  	}
   262  
   263  	keys := make([]string, 0, len(labels))
   264  	for key := range labels {
   265  		keys = append(keys, key)
   266  	}
   267  	sort.Strings(keys)
   268  
   269  	table := [][]string{
   270  		{
   271  			cmd.UI.TranslateText("key"),
   272  			cmd.UI.TranslateText("value"),
   273  		},
   274  	}
   275  
   276  	for _, key := range keys {
   277  		table = append(table, []string{key, labels[key].Value})
   278  	}
   279  
   280  	cmd.UI.DisplayTableWithHeader("", table, ui.DefaultTableSpacePadding)
   281  }
   282  
   283  func (cmd LabelsCommand) validateFlags() error {
   284  	if cmd.BuildpackStack != "" && cmd.canonicalResourceTypeForName() != Buildpack {
   285  		return translatableerror.ArgumentCombinationError{
   286  			Args: []string{
   287  				cmd.RequiredArgs.ResourceType, "--stack, -s",
   288  			},
   289  		}
   290  	}
   291  	return nil
   292  }