github.com/IBM-Cloud/bluemix-go@v0.0.0-20240423071914-9e96525baef4/api/resource/resourcev1/controller/resource_service_alias.go (about) 1 package controller 2 3 import ( 4 "fmt" 5 "net/http" 6 "net/url" 7 "strings" 8 9 "github.com/IBM-Cloud/bluemix-go/bmxerror" 10 "github.com/IBM-Cloud/bluemix-go/client" 11 "github.com/IBM-Cloud/bluemix-go/crn" 12 "github.com/IBM-Cloud/bluemix-go/models" 13 "github.com/IBM-Cloud/bluemix-go/rest" 14 ) 15 16 type ServiceAliasQueryFilter struct { 17 AccountID string 18 ServiceInstanceID string 19 Name string // TODO: RC API currently not support name filtering 20 } 21 22 type CreateServiceAliasParams struct { 23 Name string `json:"name"` 24 ServiceInstanceID string `json:"resource_instance_id"` 25 ScopeCRN crn.CRN `json:"scope_crn"` 26 Tags []string `json:"tags,omitempty"` 27 Parameters map[string]interface{} `json:"parameters,omitempty"` 28 } 29 30 type UpdateServiceAliasParams struct { 31 Name string `json:"name,omitempty"` 32 Tags []string `json:"tags,omitempty"` 33 Parameters map[string]interface{} `json:"parameters,omitempty"` 34 } 35 36 //ErrCodeResourceServiceAliasDoesnotExist ... 37 const ErrCodeResourceServiceAliasDoesnotExist = "ResourceServiceAliasDoesnotExist" 38 39 type ResourceServiceAliasRepository interface { 40 Alias(aliasID string) (models.ServiceAlias, error) 41 Aliases(*ServiceAliasQueryFilter) ([]models.ServiceAlias, error) 42 AliasesWithCallback(*ServiceAliasQueryFilter, func(models.ServiceAlias) bool) error 43 44 InstanceAliases(serviceInstanceID string) ([]models.ServiceAlias, error) 45 InstanceAliasByName(serviceInstanceID string, name string) ([]models.ServiceAlias, error) 46 47 CreateAlias(params CreateServiceAliasParams) (models.ServiceAlias, error) 48 UpdateAlias(aliasID string, params UpdateServiceAliasParams) (models.ServiceAlias, error) 49 DeleteAlias(aliasID string) error 50 } 51 52 type serviceAliasRepository struct { 53 client *client.Client 54 } 55 56 func newResourceServiceAliasRepository(c *client.Client) ResourceServiceAliasRepository { 57 return &serviceAliasRepository{ 58 client: c, 59 } 60 } 61 62 func (r *serviceAliasRepository) InstanceAliases(serviceInstanceID string) ([]models.ServiceAlias, error) { 63 return r.Aliases(&ServiceAliasQueryFilter{ServiceInstanceID: serviceInstanceID}) 64 } 65 66 func (r *serviceAliasRepository) InstanceAliasByName(serviceInstanceID string, name string) ([]models.ServiceAlias, error) { 67 return r.Aliases(&ServiceAliasQueryFilter{ServiceInstanceID: serviceInstanceID, Name: name}) 68 } 69 70 func (r *serviceAliasRepository) Alias(aliasID string) (models.ServiceAlias, error) { 71 var alias models.ServiceAlias 72 resp, err := r.client.Get("/v1/resource_aliases/"+url.PathEscape(aliasID), &alias) 73 if resp.StatusCode == http.StatusNotFound { 74 return alias, bmxerror.New(ErrCodeResourceServiceAliasDoesnotExist, 75 fmt.Sprintf("Given service alias : %q doesn't exist", aliasID)) 76 } 77 return alias, err 78 } 79 func (r *serviceAliasRepository) Aliases(filter *ServiceAliasQueryFilter) ([]models.ServiceAlias, error) { 80 var aliases []models.ServiceAlias 81 err := r.AliasesWithCallback(filter, func(a models.ServiceAlias) bool { 82 aliases = append(aliases, a) 83 return true 84 }) 85 return aliases, err 86 } 87 88 func (r *serviceAliasRepository) AliasesWithCallback(filter *ServiceAliasQueryFilter, cb func(models.ServiceAlias) bool) error { 89 listRequest := rest.GetRequest("/v1/resource_aliases") 90 if filter != nil { 91 if filter.AccountID != "" { 92 listRequest.Query("account_id", filter.AccountID) 93 } 94 if filter.ServiceInstanceID != "" { 95 listRequest.Query("resource_instance_id", url.PathEscape(filter.ServiceInstanceID)) 96 } 97 } 98 99 req, err := listRequest.Build() 100 if err != nil { 101 return err 102 } 103 104 // TODO: GetPaginated's first argument should be a request instead if url path 105 _, err = r.client.GetPaginated( 106 req.URL.String(), 107 NewRCPaginatedResources(models.ServiceAlias{}), 108 func(resource interface{}) bool { 109 // if alias, ok := resource.(models.ServiceAlias); ok { 110 // return cb(alias) 111 // } 112 // TODO: once RC API support name filtering, remove name check in cb 113 if alias, ok := resource.(models.ServiceAlias); ok { 114 if filter.Name == "" || strings.EqualFold(filter.Name, alias.Name) { 115 return cb(alias) 116 } 117 return true 118 } 119 return false 120 }) 121 122 return err 123 } 124 125 func (r *serviceAliasRepository) CreateAlias(params CreateServiceAliasParams) (models.ServiceAlias, error) { 126 alias := models.ServiceAlias{} 127 _, err := r.client.Post("/v1/resource_aliases", params, &alias) 128 return alias, err 129 } 130 131 func (r *serviceAliasRepository) UpdateAlias(aliasID string, params UpdateServiceAliasParams) (models.ServiceAlias, error) { 132 alias := models.ServiceAlias{} 133 resp, err := r.client.Patch("/v1/resource_aliases/"+url.PathEscape(aliasID), params, &alias) 134 if resp.StatusCode == http.StatusNotFound { 135 return alias, bmxerror.New(ErrCodeResourceServiceAliasDoesnotExist, 136 fmt.Sprintf("Given service alias : %q doesn't exist", aliasID)) 137 } 138 return alias, err 139 } 140 141 func (r *serviceAliasRepository) DeleteAlias(aliasID string) error { 142 resp, err := r.client.Delete("/v1/resource_aliases/" + url.PathEscape(aliasID)) 143 if resp.StatusCode == http.StatusNotFound { 144 return bmxerror.New(ErrCodeResourceServiceAliasDoesnotExist, 145 fmt.Sprintf("Given service alias : %q doesn't exist", aliasID)) 146 } 147 return err 148 }