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  }