github.com/rakutentech/cli@v6.12.5-0.20151006231303-24468b65536e+incompatible/cf/commands/service/marketplace.go (about) 1 package service 2 3 import ( 4 "sort" 5 "strings" 6 7 . "github.com/cloudfoundry/cli/cf/i18n" 8 "github.com/cloudfoundry/cli/flags" 9 "github.com/cloudfoundry/cli/flags/flag" 10 11 "github.com/cloudfoundry/cli/cf/actors/service_builder" 12 "github.com/cloudfoundry/cli/cf/command_registry" 13 "github.com/cloudfoundry/cli/cf/configuration/core_config" 14 "github.com/cloudfoundry/cli/cf/models" 15 "github.com/cloudfoundry/cli/cf/requirements" 16 "github.com/cloudfoundry/cli/cf/terminal" 17 ) 18 19 type MarketplaceServices struct { 20 ui terminal.UI 21 config core_config.Reader 22 serviceBuilder service_builder.ServiceBuilder 23 } 24 25 func init() { 26 command_registry.Register(&MarketplaceServices{}) 27 } 28 29 func (cmd *MarketplaceServices) MetaData() command_registry.CommandMetadata { 30 fs := make(map[string]flags.FlagSet) 31 fs["s"] = &cliFlags.StringFlag{Name: "s", Usage: T("Show plan details for a particular service offering")} 32 33 return command_registry.CommandMetadata{ 34 Name: "marketplace", 35 ShortName: "m", 36 Description: T("List available offerings in the marketplace"), 37 Usage: "CF_NAME marketplace", 38 Flags: fs, 39 } 40 } 41 42 func (cmd *MarketplaceServices) Requirements(requirementsFactory requirements.Factory, fc flags.FlagContext) (reqs []requirements.Requirement, err error) { 43 if len(fc.Args()) != 0 { 44 cmd.ui.Failed(T("Incorrect Usage. No argument required\n\n") + command_registry.Commands.CommandUsage("marketplace")) 45 } 46 47 reqs = append(reqs, requirementsFactory.NewApiEndpointRequirement()) 48 49 return 50 } 51 52 func (cmd *MarketplaceServices) SetDependency(deps command_registry.Dependency, pluginCall bool) command_registry.Command { 53 cmd.ui = deps.Ui 54 cmd.config = deps.Config 55 cmd.serviceBuilder = deps.ServiceBuilder 56 return cmd 57 } 58 59 func (cmd *MarketplaceServices) Execute(c flags.FlagContext) { 60 serviceName := c.String("s") 61 62 if serviceName != "" { 63 cmd.marketplaceByService(serviceName) 64 } else { 65 cmd.marketplace() 66 } 67 } 68 69 func (cmd MarketplaceServices) marketplaceByService(serviceName string) { 70 var ( 71 serviceOffering models.ServiceOffering 72 apiErr error 73 ) 74 75 if cmd.config.HasSpace() { 76 cmd.ui.Say(T("Getting service plan information for service {{.ServiceName}} as {{.CurrentUser}}...", 77 map[string]interface{}{ 78 "ServiceName": terminal.EntityNameColor(serviceName), 79 "CurrentUser": terminal.EntityNameColor(cmd.config.Username()), 80 })) 81 serviceOffering, apiErr = cmd.serviceBuilder.GetServiceByNameForSpaceWithPlans(serviceName, cmd.config.SpaceFields().Guid) 82 } else if !cmd.config.IsLoggedIn() { 83 cmd.ui.Say(T("Getting service plan information for service {{.ServiceName}}...", map[string]interface{}{"ServiceName": terminal.EntityNameColor(serviceName)})) 84 serviceOffering, apiErr = cmd.serviceBuilder.GetServiceByNameWithPlans(serviceName) 85 } else { 86 cmd.ui.Failed(T("Cannot list plan information for {{.ServiceName}} without a targeted space", 87 map[string]interface{}{"ServiceName": terminal.EntityNameColor(serviceName)})) 88 } 89 90 if apiErr != nil { 91 cmd.ui.Failed(apiErr.Error()) 92 return 93 } 94 95 cmd.ui.Ok() 96 cmd.ui.Say("") 97 98 if serviceOffering.Guid == "" { 99 cmd.ui.Say(T("Service offering not found")) 100 return 101 } 102 103 table := terminal.NewTable(cmd.ui, []string{T("service plan"), T("description"), T("free or paid")}) 104 for _, plan := range serviceOffering.Plans { 105 var freeOrPaid string 106 if plan.Free { 107 freeOrPaid = "free" 108 } else { 109 freeOrPaid = "paid" 110 } 111 table.Add(plan.Name, plan.Description, freeOrPaid) 112 } 113 114 table.Print() 115 } 116 117 func (cmd MarketplaceServices) marketplace() { 118 var ( 119 serviceOfferings models.ServiceOfferings 120 apiErr error 121 ) 122 123 if cmd.config.HasSpace() { 124 cmd.ui.Say(T("Getting services from marketplace in org {{.OrgName}} / space {{.SpaceName}} as {{.CurrentUser}}...", 125 map[string]interface{}{ 126 "OrgName": terminal.EntityNameColor(cmd.config.OrganizationFields().Name), 127 "SpaceName": terminal.EntityNameColor(cmd.config.SpaceFields().Name), 128 "CurrentUser": terminal.EntityNameColor(cmd.config.Username()), 129 })) 130 serviceOfferings, apiErr = cmd.serviceBuilder.GetServicesForSpaceWithPlans(cmd.config.SpaceFields().Guid) 131 } else if !cmd.config.IsLoggedIn() { 132 cmd.ui.Say(T("Getting all services from marketplace...")) 133 serviceOfferings, apiErr = cmd.serviceBuilder.GetAllServicesWithPlans() 134 } else { 135 cmd.ui.Failed(T("Cannot list marketplace services without a targeted space")) 136 } 137 138 if apiErr != nil { 139 cmd.ui.Failed(apiErr.Error()) 140 return 141 } 142 143 cmd.ui.Ok() 144 cmd.ui.Say("") 145 146 if len(serviceOfferings) == 0 { 147 cmd.ui.Say(T("No service offerings found")) 148 return 149 } 150 151 table := terminal.NewTable(cmd.ui, []string{T("service"), T("plans"), T("description")}) 152 153 sort.Sort(serviceOfferings) 154 var paidPlanExists bool 155 for _, offering := range serviceOfferings { 156 planNames := "" 157 158 for _, plan := range offering.Plans { 159 if plan.Name == "" { 160 continue 161 } 162 if plan.Free { 163 planNames += ", " + plan.Name 164 } else { 165 paidPlanExists = true 166 planNames += ", " + plan.Name + "*" 167 } 168 } 169 170 planNames = strings.TrimPrefix(planNames, ", ") 171 172 table.Add(offering.Label, planNames, offering.Description) 173 } 174 175 table.Print() 176 if paidPlanExists { 177 cmd.ui.Say(T("\n* These service plans have an associated cost. Creating a service instance will incur this cost.")) 178 } 179 cmd.ui.Say(T("\nTIP: Use 'cf marketplace -s SERVICE' to view descriptions of individual plans of a given service.")) 180 }