github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/edgeworkers/resource_tier.go (about) 1 package edgeworkers 2 3 import ( 4 "context" 5 "errors" 6 "fmt" 7 "net/http" 8 "net/url" 9 10 validation "github.com/go-ozzo/ozzo-validation/v4" 11 ) 12 13 type ( 14 // ResourceTiers is an edgeworkers resource tiers API interface 15 ResourceTiers interface { 16 // ListResourceTiers lists all resource tiers for a given contract 17 // 18 // See: https://techdocs.akamai.com/edgeworkers/reference/get-resource-tiers 19 ListResourceTiers(context.Context, ListResourceTiersRequest) (*ListResourceTiersResponse, error) 20 21 // GetResourceTier returns resource tier for a given edgeworker ID 22 // 23 // See: https://techdocs.akamai.com/edgeworkers/reference/get-id-resource-tier 24 GetResourceTier(context.Context, GetResourceTierRequest) (*ResourceTier, error) 25 } 26 27 // ListResourceTiersRequest contains parameters used to list resource tiers 28 ListResourceTiersRequest struct { 29 ContractID string 30 } 31 32 // GetResourceTierRequest contains parameters used to get a resource tier 33 GetResourceTierRequest struct { 34 EdgeWorkerID int 35 } 36 37 // ListResourceTiersResponse represents a response object returned by ListResourceTiers 38 ListResourceTiersResponse struct { 39 ResourceTiers []ResourceTier `json:"resourceTiers"` 40 } 41 42 // ResourceTier represents a single resource tier object 43 ResourceTier struct { 44 ID int `json:"resourceTierId"` 45 Name string `json:"resourceTierName"` 46 EdgeWorkerLimits []EdgeWorkerLimit `json:"edgeWorkerLimits"` 47 } 48 49 // EdgeWorkerLimit represents a single edgeworker limit object 50 EdgeWorkerLimit struct { 51 LimitName string `json:"limitName"` 52 LimitValue int64 `json:"limitValue"` 53 LimitUnit string `json:"limitUnit"` 54 } 55 ) 56 57 // Validate validates ListResourceTiersRequest 58 func (r ListResourceTiersRequest) Validate() error { 59 return validation.Errors{ 60 "ContractID": validation.Validate(r.ContractID, validation.Required), 61 }.Filter() 62 } 63 64 // Validate validates GetResourceTierRequest 65 func (r GetResourceTierRequest) Validate() error { 66 return validation.Errors{ 67 "EdgeWorkerID": validation.Validate(r.EdgeWorkerID, validation.Required), 68 }.Filter() 69 } 70 71 var ( 72 // ErrListResourceTiers is returned in case an error occurs on ListResourceTiers operation 73 ErrListResourceTiers = errors.New("list resource tiers") 74 // ErrGetResourceTier is returned in case an error occurs on GetResourceTier operation 75 ErrGetResourceTier = errors.New("get a resource tier") 76 ) 77 78 func (e *edgeworkers) ListResourceTiers(ctx context.Context, params ListResourceTiersRequest) (*ListResourceTiersResponse, error) { 79 logger := e.Log(ctx) 80 logger.Debug("ListResourceTiers") 81 82 if err := params.Validate(); err != nil { 83 return nil, fmt.Errorf("%s: %w: %s", ErrListResourceTiers, ErrStructValidation, err) 84 } 85 86 uri, err := url.Parse("/edgeworkers/v1/resource-tiers") 87 if err != nil { 88 return nil, fmt.Errorf("%w: failed to parse url: %s", ErrListResourceTiers, err) 89 } 90 91 q := uri.Query() 92 q.Add("contractId", params.ContractID) 93 uri.RawQuery = q.Encode() 94 95 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri.String(), nil) 96 if err != nil { 97 return nil, fmt.Errorf("%w: failed to create request: %s", ErrListResourceTiers, err) 98 } 99 100 var result ListResourceTiersResponse 101 resp, err := e.Exec(req, &result) 102 if err != nil { 103 return nil, fmt.Errorf("%w: request failed: %s", ErrListResourceTiers, err) 104 } 105 106 if resp.StatusCode != http.StatusOK { 107 return nil, fmt.Errorf("%s: %w", ErrListResourceTiers, e.Error(resp)) 108 } 109 110 return &result, nil 111 } 112 113 func (e *edgeworkers) GetResourceTier(ctx context.Context, params GetResourceTierRequest) (*ResourceTier, error) { 114 logger := e.Log(ctx) 115 logger.Debug("GetResourceTier") 116 117 if err := params.Validate(); err != nil { 118 return nil, fmt.Errorf("%s: %w: %s", ErrGetResourceTier, ErrStructValidation, err) 119 } 120 121 uri := fmt.Sprintf("/edgeworkers/v1/ids/%d/resource-tier", params.EdgeWorkerID) 122 123 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil) 124 if err != nil { 125 return nil, fmt.Errorf("%w: failed to create request: %s", ErrGetResourceTier, err) 126 } 127 128 var result ResourceTier 129 resp, err := e.Exec(req, &result) 130 if err != nil { 131 return nil, fmt.Errorf("%w: request failed: %s", ErrGetResourceTier, err) 132 } 133 134 if resp.StatusCode != http.StatusOK { 135 return nil, fmt.Errorf("%s: %w", ErrGetResourceTier, e.Error(resp)) 136 } 137 138 return &result, nil 139 }