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