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  }