github.com/rakutentech/cli@v6.12.5-0.20151006231303-24468b65536e+incompatible/cf/actors/service_builder/service_builder.go (about) 1 package service_builder 2 3 import ( 4 "errors" 5 6 "github.com/cloudfoundry/cli/cf/actors/plan_builder" 7 "github.com/cloudfoundry/cli/cf/api" 8 "github.com/cloudfoundry/cli/cf/models" 9 ) 10 11 type ServiceBuilder interface { 12 GetAllServices() ([]models.ServiceOffering, error) 13 GetAllServicesWithPlans() ([]models.ServiceOffering, error) 14 15 GetServiceByNameWithPlans(string) (models.ServiceOffering, error) 16 GetServiceByNameWithPlansWithOrgNames(string) (models.ServiceOffering, error) 17 GetServiceByNameForSpace(string, string) (models.ServiceOffering, error) 18 GetServiceByNameForSpaceWithPlans(string, string) (models.ServiceOffering, error) 19 GetServicesByNameForSpaceWithPlans(string, string) (models.ServiceOfferings, error) 20 GetServiceByNameForOrg(string, string) (models.ServiceOffering, error) 21 22 GetServicesForManyBrokers([]string) ([]models.ServiceOffering, error) 23 GetServicesForBroker(string) ([]models.ServiceOffering, error) 24 25 GetServicesForSpace(string) ([]models.ServiceOffering, error) 26 GetServicesForSpaceWithPlans(string) ([]models.ServiceOffering, error) 27 28 GetServiceVisibleToOrg(string, string) (models.ServiceOffering, error) 29 GetServicesVisibleToOrg(string) ([]models.ServiceOffering, error) 30 } 31 32 type Builder struct { 33 serviceRepo api.ServiceRepository 34 planBuilder plan_builder.PlanBuilder 35 } 36 37 func NewBuilder(service api.ServiceRepository, planBuilder plan_builder.PlanBuilder) Builder { 38 return Builder{ 39 serviceRepo: service, 40 planBuilder: planBuilder, 41 } 42 } 43 44 func (builder Builder) GetAllServices() ([]models.ServiceOffering, error) { 45 return builder.serviceRepo.GetAllServiceOfferings() 46 } 47 48 func (builder Builder) GetAllServicesWithPlans() ([]models.ServiceOffering, error) { 49 services, err := builder.GetAllServices() 50 if err != nil { 51 return []models.ServiceOffering{}, err 52 } 53 54 var plans []models.ServicePlanFields 55 for index, service := range services { 56 plans, err = builder.planBuilder.GetPlansForService(service.Guid) 57 if err != nil { 58 return []models.ServiceOffering{}, err 59 } 60 services[index].Plans = plans 61 } 62 63 return services, err 64 } 65 66 func (builder Builder) GetServicesForSpace(spaceGuid string) ([]models.ServiceOffering, error) { 67 return builder.serviceRepo.GetServiceOfferingsForSpace(spaceGuid) 68 } 69 70 func (builder Builder) GetServicesForSpaceWithPlans(spaceGuid string) ([]models.ServiceOffering, error) { 71 services, err := builder.GetServicesForSpace(spaceGuid) 72 if err != nil { 73 return []models.ServiceOffering{}, err 74 } 75 76 for index, service := range services { 77 services[index].Plans, err = builder.planBuilder.GetPlansForService(service.Guid) 78 if err != nil { 79 return []models.ServiceOffering{}, err 80 } 81 } 82 83 return services, nil 84 } 85 86 func (builder Builder) GetServiceByNameWithPlans(serviceLabel string) (models.ServiceOffering, error) { 87 services, err := builder.serviceRepo.FindServiceOfferingsByLabel(serviceLabel) 88 if err != nil { 89 return models.ServiceOffering{}, err 90 } 91 service := returnV2Service(services) 92 93 service.Plans, err = builder.planBuilder.GetPlansForService(service.Guid) 94 if err != nil { 95 return models.ServiceOffering{}, err 96 } 97 98 return service, nil 99 } 100 101 func (builder Builder) GetServiceByNameForOrg(serviceLabel, orgName string) (models.ServiceOffering, error) { 102 services, err := builder.serviceRepo.FindServiceOfferingsByLabel(serviceLabel) 103 if err != nil { 104 return models.ServiceOffering{}, err 105 } 106 107 service, err := builder.attachPlansToServiceForOrg(services[0], orgName) 108 if err != nil { 109 return models.ServiceOffering{}, err 110 } 111 return service, nil 112 } 113 114 func (builder Builder) GetServiceByNameForSpace(serviceLabel, spaceGuid string) (models.ServiceOffering, error) { 115 offerings, err := builder.serviceRepo.FindServiceOfferingsForSpaceByLabel(spaceGuid, serviceLabel) 116 if err != nil { 117 return models.ServiceOffering{}, err 118 } 119 120 for _, offering := range offerings { 121 if offering.Provider == "" { 122 return offering, nil 123 } 124 } 125 126 return models.ServiceOffering{}, errors.New("Could not find service") 127 } 128 129 func (builder Builder) GetServiceByNameForSpaceWithPlans(serviceLabel, spaceGuid string) (models.ServiceOffering, error) { 130 offering, err := builder.GetServiceByNameForSpace(serviceLabel, spaceGuid) 131 if err != nil { 132 return models.ServiceOffering{}, err 133 } 134 135 offering.Plans, err = builder.planBuilder.GetPlansForService(offering.Guid) 136 if err != nil { 137 return models.ServiceOffering{}, err 138 } 139 140 return offering, nil 141 } 142 143 func (builder Builder) GetServicesByNameForSpaceWithPlans(serviceLabel, spaceGuid string) (models.ServiceOfferings, error) { 144 offerings, err := builder.serviceRepo.FindServiceOfferingsForSpaceByLabel(serviceLabel, spaceGuid) 145 if err != nil { 146 return models.ServiceOfferings{}, err 147 } 148 149 for index, offering := range offerings { 150 offerings[index].Plans, err = builder.planBuilder.GetPlansForService(offering.Guid) 151 if err != nil { 152 return models.ServiceOfferings{}, err 153 } 154 } 155 156 return offerings, nil 157 } 158 159 func (builder Builder) GetServiceByNameWithPlansWithOrgNames(serviceLabel string) (models.ServiceOffering, error) { 160 services, err := builder.serviceRepo.FindServiceOfferingsByLabel(serviceLabel) 161 if err != nil { 162 return models.ServiceOffering{}, err 163 } 164 165 service, err := builder.attachPlansToService(services[0]) 166 if err != nil { 167 return models.ServiceOffering{}, err 168 } 169 return service, nil 170 } 171 172 func (builder Builder) GetServicesForManyBrokers(brokerGuids []string) ([]models.ServiceOffering, error) { 173 services, err := builder.serviceRepo.ListServicesFromManyBrokers(brokerGuids) 174 if err != nil { 175 return nil, err 176 } 177 return builder.populateServicesWithPlansAndOrgs(services) 178 } 179 180 func (builder Builder) GetServicesForBroker(brokerGuid string) ([]models.ServiceOffering, error) { 181 services, err := builder.serviceRepo.ListServicesFromBroker(brokerGuid) 182 if err != nil { 183 return nil, err 184 } 185 return builder.populateServicesWithPlansAndOrgs(services) 186 } 187 188 func (builder Builder) populateServicesWithPlansAndOrgs(services []models.ServiceOffering) ([]models.ServiceOffering, error) { 189 serviceGuids := []string{} 190 for _, service := range services { 191 serviceGuids = append(serviceGuids, service.Guid) 192 } 193 194 plans, err := builder.planBuilder.GetPlansForManyServicesWithOrgs(serviceGuids) 195 if err != nil { 196 return nil, err 197 } 198 return builder.attachPlansToManyServices(services, plans) 199 } 200 201 func (builder Builder) GetServiceVisibleToOrg(serviceName string, orgName string) (models.ServiceOffering, error) { 202 visiblePlans, err := builder.planBuilder.GetPlansVisibleToOrg(orgName) 203 if err != nil { 204 return models.ServiceOffering{}, err 205 } 206 207 if len(visiblePlans) == 0 { 208 return models.ServiceOffering{}, nil 209 } 210 211 return builder.attachSpecificServiceToPlans(serviceName, visiblePlans) 212 } 213 214 func (builder Builder) GetServicesVisibleToOrg(orgName string) ([]models.ServiceOffering, error) { 215 visiblePlans, err := builder.planBuilder.GetPlansVisibleToOrg(orgName) 216 if err != nil { 217 return nil, err 218 } 219 220 if len(visiblePlans) == 0 { 221 return nil, nil 222 } 223 224 return builder.attachServicesToPlans(visiblePlans) 225 } 226 227 func (builder Builder) attachPlansToServiceForOrg(service models.ServiceOffering, orgName string) (models.ServiceOffering, error) { 228 plans, err := builder.planBuilder.GetPlansForServiceForOrg(service.Guid, orgName) 229 if err != nil { 230 return models.ServiceOffering{}, err 231 } 232 233 service.Plans = plans 234 return service, nil 235 } 236 237 func (builder Builder) attachPlansToManyServices(services []models.ServiceOffering, plans []models.ServicePlanFields) ([]models.ServiceOffering, error) { 238 for _, plan := range plans { 239 for index, service := range services { 240 if service.Guid == plan.ServiceOfferingGuid { 241 services[index].Plans = append(service.Plans, plan) 242 break 243 } 244 } 245 } 246 return services, nil 247 } 248 249 func (builder Builder) attachPlansToService(service models.ServiceOffering) (models.ServiceOffering, error) { 250 plans, err := builder.planBuilder.GetPlansForServiceWithOrgs(service.Guid) 251 if err != nil { 252 return models.ServiceOffering{}, err 253 } 254 255 service.Plans = plans 256 return service, nil 257 } 258 259 func (builder Builder) attachServicesToPlans(plans []models.ServicePlanFields) ([]models.ServiceOffering, error) { 260 var services []models.ServiceOffering 261 servicesMap := make(map[string]models.ServiceOffering) 262 263 for _, plan := range plans { 264 if plan.ServiceOfferingGuid == "" { 265 continue 266 } 267 268 if service, ok := servicesMap[plan.ServiceOfferingGuid]; ok { 269 service.Plans = append(service.Plans, plan) 270 servicesMap[service.Guid] = service 271 } else { 272 service, err := builder.serviceRepo.GetServiceOfferingByGuid(plan.ServiceOfferingGuid) 273 if err != nil { 274 return nil, err 275 } 276 service.Plans = append(service.Plans, plan) 277 servicesMap[service.Guid] = service 278 } 279 } 280 281 for _, service := range servicesMap { 282 services = append(services, service) 283 } 284 285 return services, nil 286 } 287 288 func (builder Builder) attachSpecificServiceToPlans(serviceName string, plans []models.ServicePlanFields) (models.ServiceOffering, error) { 289 services, err := builder.serviceRepo.FindServiceOfferingsByLabel(serviceName) 290 if err != nil { 291 return models.ServiceOffering{}, err 292 } 293 294 service := services[0] 295 for _, plan := range plans { 296 if plan.ServiceOfferingGuid == service.Guid { 297 service.Plans = append(service.Plans, plan) 298 } 299 } 300 301 return service, nil 302 } 303 304 func returnV2Service(services models.ServiceOfferings) models.ServiceOffering { 305 for _, service := range services { 306 if service.Provider == "" { 307 return service 308 } 309 } 310 311 return models.ServiceOffering{} 312 }