github.com/swisscom/cloudfoundry-cli@v7.1.0+incompatible/cf/actors/servicebuilder/service_builder.go (about)

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