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 }