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  }