github.com/jenspinney/cli@v6.42.1-0.20190207184520-7450c600020e+incompatible/command/v6/marketplace_command.go (about) 1 package v6 2 3 import ( 4 "errors" 5 "fmt" 6 "strings" 7 8 "code.cloudfoundry.org/cli/actor/sharedaction" 9 "code.cloudfoundry.org/cli/actor/v2action" 10 "code.cloudfoundry.org/cli/command" 11 "code.cloudfoundry.org/cli/command/translatableerror" 12 "code.cloudfoundry.org/cli/command/v6/shared" 13 "code.cloudfoundry.org/cli/util/ui" 14 ) 15 16 //go:generate counterfeiter . ServicesSummariesActor 17 18 type ServicesSummariesActor interface { 19 GetServicesSummaries() ([]v2action.ServiceSummary, v2action.Warnings, error) 20 GetServicesSummariesForSpace(spaceGUID string) ([]v2action.ServiceSummary, v2action.Warnings, error) 21 22 GetServiceSummaryByName(serviceName string) (v2action.ServiceSummary, v2action.Warnings, error) 23 GetServiceSummaryForSpaceByName(spaceGUID, serviceName string) (v2action.ServiceSummary, v2action.Warnings, error) 24 } 25 26 type MarketplaceCommand struct { 27 ServiceName string `short:"s" description:"Show plan details for a particular service offering"` 28 usage interface{} `usage:"CF_NAME marketplace [-s SERVICE]"` 29 relatedCommands interface{} `related_commands:"create-service, services"` 30 31 UI command.UI 32 SharedActor command.SharedActor 33 Actor ServicesSummariesActor 34 Config command.Config 35 } 36 37 func (cmd *MarketplaceCommand) Setup(config command.Config, ui command.UI) error { 38 cmd.Config = config 39 cmd.UI = ui 40 cmd.SharedActor = sharedaction.NewActor(config) 41 42 ccClient, uaaClient, err := shared.NewClients(config, ui, true) 43 if err != nil { 44 return err 45 } 46 47 cmd.Actor = v2action.NewActor(ccClient, uaaClient, config) 48 49 return nil 50 } 51 52 func (cmd *MarketplaceCommand) Execute(args []string) error { 53 if len(args) > 0 { 54 return translatableerror.TooManyArgumentsError{ 55 ExtraArgument: args[0], 56 } 57 } 58 59 if !cmd.SharedActor.IsLoggedIn() { 60 return cmd.publicMarketplace() 61 } 62 63 return cmd.marketplace() 64 } 65 66 func (cmd *MarketplaceCommand) marketplace() error { 67 user, err := cmd.Config.CurrentUser() 68 if err != nil { 69 return err 70 } 71 72 if cmd.ServiceName == "" { 73 if !cmd.SharedActor.IsOrgTargeted() || !cmd.SharedActor.IsSpaceTargeted() { 74 return errors.New("Cannot list marketplace services without a targeted space") 75 } 76 77 cmd.UI.DisplayTextWithFlavor("Getting services from marketplace in org {{.OrgName}} / space {{.SpaceName}} as {{.Username}}...", map[string]interface{}{ 78 "OrgName": cmd.Config.TargetedOrganization().Name, 79 "SpaceName": cmd.Config.TargetedSpace().Name, 80 "Username": user.Name, 81 }) 82 serviceSummaries, warnings, err := cmd.Actor.GetServicesSummariesForSpace(cmd.Config.TargetedSpace().GUID) 83 cmd.UI.DisplayWarnings(warnings) 84 if err != nil { 85 return err 86 } 87 88 cmd.UI.DisplayOK() 89 cmd.displayServiceSummaries(serviceSummaries) 90 } else { 91 if !cmd.SharedActor.IsOrgTargeted() || !cmd.SharedActor.IsSpaceTargeted() { 92 return errors.New(fmt.Sprintf("Cannot list plan information for %s without a targeted space", cmd.ServiceName)) 93 } 94 95 cmd.UI.DisplayTextWithFlavor("Getting service plan information for service {{.ServiceName}} as {{.Username}}...", 96 map[string]interface{}{ 97 "ServiceName": cmd.ServiceName, 98 "Username": user.Name, 99 }) 100 101 serviceSummary, warnings, err := cmd.Actor.GetServiceSummaryForSpaceByName(cmd.Config.TargetedSpace().GUID, cmd.ServiceName) 102 cmd.UI.DisplayWarnings(warnings) 103 if err != nil { 104 return err 105 } 106 107 cmd.UI.DisplayOK() 108 cmd.displayServiceSummary(serviceSummary) 109 } 110 111 return nil 112 } 113 114 func (cmd *MarketplaceCommand) publicMarketplace() error { 115 if cmd.ServiceName == "" { 116 cmd.UI.DisplayText("Getting all services from marketplace...") 117 118 serviceSummaries, warnings, err := cmd.Actor.GetServicesSummaries() 119 cmd.UI.DisplayWarnings(warnings) 120 if err != nil { 121 return err 122 } 123 124 cmd.UI.DisplayOK() 125 cmd.displayServiceSummaries(serviceSummaries) 126 } else { 127 cmd.UI.DisplayTextWithFlavor("Getting service plan information for service {{.ServiceName}}...", 128 map[string]interface{}{ 129 "ServiceName": cmd.ServiceName, 130 }) 131 132 serviceSummary, warnings, err := cmd.Actor.GetServiceSummaryByName(cmd.ServiceName) 133 cmd.UI.DisplayWarnings(warnings) 134 if err != nil { 135 return err 136 } 137 138 cmd.UI.DisplayOK() 139 cmd.displayServiceSummary(serviceSummary) 140 } 141 142 return nil 143 } 144 145 func (cmd *MarketplaceCommand) displayServiceSummaries(serviceSummaries []v2action.ServiceSummary) { 146 if len(serviceSummaries) == 0 { 147 cmd.UI.DisplayText("No service offerings found") 148 } else { 149 tableHeaders := []string{"service", "plans", "description", "broker"} 150 table := [][]string{tableHeaders} 151 for _, serviceSummary := range serviceSummaries { 152 table = append(table, []string{ 153 serviceSummary.Label, 154 planNames(serviceSummary), 155 serviceSummary.Description, 156 serviceSummary.ServiceBrokerName, 157 }) 158 } 159 160 cmd.UI.DisplayTableWithHeader("", table, ui.DefaultTableSpacePadding) 161 cmd.UI.DisplayNewline() 162 cmd.UI.DisplayText("TIP: Use 'cf marketplace -s SERVICE' to view descriptions of individual plans of a given service.") 163 } 164 } 165 166 func (cmd *MarketplaceCommand) displayServiceSummary(serviceSummary v2action.ServiceSummary) { 167 tableHeaders := []string{"service plan", "description", "free or paid"} 168 table := [][]string{tableHeaders} 169 for _, plan := range serviceSummary.Plans { 170 table = append(table, []string{ 171 plan.Name, 172 plan.Description, 173 formatFreeOrPaid(plan.Free), 174 }) 175 } 176 cmd.UI.DisplayTableWithHeader("", table, ui.DefaultTableSpacePadding) 177 } 178 179 func planNames(serviceSummary v2action.ServiceSummary) string { 180 names := []string{} 181 for _, planSummary := range serviceSummary.Plans { 182 names = append(names, planSummary.Name) 183 } 184 return strings.Join(names, ", ") 185 } 186 187 func formatFreeOrPaid(free bool) string { 188 if free { 189 return "free" 190 } 191 return "paid" 192 }