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

     1  package cloudlets
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"fmt"
     7  	"net/http"
     8  	"net/url"
     9  
    10  	"github.com/akamai/AkamaiOPEN-edgegrid-golang/v8/pkg/edgegriderr"
    11  
    12  	validation "github.com/go-ozzo/ozzo-validation/v4"
    13  )
    14  
    15  type (
    16  	// LoadBalancers is a cloudlets LoadBalancer API interface.
    17  	LoadBalancers interface {
    18  		// ListOrigins lists all origins of specified type for the current account.
    19  		//
    20  		// See: https://techdocs.akamai.com/cloudlets/v2/reference/get-origins
    21  		ListOrigins(context.Context, ListOriginsRequest) ([]OriginResponse, error)
    22  
    23  		// GetOrigin gets specific origin by originID.
    24  		// This operation is only available for the APPLICATION_LOAD_BALANCER origin type.
    25  		//
    26  		// See: https://techdocs.akamai.com/cloudlets/v2/reference/get-origin
    27  		GetOrigin(context.Context, GetOriginRequest) (*Origin, error)
    28  
    29  		// CreateOrigin creates configuration for an origin.
    30  		// This operation is only available for the APPLICATION_LOAD_BALANCER origin type.
    31  		//
    32  		// See: https://techdocs.akamai.com/cloudlets/v2/reference/post-origin
    33  		CreateOrigin(context.Context, CreateOriginRequest) (*Origin, error)
    34  
    35  		// UpdateOrigin creates configuration for an origin.
    36  		// This operation is only available for the APPLICATION_LOAD_BALANCER origin type.
    37  		//
    38  		// See: https://techdocs.akamai.com/cloudlets/v2/reference/put-origin
    39  		UpdateOrigin(context.Context, UpdateOriginRequest) (*Origin, error)
    40  	}
    41  
    42  	// OriginResponse is an Origin returned in ListOrigins
    43  	OriginResponse struct {
    44  		Hostname string `json:"hostname"`
    45  		Origin
    46  	}
    47  
    48  	// OriginType is a type for Origin Type
    49  	OriginType string
    50  
    51  	// ListOriginsRequest describes the parameters of the ListOrigins request
    52  	ListOriginsRequest struct {
    53  		Type OriginType
    54  	}
    55  
    56  	// GetOriginRequest describes the parameters of the get origins request
    57  	GetOriginRequest struct {
    58  		OriginID string
    59  	}
    60  
    61  	// CreateOriginRequest describes the parameters of the create origin request
    62  	CreateOriginRequest struct {
    63  		OriginID string `json:"originId"`
    64  		Description
    65  	}
    66  
    67  	// UpdateOriginRequest describes the parameters of the update origin request
    68  	UpdateOriginRequest struct {
    69  		OriginID string
    70  		Description
    71  	}
    72  
    73  	// Description describes description for the Origin
    74  	Description struct {
    75  		Description string `json:"description,omitempty"`
    76  	}
    77  
    78  	// Origin is a response returned by CreateOrigin
    79  	Origin struct {
    80  		OriginID    string     `json:"originId"`
    81  		Description string     `json:"description"`
    82  		Akamaized   bool       `json:"akamaized"`
    83  		Checksum    string     `json:"checksum"`
    84  		Type        OriginType `json:"type"`
    85  	}
    86  )
    87  
    88  const (
    89  	// OriginTypeAll is a value to use when you want ListOrigins to return origins of all types
    90  	OriginTypeAll OriginType = ""
    91  	// OriginTypeCustomer is a value to use when you want ListOrigins to return only origins of CUSTOMER type
    92  	OriginTypeCustomer OriginType = "CUSTOMER"
    93  	// OriginTypeApplicationLoadBalancer is a value to use when you want ListOrigins to return only origins of APPLICATION_LOAD_BALANCER type
    94  	OriginTypeApplicationLoadBalancer OriginType = "APPLICATION_LOAD_BALANCER"
    95  	// OriginTypeNetStorage is a value to use when you want ListOrigins to return only origins of NETSTORAGE type
    96  	OriginTypeNetStorage OriginType = "NETSTORAGE"
    97  )
    98  
    99  var (
   100  	// ErrListOrigins is returned when ListOrigins fails
   101  	ErrListOrigins = errors.New("list origins")
   102  	// ErrGetOrigin is returned when GetOrigin fails
   103  	ErrGetOrigin = errors.New("get origin")
   104  	// ErrCreateOrigin is returned when CreateOrigin fails
   105  	ErrCreateOrigin = errors.New("create origin")
   106  	// ErrUpdateOrigin is returned when UpdateOrigin fails
   107  	ErrUpdateOrigin = errors.New("update origin")
   108  )
   109  
   110  // Validate validates ListOriginsRequest
   111  func (v ListOriginsRequest) Validate() error {
   112  	errs := validation.Errors{
   113  		"Type": validation.Validate(v.Type, validation.In(OriginTypeCustomer, OriginTypeApplicationLoadBalancer, OriginTypeNetStorage, OriginTypeAll).Error(
   114  			fmt.Sprintf("value '%s' is invalid. Must be one of: 'CUSTOMER', 'APPLICATION_LOAD_BALANCER', 'NETSTORAGE' or '' (empty)", (&v).Type))),
   115  	}
   116  	return edgegriderr.ParseValidationErrors(errs)
   117  }
   118  
   119  // Validate validates CreateOriginRequest
   120  func (v CreateOriginRequest) Validate() error {
   121  	errs := validation.Errors{
   122  		"OriginID":    validation.Validate(v.OriginID, validation.Required, validation.Length(2, 63)),
   123  		"Description": validation.Validate(v.Description.Description, validation.Length(0, 255)),
   124  	}
   125  	return edgegriderr.ParseValidationErrors(errs)
   126  }
   127  
   128  // Validate validates UpdateOriginRequest
   129  func (v UpdateOriginRequest) Validate() error {
   130  	errs := validation.Errors{
   131  		"OriginID":    validation.Validate(v.OriginID, validation.Required, validation.Length(2, 63)),
   132  		"Description": validation.Validate(v.Description.Description, validation.Length(0, 255)),
   133  	}
   134  	return edgegriderr.ParseValidationErrors(errs)
   135  }
   136  
   137  func (c *cloudlets) ListOrigins(ctx context.Context, params ListOriginsRequest) ([]OriginResponse, error) {
   138  	logger := c.Log(ctx)
   139  	logger.Debug("ListOrigins")
   140  
   141  	if err := params.Validate(); err != nil {
   142  		return nil, fmt.Errorf("%s: %w:\n%s", ErrListOrigins, ErrStructValidation, err)
   143  	}
   144  
   145  	uri, err := url.Parse("/cloudlets/api/v2/origins")
   146  	if err != nil {
   147  		return nil, fmt.Errorf("%w: failed to parse url: %s", ErrListOrigins, err)
   148  	}
   149  	if params.Type != OriginTypeAll {
   150  		q := uri.Query()
   151  		q.Add("type", string(params.Type))
   152  		uri.RawQuery = q.Encode()
   153  	}
   154  
   155  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri.String(), nil)
   156  	if err != nil {
   157  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrListOrigins, err)
   158  	}
   159  
   160  	var result []OriginResponse
   161  	resp, err := c.Exec(req, &result)
   162  	if err != nil {
   163  		return nil, fmt.Errorf("%w: request failed: %s", ErrListOrigins, err)
   164  	}
   165  
   166  	if resp.StatusCode != http.StatusOK {
   167  		return nil, fmt.Errorf("%s: %w", ErrListOrigins, c.Error(resp))
   168  	}
   169  
   170  	return result, nil
   171  }
   172  
   173  func (c *cloudlets) GetOrigin(ctx context.Context, params GetOriginRequest) (*Origin, error) {
   174  	logger := c.Log(ctx)
   175  	logger.Debug("GetOrigin")
   176  
   177  	uri, err := url.Parse(fmt.Sprintf("/cloudlets/api/v2/origins/%s", params.OriginID))
   178  	if err != nil {
   179  		return nil, fmt.Errorf("%w: failed to parse url: %s", ErrGetOrigin, err)
   180  	}
   181  
   182  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri.String(), nil)
   183  	if err != nil {
   184  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrGetOrigin, err)
   185  	}
   186  
   187  	var result Origin
   188  	resp, err := c.Exec(req, &result)
   189  	if err != nil {
   190  		return nil, fmt.Errorf("%w: request failed: %s", ErrGetOrigin, err)
   191  	}
   192  
   193  	if resp.StatusCode != http.StatusOK {
   194  		return nil, fmt.Errorf("%s: %w", ErrGetOrigin, c.Error(resp))
   195  	}
   196  
   197  	return &result, nil
   198  }
   199  
   200  func (c *cloudlets) CreateOrigin(ctx context.Context, params CreateOriginRequest) (*Origin, error) {
   201  	logger := c.Log(ctx)
   202  	logger.Debug("CreateOrigin")
   203  
   204  	if err := params.Validate(); err != nil {
   205  		return nil, fmt.Errorf("%s: %w:\n%s", ErrCreateOrigin, ErrStructValidation, err)
   206  	}
   207  
   208  	uri, err := url.Parse("/cloudlets/api/v2/origins")
   209  	if err != nil {
   210  		return nil, fmt.Errorf("%w: failed to parse url: %s", ErrCreateOrigin, err)
   211  	}
   212  
   213  	req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri.String(), nil)
   214  	if err != nil {
   215  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrCreateOrigin, err)
   216  	}
   217  
   218  	var result Origin
   219  
   220  	resp, err := c.Exec(req, &result, params)
   221  	if err != nil {
   222  		return nil, fmt.Errorf("%w: request failed: %s", ErrCreateOrigin, err)
   223  	}
   224  
   225  	if resp.StatusCode != http.StatusCreated {
   226  		return nil, fmt.Errorf("%s: %w", ErrCreateOrigin, c.Error(resp))
   227  	}
   228  
   229  	return &result, nil
   230  }
   231  
   232  func (c *cloudlets) UpdateOrigin(ctx context.Context, params UpdateOriginRequest) (*Origin, error) {
   233  	logger := c.Log(ctx)
   234  	logger.Debug("UpdateOrigin")
   235  
   236  	if err := params.Validate(); err != nil {
   237  		return nil, fmt.Errorf("%s: %w:\n%s", ErrUpdateOrigin, ErrStructValidation, err)
   238  	}
   239  
   240  	uri, err := url.Parse(fmt.Sprintf("/cloudlets/api/v2/origins/%s", params.OriginID))
   241  	if err != nil {
   242  		return nil, fmt.Errorf("%w: failed to parse url: %s", ErrUpdateOrigin, err)
   243  	}
   244  
   245  	req, err := http.NewRequestWithContext(ctx, http.MethodPut, uri.String(), nil)
   246  	if err != nil {
   247  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrUpdateOrigin, err)
   248  	}
   249  
   250  	var result Origin
   251  
   252  	resp, err := c.Exec(req, &result, params.Description)
   253  	if err != nil {
   254  		return nil, fmt.Errorf("%w: request failed: %s", ErrUpdateOrigin, err)
   255  	}
   256  
   257  	if resp.StatusCode != http.StatusOK {
   258  		return nil, fmt.Errorf("%s: %w", ErrUpdateOrigin, c.Error(resp))
   259  	}
   260  
   261  	return &result, nil
   262  }