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  }