github.com/loafoe/cli@v7.1.0+incompatible/command/v7/marketplace_command.go (about)

     1  package v7
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  
     7  	"code.cloudfoundry.org/cli/actor/v7action"
     8  	"code.cloudfoundry.org/cli/command/translatableerror"
     9  	"code.cloudfoundry.org/cli/resources"
    10  	"code.cloudfoundry.org/cli/util/ui"
    11  )
    12  
    13  type MarketplaceCommand struct {
    14  	BaseCommand
    15  
    16  	ServiceOfferingName string      `short:"e" description:"Show plan details for a particular service offering"`
    17  	ServiceBrokerName   string      `short:"b" description:"Only show details for a particular service broker"`
    18  	NoPlans             bool        `long:"no-plans" description:"Hide plan information for service offerings"`
    19  	usage               interface{} `usage:"CF_NAME marketplace [-e SERVICE_OFFERING] [-b SERVICE_BROKER] [--no-plans]"`
    20  	relatedCommands     interface{} `related_commands:"create-service, services"`
    21  }
    22  
    23  func (cmd MarketplaceCommand) Execute(args []string) error {
    24  	var username string
    25  
    26  	filter, err := cmd.processFlags()
    27  	if err != nil {
    28  		return err
    29  	}
    30  
    31  	if cmd.BaseCommand.SharedActor.IsLoggedIn() {
    32  		username, err = cmd.processLoginContext()
    33  		if err != nil {
    34  			return err
    35  		}
    36  
    37  		filter.SpaceGUID = cmd.Config.TargetedSpace().GUID
    38  	}
    39  
    40  	cmd.displayMessage(username)
    41  
    42  	offerings, warnings, err := cmd.BaseCommand.Actor.Marketplace(filter)
    43  	cmd.UI.DisplayWarnings(warnings)
    44  	if err != nil {
    45  		return err
    46  	}
    47  
    48  	if len(offerings) == 0 {
    49  		cmd.UI.DisplayNewline()
    50  		cmd.UI.DisplayText("No service offerings found.")
    51  		return nil
    52  	}
    53  
    54  	switch cmd.ServiceOfferingName {
    55  	case "":
    56  		return cmd.displayOfferingsTable(offerings)
    57  	default:
    58  		return cmd.displayPlansTable(offerings)
    59  	}
    60  }
    61  
    62  func (cmd MarketplaceCommand) processFlags() (v7action.MarketplaceFilter, error) {
    63  	if cmd.ServiceOfferingName != "" && cmd.NoPlans {
    64  		return v7action.MarketplaceFilter{}, translatableerror.ArgumentCombinationError{Args: []string{"--no-plans", "-e"}}
    65  	}
    66  
    67  	return v7action.MarketplaceFilter{
    68  		ServiceOfferingName: cmd.ServiceOfferingName,
    69  		ServiceBrokerName:   cmd.ServiceBrokerName,
    70  	}, nil
    71  }
    72  
    73  func (cmd MarketplaceCommand) processLoginContext() (string, error) {
    74  	if err := cmd.SharedActor.CheckTarget(true, true); err != nil {
    75  		return "", err
    76  	}
    77  
    78  	user, err := cmd.Config.CurrentUser()
    79  	if err != nil {
    80  		return "", err
    81  	}
    82  	return user.Name, nil
    83  }
    84  
    85  func (cmd MarketplaceCommand) displayMessage(username string) {
    86  	var template string
    87  
    88  	switch cmd.ServiceOfferingName {
    89  	case "":
    90  		template = "Getting all service offerings from marketplace"
    91  	default:
    92  		template = "Getting service plan information for service offering {{.ServiceOfferingName}}"
    93  	}
    94  
    95  	if cmd.ServiceBrokerName != "" {
    96  		switch cmd.ServiceOfferingName {
    97  		case "":
    98  			template += " for "
    99  		default:
   100  			template += " from "
   101  		}
   102  		template += "service broker {{.ServiceBrokerName}}"
   103  	}
   104  
   105  	if username != "" {
   106  		template += " in org {{.OrgName}} / space {{.SpaceName}} as {{.Username}}"
   107  	}
   108  
   109  	cmd.UI.DisplayTextWithFlavor(template+"...", map[string]interface{}{
   110  		"ServiceOfferingName": cmd.ServiceOfferingName,
   111  		"ServiceBrokerName":   cmd.ServiceBrokerName,
   112  		"OrgName":             cmd.Config.TargetedOrganization().Name,
   113  		"SpaceName":           cmd.Config.TargetedSpace().Name,
   114  		"Username":            username,
   115  	})
   116  }
   117  
   118  func (cmd MarketplaceCommand) displayPlansTable(offerings []v7action.ServiceOfferingWithPlans) error {
   119  	for _, o := range offerings {
   120  		data := [][]string{{"plan", "description", "free or paid", "costs", "available"}}
   121  		for _, p := range o.Plans {
   122  			data = append(data, []string{p.Name, p.Description, freeOrPaid(p.Free), costsList(p.Costs), available(p.Available)})
   123  		}
   124  
   125  		cmd.UI.DisplayNewline()
   126  		cmd.UI.DisplayTextWithFlavor("broker: {{.ServiceBrokerName}}", map[string]interface{}{
   127  			"ServiceBrokerName": o.ServiceBrokerName,
   128  		})
   129  		cmd.UI.DisplayTableWithHeader("   ", data, ui.DefaultTableSpacePadding)
   130  	}
   131  
   132  	return nil
   133  }
   134  
   135  func (cmd MarketplaceCommand) displayOfferingsTable(offerings []v7action.ServiceOfferingWithPlans) error {
   136  	var data [][]string
   137  	if cmd.NoPlans {
   138  		data = computeOfferingsTableWithPlanNames(offerings)
   139  	} else {
   140  		data = computeOfferingsTableWithoutPlanNames(offerings)
   141  	}
   142  
   143  	cmd.UI.DisplayNewline()
   144  	cmd.UI.DisplayTableWithHeader("", data, ui.DefaultTableSpacePadding)
   145  	cmd.UI.DisplayNewline()
   146  	cmd.UI.DisplayText("TIP: Use 'cf marketplace -e SERVICE_OFFERING' to view descriptions of individual plans of a given service offering.")
   147  
   148  	return nil
   149  }
   150  
   151  func computeOfferingsTableWithPlanNames(offerings []v7action.ServiceOfferingWithPlans) [][]string {
   152  	data := [][]string{{"offering", "description", "broker"}}
   153  	for _, o := range offerings {
   154  		data = append(data, []string{o.Name, o.Description, o.ServiceBrokerName})
   155  	}
   156  	return data
   157  }
   158  
   159  func computeOfferingsTableWithoutPlanNames(offerings []v7action.ServiceOfferingWithPlans) [][]string {
   160  	data := [][]string{{"offering", "plans", "description", "broker"}}
   161  	for _, o := range offerings {
   162  		data = append(data, []string{o.Name, planNames(o.Plans), o.Description, o.ServiceBrokerName})
   163  	}
   164  	return data
   165  }
   166  
   167  func planNames(plans []resources.ServicePlan) string {
   168  	var names []string
   169  	for _, p := range plans {
   170  		names = append(names, p.Name)
   171  	}
   172  	return strings.Join(names, ", ")
   173  }
   174  
   175  func freeOrPaid(free bool) string {
   176  	if free {
   177  		return "free"
   178  	}
   179  	return "paid"
   180  }
   181  
   182  func available(available bool) string {
   183  	if available {
   184  		return "yes"
   185  	}
   186  	return "no"
   187  }
   188  
   189  func costsList(costs []resources.ServicePlanCost) string {
   190  	var costsOutput []string
   191  	for _, cost := range costs {
   192  		costsOutput = append(costsOutput, fmt.Sprintf("%s %.2f/%s", cost.Currency, cost.Amount, cost.Unit))
   193  	}
   194  	return strings.Join(costsOutput, ", ")
   195  }