github.com/randomtask1155/cli@v6.41.1-0.20181227003417-a98eed78cbde+incompatible/command/v6/service_access_command.go (about)

     1  package v6
     2  
     3  import (
     4  	"sort"
     5  	"strings"
     6  
     7  	"code.cloudfoundry.org/cli/actor/sharedaction"
     8  	"code.cloudfoundry.org/cli/actor/v2action"
     9  	"code.cloudfoundry.org/cli/command"
    10  	"code.cloudfoundry.org/cli/command/translatableerror"
    11  	"code.cloudfoundry.org/cli/command/v6/shared"
    12  	"code.cloudfoundry.org/cli/util/sorting"
    13  )
    14  
    15  //go:generate counterfeiter . ServiceAccessActor
    16  
    17  type ServiceAccessActor interface {
    18  	GetServiceBrokerSummaries(broker string, service string, organization string) ([]v2action.ServiceBrokerSummary, v2action.Warnings, error)
    19  }
    20  
    21  type ServiceAccessCommand struct {
    22  	Broker          string      `short:"b" description:"Access for plans of a particular broker"`
    23  	Service         string      `short:"e" description:"Access for service name of a particular service offering"`
    24  	Organization    string      `short:"o" description:"Plans accessible by a particular organization"`
    25  	usage           interface{} `usage:"CF_NAME service-access [-b BROKER] [-e SERVICE] [-o ORG]"`
    26  	relatedCommands interface{} `related_commands:"marketplace, disable-service-access, enable-service-access, service-brokers"`
    27  
    28  	UI          command.UI
    29  	Config      command.Config
    30  	SharedActor command.SharedActor
    31  	Actor       ServiceAccessActor
    32  }
    33  
    34  func (cmd *ServiceAccessCommand) Setup(config command.Config, ui command.UI) error {
    35  	cmd.UI = ui
    36  	cmd.Config = config
    37  	cmd.SharedActor = sharedaction.NewActor(config)
    38  
    39  	ccClient, uaaClient, err := shared.NewClients(config, ui, true)
    40  	if err != nil {
    41  		return err
    42  	}
    43  	cmd.Actor = v2action.NewActor(ccClient, uaaClient, config)
    44  
    45  	return nil
    46  }
    47  
    48  func (cmd ServiceAccessCommand) Execute(args []string) error {
    49  	if !cmd.Config.Experimental() {
    50  		return translatableerror.UnrefactoredCommandError{}
    51  	}
    52  
    53  	if err := cmd.SharedActor.CheckTarget(false, false); err != nil {
    54  		return err
    55  	}
    56  
    57  	user, err := cmd.Config.CurrentUser()
    58  	if err != nil {
    59  		return err
    60  	}
    61  
    62  	template := "Getting service access as {{.CurrentUser}}..."
    63  	cmd.UI.DisplayTextWithFlavor(template, map[string]interface{}{
    64  		"CurrentUser": user.Name,
    65  	})
    66  
    67  	summaries, warnings, err := cmd.Actor.GetServiceBrokerSummaries(cmd.Broker, cmd.Service, cmd.Organization)
    68  	cmd.UI.DisplayWarnings(warnings)
    69  	if err != nil {
    70  		return err
    71  	}
    72  
    73  	sortBrokers(summaries)
    74  
    75  	tableHeaders := []string{"service", "plan", "access", "orgs"}
    76  	for _, broker := range summaries {
    77  		cmd.UI.DisplayText("broker: {{.BrokerName}}", map[string]interface{}{
    78  			"BrokerName": broker.Name,
    79  		})
    80  
    81  		data := [][]string{tableHeaders}
    82  
    83  		for _, service := range broker.Services {
    84  			for _, plan := range service.Plans {
    85  				data = append(data, []string{
    86  					service.Label,
    87  					plan.Name,
    88  					cmd.UI.TranslateText(formatAccess(plan)),
    89  					strings.Join(plan.VisibleTo, ","),
    90  				})
    91  			}
    92  		}
    93  
    94  		cmd.UI.DisplayTableWithHeader("   ", data, 3)
    95  		cmd.UI.DisplayNewline()
    96  	}
    97  
    98  	return nil
    99  }
   100  
   101  func formatAccess(plan v2action.ServicePlanSummary) string {
   102  	if plan.Public {
   103  		return "all"
   104  	}
   105  
   106  	if len(plan.VisibleTo) > 0 {
   107  		return "limited"
   108  	}
   109  
   110  	return "none"
   111  }
   112  
   113  func sortBrokers(brokers []v2action.ServiceBrokerSummary) {
   114  	sort.SliceStable(brokers, func(i, j int) bool {
   115  		return sorting.LessIgnoreCase(brokers[i].Name, brokers[j].Name)
   116  	})
   117  
   118  	for _, broker := range brokers {
   119  		sortServices(broker.Services)
   120  	}
   121  }
   122  
   123  func sortServices(services []v2action.ServiceSummary) {
   124  	sort.SliceStable(services, func(i, j int) bool {
   125  		return sorting.LessIgnoreCase(services[i].Label, services[j].Label)
   126  	})
   127  
   128  	for _, service := range services {
   129  		sortPlans(service.Plans)
   130  	}
   131  }
   132  
   133  func sortPlans(plans []v2action.ServicePlanSummary) {
   134  	sort.SliceStable(plans, func(i, j int) bool {
   135  		return sorting.LessIgnoreCase(plans[i].Name, plans[j].Name)
   136  	})
   137  
   138  	for _, plan := range plans {
   139  		sortOrgs(plan.VisibleTo)
   140  	}
   141  }
   142  
   143  func sortOrgs(orgs []string) {
   144  	sort.Strings(orgs)
   145  }