github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/cloudwrapper/capacity.go (about)

     1  package cloudwrapper
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"fmt"
     7  	"net/http"
     8  	"net/url"
     9  )
    10  
    11  type (
    12  	// Capacities is a Cloud Wrapper API interface.
    13  	Capacities interface {
    14  		// ListCapacities fetches capacities available for a given contractId.
    15  		// If no contract id is provided, lists all available capacity locations
    16  		//
    17  		// See: https://techdocs.akamai.com/cloud-wrapper/reference/get-capacity-inventory
    18  		ListCapacities(context.Context, ListCapacitiesRequest) (*ListCapacitiesResponse, error)
    19  	}
    20  
    21  	// ListCapacitiesRequest is a request struct
    22  	ListCapacitiesRequest struct {
    23  		ContractIDs []string
    24  	}
    25  
    26  	// ListCapacitiesResponse contains response list of location capacities
    27  	ListCapacitiesResponse struct {
    28  		Capacities []LocationCapacity `json:"capacities"`
    29  	}
    30  
    31  	// LocationCapacity contains location capacity information
    32  	LocationCapacity struct {
    33  		LocationID         int          `json:"locationId"`
    34  		LocationName       string       `json:"locationName"`
    35  		ContractID         string       `json:"contractId"`
    36  		Type               CapacityType `json:"type"`
    37  		ApprovedCapacity   Capacity     `json:"approvedCapacity"`
    38  		AssignedCapacity   Capacity     `json:"assignedCapacity"`
    39  		UnassignedCapacity Capacity     `json:"unassignedCapacity"`
    40  	}
    41  
    42  	// CapacityType is a type of the properties, this capacity is related to
    43  	CapacityType string
    44  
    45  	// Capacity struct holds capacity information
    46  	Capacity struct {
    47  		Value int64 `json:"value"`
    48  		Unit  Unit  `json:"unit"`
    49  	}
    50  
    51  	// Unit type of capacity value. Can be either GB or TB
    52  	Unit string
    53  )
    54  
    55  const (
    56  	// UnitGB is a const value for capacity unit
    57  	UnitGB Unit = "GB"
    58  	// UnitTB is a const value for capacity unit
    59  	UnitTB Unit = "TB"
    60  )
    61  
    62  const (
    63  	// CapacityTypeMedia type
    64  	CapacityTypeMedia CapacityType = "MEDIA"
    65  	// CapacityTypeWebStandardTLS type
    66  	CapacityTypeWebStandardTLS CapacityType = "WEB_STANDARD_TLS"
    67  	// CapacityTypeWebEnhancedTLS type
    68  	CapacityTypeWebEnhancedTLS CapacityType = "WEB_ENHANCED_TLS"
    69  )
    70  
    71  var (
    72  	// ErrListCapacities is returned in case an error occurs on ListCapacities operation
    73  	ErrListCapacities = errors.New("list capacities")
    74  )
    75  
    76  func (c *cloudwrapper) ListCapacities(ctx context.Context, params ListCapacitiesRequest) (*ListCapacitiesResponse, error) {
    77  	logger := c.Log(ctx)
    78  	logger.Debug("ListCapacities")
    79  
    80  	uri, err := url.Parse("/cloud-wrapper/v1/capacity")
    81  	if err != nil {
    82  		return nil, fmt.Errorf("%w: failed to parse url: %s", ErrListCapacities, err)
    83  	}
    84  
    85  	q := uri.Query()
    86  	for _, contractID := range params.ContractIDs {
    87  		q.Add("contractIds", contractID)
    88  	}
    89  	uri.RawQuery = q.Encode()
    90  
    91  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri.String(), nil)
    92  	if err != nil {
    93  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrListCapacities, err)
    94  	}
    95  
    96  	var result ListCapacitiesResponse
    97  	resp, err := c.Exec(req, &result)
    98  	if err != nil {
    99  		return nil, fmt.Errorf("%w: request failed: %s", ErrListCapacities, err)
   100  	}
   101  
   102  	if resp.StatusCode != http.StatusOK {
   103  		return nil, fmt.Errorf("%s: %w", ErrListCapacities, c.Error(resp))
   104  	}
   105  
   106  	return &result, nil
   107  }