github.com/rakutentech/cli@v6.12.5-0.20151006231303-24468b65536e+incompatible/cf/actors/broker_builder/broker_builder.go (about)

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