github.com/randomtask1155/cli@v6.41.1-0.20181227003417-a98eed78cbde+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.UI.DisplayNewline() 90 cmd.displayServiceSummaries(serviceSummaries) 91 } else { 92 if !cmd.SharedActor.IsOrgTargeted() || !cmd.SharedActor.IsSpaceTargeted() { 93 return errors.New(fmt.Sprintf("Cannot list plan information for %s without a targeted space", cmd.ServiceName)) 94 } 95 96 cmd.UI.DisplayTextWithFlavor("Getting service plan information for service {{.ServiceName}} as {{.Username}}...", 97 map[string]interface{}{ 98 "ServiceName": cmd.ServiceName, 99 "Username": user.Name, 100 }) 101 102 serviceSummary, warnings, err := cmd.Actor.GetServiceSummaryForSpaceByName(cmd.Config.TargetedSpace().GUID, cmd.ServiceName) 103 cmd.UI.DisplayWarnings(warnings) 104 if err != nil { 105 return err 106 } 107 108 cmd.UI.DisplayOK() 109 cmd.UI.DisplayNewline() 110 cmd.displayServiceSummary(serviceSummary) 111 } 112 113 return nil 114 } 115 116 func (cmd *MarketplaceCommand) publicMarketplace() error { 117 if cmd.ServiceName == "" { 118 cmd.UI.DisplayText("Getting all services from marketplace...") 119 120 serviceSummaries, warnings, err := cmd.Actor.GetServicesSummaries() 121 cmd.UI.DisplayWarnings(warnings) 122 if err != nil { 123 return err 124 } 125 126 cmd.UI.DisplayOK() 127 cmd.UI.DisplayNewline() 128 cmd.displayServiceSummaries(serviceSummaries) 129 } else { 130 cmd.UI.DisplayTextWithFlavor("Getting service plan information for service {{.ServiceName}}...", 131 map[string]interface{}{ 132 "ServiceName": cmd.ServiceName, 133 }) 134 135 serviceSummary, warnings, err := cmd.Actor.GetServiceSummaryByName(cmd.ServiceName) 136 cmd.UI.DisplayWarnings(warnings) 137 if err != nil { 138 return err 139 } 140 141 cmd.UI.DisplayOK() 142 cmd.UI.DisplayNewline() 143 cmd.displayServiceSummary(serviceSummary) 144 } 145 146 return nil 147 } 148 149 func (cmd *MarketplaceCommand) displayServiceSummaries(serviceSummaries []v2action.ServiceSummary) { 150 if len(serviceSummaries) == 0 { 151 cmd.UI.DisplayText("No service offerings found") 152 } else { 153 tableHeaders := []string{"service", "plans", "description"} 154 table := [][]string{tableHeaders} 155 for _, serviceSummary := range serviceSummaries { 156 table = append(table, []string{ 157 serviceSummary.Label, 158 planNames(serviceSummary), 159 serviceSummary.Description, 160 }) 161 } 162 163 cmd.UI.DisplayTableWithHeader("", table, ui.DefaultTableSpacePadding) 164 cmd.UI.DisplayNewline() 165 cmd.UI.DisplayText("TIP: Use 'cf marketplace -s SERVICE' to view descriptions of individual plans of a given service.") 166 } 167 } 168 169 func (cmd *MarketplaceCommand) displayServiceSummary(serviceSummary v2action.ServiceSummary) { 170 tableHeaders := []string{"service plan", "description", "free or paid"} 171 table := [][]string{tableHeaders} 172 for _, plan := range serviceSummary.Plans { 173 table = append(table, []string{ 174 plan.Name, 175 plan.Description, 176 formatFreeOrPaid(plan.Free), 177 }) 178 } 179 cmd.UI.DisplayTableWithHeader("", table, ui.DefaultTableSpacePadding) 180 } 181 182 func planNames(serviceSummary v2action.ServiceSummary) string { 183 names := []string{} 184 for _, planSummary := range serviceSummary.Plans { 185 names = append(names, planSummary.Name) 186 } 187 return strings.Join(names, ", ") 188 } 189 190 func formatFreeOrPaid(free bool) string { 191 if free { 192 return "free" 193 } 194 return "paid" 195 }