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  }