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 }