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