github.com/IBM-Cloud/bluemix-go@v0.0.0-20240423071914-9e96525baef4/api/resource/resourcev2/managementv2/resource_quota.go (about)

     1  package managementv2
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/IBM-Cloud/bluemix-go/bmxerror"
     7  	"github.com/IBM-Cloud/bluemix-go/client"
     8  )
     9  
    10  type quotaDefinitionQueryResult struct {
    11  	QuotaDefinitions []QuotaDefinition `json:"resources"`
    12  }
    13  
    14  type QuotaDefinition struct {
    15  	ID                        string          `json:"_id,omitempty"`
    16  	Revision                  string          `json:"_rev,omitempty"`
    17  	Name                      string          `json:"name,omitmempty"`
    18  	Type                      string          `json:"type,omitempty"`
    19  	ServiceInstanceCountLimit int             `json:"number_of_service_instances,omitempty"`
    20  	AppCountLimit             int             `json:"number_of_apps,omitempty"`
    21  	AppInstanceCountLimit     int             `json:"instances_per_app,omitempty"`
    22  	AppInstanceMemoryLimit    string          `json:"instance_memory,omitempty"`
    23  	TotalAppMemoryLimit       string          `json:"total_app_memory,omitempty"`
    24  	VSICountLimit             int             `json:"vsi_limit,omitempty"`
    25  	ResourceQuotas            []ResourceQuota `json:"resource_quotas,omitempty"`
    26  	CreatedAt                 string          `json:"created_at,omitempty"`
    27  	UpdatedAt                 string          `json:"updated_at,omitempty"`
    28  }
    29  
    30  type ResourceQuota struct {
    31  	ID         string `json:"_id,omitempty"`
    32  	ResourceID string `json:"resource_id,omitempty"`
    33  	Limit      int    `json:"limit,omitempty"`
    34  }
    35  
    36  //ErrCodeResourceQuotaDoesnotExist ...
    37  const ErrCodeResourceQuotaDoesnotExist = "ResourceQuotaDoesnotExist"
    38  
    39  type ResourceQuotaRepository interface {
    40  	// List all quota definitions
    41  	List() ([]QuotaDefinition, error)
    42  	// Query quota definitions having specific name
    43  	FindByName(name string) ([]QuotaDefinition, error)
    44  	// Get quota definition by ID
    45  	Get(id string) (*QuotaDefinition, error)
    46  }
    47  
    48  type resourceQuota struct {
    49  	client *client.Client
    50  }
    51  
    52  func newResourceQuotaAPI(c *client.Client) ResourceQuotaRepository {
    53  	return &resourceQuota{
    54  		client: c,
    55  	}
    56  }
    57  
    58  func (r *resourceQuota) List() ([]QuotaDefinition, error) {
    59  	resp := quotaDefinitionQueryResult{}
    60  	// TODO: change to use pagination if it's available on backend
    61  	_, err := r.client.Get("/v2/quota_definitions", &resp)
    62  	if err != nil {
    63  		return []QuotaDefinition{}, err
    64  	}
    65  	return resp.QuotaDefinitions, nil
    66  }
    67  
    68  func (r *resourceQuota) FindByName(name string) ([]QuotaDefinition, error) {
    69  	allQuotas, err := r.List()
    70  	if err != nil {
    71  		return []QuotaDefinition{}, err
    72  	}
    73  
    74  	quotas := []QuotaDefinition{}
    75  	for _, quota := range allQuotas {
    76  		if quota.Name == name {
    77  			quotas = append(quotas, quota)
    78  		}
    79  	}
    80  
    81  	if len(quotas) == 0 {
    82  		return quotas, bmxerror.New(ErrCodeResourceQuotaDoesnotExist,
    83  			fmt.Sprintf("Given quota : %q doesn't exist", name))
    84  	}
    85  
    86  	return quotas, nil
    87  }
    88  
    89  func (r *resourceQuota) Get(id string) (*QuotaDefinition, error) {
    90  	quota := QuotaDefinition{}
    91  	_, err := r.client.Get("/v2/quota_definitions/"+id, &quota)
    92  	if err != nil {
    93  		return nil, err
    94  	}
    95  	return &quota, nil
    96  }