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  }