github.com/arunkumar7540/cli@v6.45.0+incompatible/command/v7/labels_command.go (about)

     1  package v7
     2  
     3  import (
     4  	"fmt"
     5  	"sort"
     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  	"code.cloudfoundry.org/cli/util/ui"
    14  )
    15  
    16  type ResourceType string
    17  
    18  const (
    19  	App   ResourceType = "app"
    20  	Org   ResourceType = "org"
    21  	Space ResourceType = "space"
    22  )
    23  
    24  //go:generate counterfeiter . LabelsActor
    25  
    26  type LabelsActor interface {
    27  	GetApplicationLabels(appName string, spaceGUID string) (map[string]types.NullString, v7action.Warnings, error)
    28  	GetOrganizationLabels(orgName string) (map[string]types.NullString, v7action.Warnings, error)
    29  	GetSpaceLabels(spaceName string, orgGUID string) (map[string]types.NullString, v7action.Warnings, error)
    30  }
    31  
    32  type LabelsCommand struct {
    33  	RequiredArgs flag.LabelsArgs `positional-args:"yes"`
    34  	usage        interface{}     `usage:"CF_NAME labels RESOURCE RESOURCE_NAME\n\nEXAMPLES:\n   cf labels app dora \n\nRESOURCES:\n   app\n   space\n   org\n\nSEE ALSO:\n   set-label, delete-label"`
    35  	UI           command.UI
    36  	Config       command.Config
    37  	SharedActor  command.SharedActor
    38  	Actor        LabelsActor
    39  }
    40  
    41  func (cmd *LabelsCommand) Setup(config command.Config, ui command.UI) error {
    42  	cmd.UI = ui
    43  	cmd.Config = config
    44  	cmd.SharedActor = sharedaction.NewActor(config)
    45  	ccClient, _, err := shared.NewClients(config, ui, true, "")
    46  	if err != nil {
    47  		return err
    48  	}
    49  	cmd.Actor = v7action.NewActor(ccClient, config, nil, nil)
    50  	return nil
    51  }
    52  
    53  func (cmd LabelsCommand) Execute(args []string) error {
    54  	var (
    55  		labels   map[string]types.NullString
    56  		warnings v7action.Warnings
    57  	)
    58  	username, err := cmd.Config.CurrentUserName()
    59  	if err != nil {
    60  		return err
    61  	}
    62  	switch ResourceType(cmd.RequiredArgs.ResourceType) {
    63  	case App:
    64  		labels, warnings, err = cmd.fetchAppLabels(username)
    65  	case Org:
    66  		labels, warnings, err = cmd.fetchOrgLabels(username)
    67  	case Space:
    68  		labels, warnings, err = cmd.fetchSpaceLabels(username)
    69  	default:
    70  		err = fmt.Errorf("Unsupported resource type of '%s'", cmd.RequiredArgs.ResourceType)
    71  	}
    72  	cmd.UI.DisplayWarnings(warnings)
    73  	if err != nil {
    74  		return err
    75  	}
    76  
    77  	cmd.printLabels(labels)
    78  	return nil
    79  
    80  }
    81  
    82  func (cmd LabelsCommand) fetchAppLabels(username string) (map[string]types.NullString, v7action.Warnings, error) {
    83  	err := cmd.SharedActor.CheckTarget(true, true)
    84  	if err != nil {
    85  		return nil, nil, err
    86  	}
    87  
    88  	cmd.UI.DisplayTextWithFlavor("Getting labels for app {{.AppName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.Username}}...", map[string]interface{}{
    89  		"AppName":   cmd.RequiredArgs.ResourceName,
    90  		"OrgName":   cmd.Config.TargetedOrganization().Name,
    91  		"SpaceName": cmd.Config.TargetedSpace().Name,
    92  		"Username":  username,
    93  	})
    94  
    95  	cmd.UI.DisplayNewline()
    96  	return cmd.Actor.GetApplicationLabels(cmd.RequiredArgs.ResourceName, cmd.Config.TargetedSpace().GUID)
    97  }
    98  
    99  func (cmd LabelsCommand) fetchOrgLabels(username string) (map[string]types.NullString, v7action.Warnings, error) {
   100  	err := cmd.SharedActor.CheckTarget(false, false)
   101  	if err != nil {
   102  		return nil, nil, err
   103  	}
   104  
   105  	cmd.UI.DisplayTextWithFlavor("Getting labels for org {{.OrgName}} as {{.Username}}...", map[string]interface{}{
   106  		"OrgName":  cmd.RequiredArgs.ResourceName,
   107  		"Username": username,
   108  	})
   109  
   110  	cmd.UI.DisplayNewline()
   111  
   112  	return cmd.Actor.GetOrganizationLabels(cmd.RequiredArgs.ResourceName)
   113  }
   114  
   115  func (cmd LabelsCommand) fetchSpaceLabels(username string) (map[string]types.NullString, v7action.Warnings, error) {
   116  	err := cmd.SharedActor.CheckTarget(true, false)
   117  	if err != nil {
   118  		return nil, nil, err
   119  	}
   120  
   121  	cmd.UI.DisplayTextWithFlavor("Getting labels for space {{.SpaceName}} in org {{.OrgName}} as {{.Username}}...", map[string]interface{}{
   122  		"SpaceName": cmd.RequiredArgs.ResourceName,
   123  		"OrgName":   cmd.Config.TargetedOrganization().Name,
   124  		"Username":  username,
   125  	})
   126  
   127  	cmd.UI.DisplayNewline()
   128  
   129  	return cmd.Actor.GetSpaceLabels(cmd.RequiredArgs.ResourceName, cmd.Config.TargetedOrganization().GUID)
   130  }
   131  
   132  func (cmd LabelsCommand) printLabels(labels map[string]types.NullString) {
   133  	if len(labels) == 0 {
   134  		cmd.UI.DisplayText("No labels found.")
   135  		return
   136  	}
   137  
   138  	keys := make([]string, 0, len(labels))
   139  	for key := range labels {
   140  		keys = append(keys, key)
   141  	}
   142  	sort.Strings(keys)
   143  
   144  	table := [][]string{
   145  		{
   146  			cmd.UI.TranslateText("key"),
   147  			cmd.UI.TranslateText("value"),
   148  		},
   149  	}
   150  
   151  	for _, key := range keys {
   152  		table = append(table, []string{key, labels[key].Value})
   153  	}
   154  
   155  	cmd.UI.DisplayTableWithHeader("", table, ui.DefaultTableSpacePadding)
   156  }