github.com/IBM-Cloud/bluemix-go@v0.0.0-20240423071914-9e96525baef4/api/resource/resourcev1/controller/resource_service_instance.go (about)

     1  package controller
     2  
     3  import (
     4  	"fmt"
     5  	"net/http"
     6  	"net/url"
     7  
     8  	"github.com/IBM-Cloud/bluemix-go/bmxerror"
     9  	"github.com/IBM-Cloud/bluemix-go/client"
    10  	"github.com/IBM-Cloud/bluemix-go/helpers"
    11  	"github.com/IBM-Cloud/bluemix-go/models"
    12  	"github.com/IBM-Cloud/bluemix-go/rest"
    13  )
    14  
    15  type CreateServiceInstanceRequest struct {
    16  	Name            string                 `json:"name"`
    17  	ServicePlanID   string                 `json:"resource_plan_id"`
    18  	ResourceGroupID string                 `json:"resource_group_id"`
    19  	Crn             string                 `json:"crn,omitempty"`
    20  	Tags            []string               `json:"tags,omitempty"`
    21  	Parameters      map[string]interface{} `json:"parameters,omitempty"`
    22  	TargetCrn       string                 `json:"target_crn"`
    23  }
    24  
    25  type UpdateServiceInstanceRequest struct {
    26  	Name          string                 `json:"name,omitempty"`
    27  	ServicePlanID string                 `json:"resource_plan_id,omitempty"`
    28  	Tags          []string               `json:"tags,omitempty"`
    29  	Parameters    map[string]interface{} `json:"parameters,omitempty"`
    30  	UpdateTime    int64                  `json:"update_time,omitempty"`
    31  }
    32  
    33  type ServiceInstanceQuery struct {
    34  	ResourceGroupID string
    35  	ServiceID       string
    36  	ServicePlanID   string
    37  	Name            string
    38  }
    39  
    40  //ErrCodeResourceServiceInstanceDoesnotExist ...
    41  const ErrCodeResourceServiceInstanceDoesnotExist = "ResourceServiceInstanceDoesnotExist"
    42  
    43  //ResourceServiceInstanceQuery ...
    44  type ResourceServiceInstanceRepository interface {
    45  	ListInstances(query ServiceInstanceQuery) ([]models.ServiceInstance, error)
    46  	GetInstance(serviceInstanceID string) (models.ServiceInstance, error)
    47  	CreateInstance(serviceInstanceRequest CreateServiceInstanceRequest) (models.ServiceInstance, error)
    48  	UpdateInstance(serviceInstanceID string, updateInstanceRequest UpdateServiceInstanceRequest) (models.ServiceInstance, error)
    49  	DeleteInstance(serviceInstanceID string, recursive bool) error
    50  	//GetBindings(serviceInstanceID string) ([]ServiceBinding, error)
    51  }
    52  
    53  type resourceServiceInstance struct {
    54  	client *client.Client
    55  }
    56  
    57  func newResourceServiceInstanceAPI(c *client.Client) ResourceServiceInstanceRepository {
    58  	return &resourceServiceInstance{
    59  		client: c,
    60  	}
    61  }
    62  
    63  func (r *resourceServiceInstance) ListInstances(query ServiceInstanceQuery) ([]models.ServiceInstance, error) {
    64  	listRequest := rest.GetRequest("/v1/resource_instances").
    65  		Query("resource_group_id", query.ResourceGroupID).
    66  		Query("resource_id", query.ServiceID).
    67  		Query("resource_plan_id", query.ServicePlanID)
    68  
    69  	req, err := listRequest.Build()
    70  	if err != nil {
    71  		return nil, err
    72  	}
    73  
    74  	var instances []models.ServiceInstance
    75  	_, err = r.client.GetPaginated(
    76  		req.URL.String(),
    77  		NewRCPaginatedResources(models.ServiceInstance{}),
    78  		func(resource interface{}) bool {
    79  			if instance, ok := resource.(models.ServiceInstance); ok {
    80  				instances = append(instances, instance)
    81  				return true
    82  			}
    83  			return false
    84  		},
    85  	)
    86  	if err != nil {
    87  		return []models.ServiceInstance{}, err
    88  	}
    89  
    90  	if query.Name != "" {
    91  		instances = filterInstancesByName(instances, query.Name)
    92  	}
    93  	return instances, nil
    94  }
    95  
    96  func (r *resourceServiceInstance) CreateInstance(serviceInstanceRequest CreateServiceInstanceRequest) (models.ServiceInstance, error) {
    97  	resp := models.ServiceInstance{}
    98  	request := rest.PostRequest(helpers.GetFullURL(*r.client.Config.Endpoint, "/v1/resource_instances"))
    99  	_, err := r.client.SendRequest(request.Body(serviceInstanceRequest), &resp)
   100  	if err != nil {
   101  		return resp, err
   102  	}
   103  	return resp, nil
   104  }
   105  func (r *resourceServiceInstance) UpdateInstance(serviceInstanceID string, updateInstanceRequest UpdateServiceInstanceRequest) (models.ServiceInstance, error) {
   106  	resp := models.ServiceInstance{}
   107  	request := rest.PatchRequest(helpers.GetFullURL(*r.client.Config.Endpoint, "/v1/resource_instances/"+url.PathEscape(serviceInstanceID)))
   108  	_, err := r.client.SendRequest(request.Body(updateInstanceRequest), &resp)
   109  	if err != nil {
   110  		return resp, err
   111  	}
   112  	return resp, nil
   113  }
   114  
   115  func (r *resourceServiceInstance) GetInstance(serviceInstanceID string) (models.ServiceInstance, error) {
   116  	var instance models.ServiceInstance
   117  	resp, err := r.client.Get("/v1/resource_instances/"+url.PathEscape(serviceInstanceID), &instance)
   118  	if resp.StatusCode == http.StatusNotFound {
   119  		return models.ServiceInstance{}, bmxerror.New(ErrCodeResourceServiceInstanceDoesnotExist,
   120  			fmt.Sprintf("Given service instance : %q doesn't exist", serviceInstanceID))
   121  	}
   122  	return instance, err
   123  }
   124  
   125  func (r *resourceServiceInstance) DeleteInstance(resourceInstanceID string, recursive bool) error {
   126  	request := rest.DeleteRequest(helpers.GetFullURL(*r.client.Config.Endpoint, "/v1/resource_instances/"+url.PathEscape(resourceInstanceID)))
   127  	if recursive {
   128  		request = request.Query("recursive", "true")
   129  	}
   130  	_, err := r.client.SendRequest(request, nil)
   131  	return err
   132  }
   133  
   134  /*func (r *resourceServiceInstance) GetBindings(serviceInstanceID string) ([]ServiceBinding, error) {
   135  	listRequest := rest.GetRequest("/v1/resource_instances/" + url.PathEscape(serviceInstanceID) + "/resource_bindings")
   136  	req, err := listRequest.Build()
   137  	if err != nil {
   138  		return nil, err
   139  	}
   140  
   141  	var bindings []ServiceBinding
   142  	_, err = r.client.GetPaginated(
   143  		req.URL.String(),
   144  		ServiceBinding{},
   145  		func(resource interface{}) bool {
   146  			if binding, ok := resource.(ServiceBinding); ok {
   147  				bindings = append(bindings, binding)
   148  				return true
   149  			}
   150  			return false
   151  		})
   152  	if err != nil {
   153  		return []ServiceBinding{}, err
   154  	}
   155  	return bindings, nil
   156  }*/
   157  
   158  func filterInstancesByName(instances []models.ServiceInstance, name string) []models.ServiceInstance {
   159  	ret := []models.ServiceInstance{}
   160  	for _, instance := range instances {
   161  		if instance.Name == name {
   162  			ret = append(ret, instance)
   163  		}
   164  	}
   165  	return ret
   166  }