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

     1  package cloudlets
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"fmt"
     7  	"net/http"
     8  	"net/url"
     9  	"strconv"
    10  
    11  	"github.com/akamai/AkamaiOPEN-edgegrid-golang/v8/pkg/edgegriderr"
    12  
    13  	validation "github.com/go-ozzo/ozzo-validation/v4"
    14  )
    15  
    16  type (
    17  	// LoadBalancerActivations is a cloudlets LoadBalancer Activation API interface.
    18  	LoadBalancerActivations interface {
    19  		// ListLoadBalancerActivations fetches activations with the most recent listed first.
    20  		//
    21  		// See: https://techdocs.akamai.com/cloudlets/v2/reference/get-origin-activations
    22  		ListLoadBalancerActivations(context.Context, ListLoadBalancerActivationsRequest) ([]LoadBalancerActivation, error)
    23  
    24  		// ActivateLoadBalancerVersion activates the load balancing version.
    25  		//
    26  		// See: https://techdocs.akamai.com/cloudlets/v2/reference/post-origin-activations
    27  		ActivateLoadBalancerVersion(context.Context, ActivateLoadBalancerVersionRequest) (*LoadBalancerActivation, error)
    28  	}
    29  
    30  	// ListLoadBalancerActivationsRequest contains request parameters for ListLoadBalancerActivations
    31  	ListLoadBalancerActivationsRequest struct {
    32  		OriginID   string
    33  		Network    LoadBalancerActivationNetwork
    34  		LatestOnly bool
    35  		PageSize   *int64
    36  		Page       *int64
    37  	}
    38  
    39  	// ActivateLoadBalancerVersionRequest contains request parameters for LoadBalancer version activation
    40  	ActivateLoadBalancerVersionRequest struct {
    41  		OriginID string
    42  		Async    bool
    43  		LoadBalancerVersionActivation
    44  	}
    45  
    46  	// LoadBalancerVersionActivation contains request parameters for ActivateLoadBalancerVersionRequest
    47  	LoadBalancerVersionActivation struct {
    48  		Network LoadBalancerActivationNetwork `json:"network"`
    49  		DryRun  bool                          `json:"dryrun,omitempty"`
    50  		Version int64                         `json:"version"`
    51  	}
    52  
    53  	// LoadBalancerActivation contains response data for a single LB Version Activation
    54  	LoadBalancerActivation struct {
    55  		ActivatedBy   string                        `json:"activatedBy,omitempty"`
    56  		ActivatedDate string                        `json:"activatedDate,omitempty"`
    57  		Network       LoadBalancerActivationNetwork `json:"network"`
    58  		OriginID      string                        `json:"originId,omitempty"`
    59  		Status        LoadBalancerActivationStatus  `json:"status,omitempty"`
    60  		DryRun        bool                          `json:"dryrun,omitempty"`
    61  		Version       int64                         `json:"version"`
    62  	}
    63  
    64  	//LoadBalancerActivationNetwork is the activation network type for load balancer
    65  	LoadBalancerActivationNetwork string
    66  
    67  	// LoadBalancerActivationStatus is an activation status type for load balancer
    68  	LoadBalancerActivationStatus string
    69  )
    70  
    71  const (
    72  	// LoadBalancerActivationStatusActive is an activation that is currently active
    73  	LoadBalancerActivationStatusActive LoadBalancerActivationStatus = "active"
    74  	// LoadBalancerActivationStatusDeactivated is an activation that is deactivated
    75  	LoadBalancerActivationStatusDeactivated LoadBalancerActivationStatus = "deactivated"
    76  	// LoadBalancerActivationStatusInactive is an activation that is not active
    77  	LoadBalancerActivationStatusInactive LoadBalancerActivationStatus = "inactive"
    78  	// LoadBalancerActivationStatusPending is status of a pending activation
    79  	LoadBalancerActivationStatusPending LoadBalancerActivationStatus = "pending"
    80  	// LoadBalancerActivationStatusFailed is status of a failed activation
    81  	LoadBalancerActivationStatusFailed LoadBalancerActivationStatus = "failed"
    82  
    83  	// LoadBalancerActivationNetworkStaging is the staging network value for load balancer
    84  	LoadBalancerActivationNetworkStaging LoadBalancerActivationNetwork = "STAGING"
    85  	// LoadBalancerActivationNetworkProduction is the production network value for load balancer
    86  	LoadBalancerActivationNetworkProduction LoadBalancerActivationNetwork = "PRODUCTION"
    87  
    88  	// NetworkParamStaging is the staging network param value for ListLoadBalancerActivationsRequest
    89  	NetworkParamStaging LoadBalancerActivationNetwork = "staging"
    90  	// NetworkParamProduction is the production network param value for ListLoadBalancerActivationsRequest
    91  	NetworkParamProduction LoadBalancerActivationNetwork = "prod"
    92  )
    93  
    94  var (
    95  	// ErrListLoadBalancerActivations is returned when ListLoadBalancerActivations fails
    96  	ErrListLoadBalancerActivations = errors.New("list load balancer activations")
    97  	// ErrActivateLoadBalancerVersion is returned when ActivateLoadBalancerVersion fails
    98  	ErrActivateLoadBalancerVersion = errors.New("activate load balancer version")
    99  )
   100  
   101  // Validate validates ActivateLoadBalancerVersionRequest
   102  func (v ActivateLoadBalancerVersionRequest) Validate() error {
   103  	errs := validation.Errors{
   104  		"OriginID": validation.Validate(v.OriginID, validation.Required),
   105  		"Params":   validation.Validate(v.LoadBalancerVersionActivation),
   106  	}
   107  	return edgegriderr.ParseValidationErrors(errs)
   108  }
   109  
   110  // Validate validates ListLoadBalancerActivationsRequest
   111  func (v ListLoadBalancerActivationsRequest) Validate() error {
   112  	errs := validation.Errors{
   113  		"OriginID": validation.Validate(v.OriginID, validation.Required),
   114  		"Network": validation.Validate(v.Network, validation.In(NetworkParamStaging, NetworkParamProduction).Error(
   115  			fmt.Sprintf("value '%s' is invalid. Must be one of: '%s', '%s' or '' (empty)", v.Network, NetworkParamStaging, NetworkParamProduction))),
   116  	}
   117  	return edgegriderr.ParseValidationErrors(errs)
   118  }
   119  
   120  // Validate validates LoadBalancerVersionActivation struct
   121  func (v LoadBalancerVersionActivation) Validate() error {
   122  	return validation.Errors{
   123  		"Network": validation.Validate(v.Network, validation.Required, validation.In(LoadBalancerActivationNetworkStaging, LoadBalancerActivationNetworkProduction).Error(
   124  			fmt.Sprintf("value '%s' is invalid. Must be one of: 'STAGING' or 'PRODUCTION'", v.Network))),
   125  		"Version": validation.Validate(v.Version, validation.Min(0)),
   126  	}.Filter()
   127  }
   128  
   129  func (c *cloudlets) ListLoadBalancerActivations(ctx context.Context, params ListLoadBalancerActivationsRequest) ([]LoadBalancerActivation, error) {
   130  	logger := c.Log(ctx)
   131  	logger.Debug("ListLoadBalancerActivations")
   132  
   133  	if err := params.Validate(); err != nil {
   134  		return nil, fmt.Errorf("%s: %w:\n%s", ErrListLoadBalancerActivations, ErrStructValidation, err)
   135  	}
   136  
   137  	uri, err := url.Parse(fmt.Sprintf("/cloudlets/api/v2/origins/%s/activations", params.OriginID))
   138  	if err != nil {
   139  		return nil, fmt.Errorf("%w: failed to parse url: %s", ErrListLoadBalancerActivations, err)
   140  	}
   141  
   142  	q := uri.Query()
   143  	if params.Network != "" {
   144  		q.Add("network", fmt.Sprintf("%s", params.Network))
   145  	}
   146  	if params.PageSize != nil {
   147  		q.Add("pageSize", fmt.Sprintf("%d", *params.PageSize))
   148  	}
   149  	if params.Page != nil {
   150  		q.Add("page", fmt.Sprintf("%d", *params.Page))
   151  	}
   152  	if params.LatestOnly != false {
   153  		q.Add("latestOnly", fmt.Sprintf("%s", strconv.FormatBool(params.LatestOnly)))
   154  	}
   155  	uri.RawQuery = q.Encode()
   156  
   157  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri.String(), nil)
   158  	if err != nil {
   159  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrListLoadBalancerActivations, err)
   160  	}
   161  
   162  	var result []LoadBalancerActivation
   163  	resp, err := c.Exec(req, &result)
   164  	if err != nil {
   165  		return nil, fmt.Errorf("%w: request failed: %s", ErrListLoadBalancerActivations, err)
   166  	}
   167  
   168  	if resp.StatusCode != http.StatusOK {
   169  		return nil, fmt.Errorf("%s: %w", ErrListLoadBalancerActivations, c.Error(resp))
   170  	}
   171  
   172  	return result, nil
   173  }
   174  
   175  func (c *cloudlets) ActivateLoadBalancerVersion(ctx context.Context, params ActivateLoadBalancerVersionRequest) (*LoadBalancerActivation, error) {
   176  	logger := c.Log(ctx)
   177  	logger.Debug("ActivateLoadBalancerVersion")
   178  
   179  	if err := params.Validate(); err != nil {
   180  		return nil, fmt.Errorf("%s: %w:\n%s", ErrActivateLoadBalancerVersion, ErrStructValidation, err)
   181  	}
   182  
   183  	uri, err := url.Parse(fmt.Sprintf("/cloudlets/api/v2/origins/%s/activations", params.OriginID))
   184  	if err != nil {
   185  		return nil, fmt.Errorf("%w: failed to parse url: %s", ErrActivateLoadBalancerVersion, err)
   186  	}
   187  
   188  	q := uri.Query()
   189  	q.Add("async", strconv.FormatBool(params.Async))
   190  	uri.RawQuery = q.Encode()
   191  
   192  	req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri.String(), nil)
   193  	if err != nil {
   194  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrActivateLoadBalancerVersion, err)
   195  	}
   196  
   197  	var result LoadBalancerActivation
   198  
   199  	resp, err := c.Exec(req, &result, params.LoadBalancerVersionActivation)
   200  	if err != nil {
   201  		return nil, fmt.Errorf("%w: request failed: %s", ErrActivateLoadBalancerVersion, err)
   202  	}
   203  
   204  	if resp.StatusCode != http.StatusOK {
   205  		return nil, fmt.Errorf("%s: %w", ErrActivateLoadBalancerVersion, c.Error(resp))
   206  	}
   207  
   208  	return &result, nil
   209  }