github.com/cloudfoundry-attic/cli-with-i18n@v6.32.1-0.20171002233121-7401370d3b85+incompatible/cf/actors/brokerbuilder/broker_builder.go (about) 1 package brokerbuilder 2 3 import ( 4 "code.cloudfoundry.org/cli/cf/actors/servicebuilder" 5 "code.cloudfoundry.org/cli/cf/api" 6 "code.cloudfoundry.org/cli/cf/models" 7 ) 8 9 //go:generate counterfeiter . BrokerBuilder 10 11 type BrokerBuilder interface { 12 AttachBrokersToServices([]models.ServiceOffering) ([]models.ServiceBroker, error) 13 AttachSpecificBrokerToServices(string, []models.ServiceOffering) (models.ServiceBroker, error) 14 GetAllServiceBrokers() ([]models.ServiceBroker, error) 15 GetBrokerWithAllServices(brokerName string) (models.ServiceBroker, error) 16 GetBrokerWithSpecifiedService(serviceName string) (models.ServiceBroker, error) 17 } 18 19 type Builder struct { 20 brokerRepo api.ServiceBrokerRepository 21 serviceBuilder servicebuilder.ServiceBuilder 22 } 23 24 func NewBuilder(broker api.ServiceBrokerRepository, serviceBuilder servicebuilder.ServiceBuilder) Builder { 25 return Builder{ 26 brokerRepo: broker, 27 serviceBuilder: serviceBuilder, 28 } 29 } 30 31 func (builder Builder) AttachBrokersToServices(services []models.ServiceOffering) ([]models.ServiceBroker, error) { 32 var brokers []models.ServiceBroker 33 brokersMap := make(map[string]models.ServiceBroker) 34 35 for _, service := range services { 36 if service.BrokerGUID == "" { 37 continue 38 } 39 40 if broker, ok := brokersMap[service.BrokerGUID]; ok { 41 broker.Services = append(broker.Services, service) 42 brokersMap[broker.GUID] = broker 43 } else { 44 broker, err := builder.brokerRepo.FindByGUID(service.BrokerGUID) 45 if err != nil { 46 return nil, err 47 } 48 broker.Services = append(broker.Services, service) 49 brokersMap[service.BrokerGUID] = broker 50 } 51 } 52 53 for _, broker := range brokersMap { 54 brokers = append(brokers, broker) 55 } 56 57 return brokers, nil 58 } 59 60 func (builder Builder) AttachSpecificBrokerToServices(brokerName string, services []models.ServiceOffering) (models.ServiceBroker, error) { 61 broker, err := builder.brokerRepo.FindByName(brokerName) 62 if err != nil { 63 return models.ServiceBroker{}, err 64 } 65 66 for _, service := range services { 67 if service.BrokerGUID == broker.GUID { 68 broker.Services = append(broker.Services, service) 69 } 70 } 71 72 return broker, nil 73 } 74 75 func (builder Builder) GetAllServiceBrokers() ([]models.ServiceBroker, error) { 76 brokers := []models.ServiceBroker{} 77 brokerGUIDs := []string{} 78 var err error 79 var services models.ServiceOfferings 80 81 err = builder.brokerRepo.ListServiceBrokers(func(broker models.ServiceBroker) bool { 82 brokers = append(brokers, broker) 83 brokerGUIDs = append(brokerGUIDs, broker.GUID) 84 return true 85 }) 86 if err != nil { 87 return nil, err 88 } 89 90 services, err = builder.serviceBuilder.GetServicesForManyBrokers(brokerGUIDs) 91 if err != nil { 92 return nil, err 93 } 94 95 brokers, err = builder.attachServiceOfferingsToBrokers(services, brokers) 96 if err != nil { 97 return nil, err 98 } 99 100 return brokers, err 101 } 102 103 func (builder Builder) attachServiceOfferingsToBrokers(services models.ServiceOfferings, brokers []models.ServiceBroker) ([]models.ServiceBroker, error) { 104 for _, service := range services { 105 for index, broker := range brokers { 106 if broker.GUID == service.BrokerGUID { 107 brokers[index].Services = append(brokers[index].Services, service) 108 break 109 } 110 } 111 } 112 return brokers, nil 113 } 114 115 func (builder Builder) GetBrokerWithAllServices(brokerName string) (models.ServiceBroker, error) { 116 broker, err := builder.brokerRepo.FindByName(brokerName) 117 if err != nil { 118 return models.ServiceBroker{}, err 119 } 120 services, err := builder.serviceBuilder.GetServicesForBroker(broker.GUID) 121 if err != nil { 122 return models.ServiceBroker{}, err 123 } 124 broker.Services = services 125 126 return broker, nil 127 } 128 129 func (builder Builder) GetBrokerWithSpecifiedService(serviceName string) (models.ServiceBroker, error) { 130 service, err := builder.serviceBuilder.GetServiceByNameWithPlansWithOrgNames(serviceName) 131 if err != nil { 132 return models.ServiceBroker{}, err 133 } 134 brokers, err := builder.AttachBrokersToServices([]models.ServiceOffering{service}) 135 if err != nil || len(brokers) == 0 { 136 return models.ServiceBroker{}, err 137 } 138 return brokers[0], err 139 }