github.com/akamai/AkamaiOPEN-edgegrid-golang/v2@v2.17.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/v2/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://developer.akamai.com/api/web_performance/cloudlets/v2.html#getloadbalancingconfigactivations
    22  		ListLoadBalancerActivations(context.Context, ListLoadBalancerActivationsRequest) ([]LoadBalancerActivation, error)
    23  
    24  		// ActivateLoadBalancerVersion activates the load balancing version
    25  		//
    26  		// See: https://developer.akamai.com/api/web_performance/cloudlets/v2.html#postloadbalancingconfigactivations
    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  // ListLoadBalancerActivations fetches activations with the most recent listed first
   130  func (c *cloudlets) ListLoadBalancerActivations(ctx context.Context, params ListLoadBalancerActivationsRequest) ([]LoadBalancerActivation, error) {
   131  	logger := c.Log(ctx)
   132  	logger.Debug("ListLoadBalancerActivations")
   133  
   134  	if err := params.Validate(); err != nil {
   135  		return nil, fmt.Errorf("%s: %w:\n%s", ErrListLoadBalancerActivations, ErrStructValidation, err)
   136  	}
   137  
   138  	uri, err := url.Parse(fmt.Sprintf("/cloudlets/api/v2/origins/%s/activations", params.OriginID))
   139  	if err != nil {
   140  		return nil, fmt.Errorf("%w: failed to parse url: %s", ErrListLoadBalancerActivations, err)
   141  	}
   142  
   143  	q := uri.Query()
   144  	if params.Network != "" {
   145  		q.Add("network", fmt.Sprintf("%s", params.Network))
   146  	}
   147  	if params.PageSize != nil {
   148  		q.Add("pageSize", fmt.Sprintf("%d", *params.PageSize))
   149  	}
   150  	if params.Page != nil {
   151  		q.Add("page", fmt.Sprintf("%d", *params.Page))
   152  	}
   153  	if params.LatestOnly != false {
   154  		q.Add("latestOnly", fmt.Sprintf("%s", strconv.FormatBool(params.LatestOnly)))
   155  	}
   156  	uri.RawQuery = q.Encode()
   157  
   158  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri.String(), nil)
   159  	if err != nil {
   160  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrListLoadBalancerActivations, err)
   161  	}
   162  
   163  	var result []LoadBalancerActivation
   164  	resp, err := c.Exec(req, &result)
   165  	if err != nil {
   166  		return nil, fmt.Errorf("%w: request failed: %s", ErrListLoadBalancerActivations, err)
   167  	}
   168  
   169  	if resp.StatusCode != http.StatusOK {
   170  		return nil, fmt.Errorf("%s: %w", ErrListLoadBalancerActivations, c.Error(resp))
   171  	}
   172  
   173  	return result, nil
   174  }
   175  
   176  // ActivateLoadBalancerVersion activates the load balacing version
   177  func (c *cloudlets) ActivateLoadBalancerVersion(ctx context.Context, params ActivateLoadBalancerVersionRequest) (*LoadBalancerActivation, error) {
   178  	logger := c.Log(ctx)
   179  	logger.Debug("ActivateLoadBalancerVersion")
   180  
   181  	if err := params.Validate(); err != nil {
   182  		return nil, fmt.Errorf("%s: %w:\n%s", ErrActivateLoadBalancerVersion, ErrStructValidation, err)
   183  	}
   184  
   185  	uri, err := url.Parse(fmt.Sprintf("/cloudlets/api/v2/origins/%s/activations", params.OriginID))
   186  	if err != nil {
   187  		return nil, fmt.Errorf("%w: failed to parse url: %s", ErrActivateLoadBalancerVersion, err)
   188  	}
   189  
   190  	q := uri.Query()
   191  	q.Add("async", strconv.FormatBool(params.Async))
   192  	uri.RawQuery = q.Encode()
   193  
   194  	req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri.String(), nil)
   195  	if err != nil {
   196  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrActivateLoadBalancerVersion, err)
   197  	}
   198  
   199  	var result LoadBalancerActivation
   200  
   201  	resp, err := c.Exec(req, &result, params.LoadBalancerVersionActivation)
   202  	if err != nil {
   203  		return nil, fmt.Errorf("%w: request failed: %s", ErrActivateLoadBalancerVersion, err)
   204  	}
   205  
   206  	if resp.StatusCode != http.StatusOK {
   207  		return nil, fmt.Errorf("%s: %w", ErrActivateLoadBalancerVersion, c.Error(resp))
   208  	}
   209  
   210  	return &result, nil
   211  }