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  }