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 }