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

     1  package cloudlets
     2  
     3  import (
     4  	"bytes"
     5  	"context"
     6  	"errors"
     7  	"fmt"
     8  	"net/http"
     9  	"net/url"
    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  	// PolicyVersionActivations is a cloudlets PolicyVersionActivations API interface.
    18  	PolicyVersionActivations interface {
    19  		// ListPolicyActivations returns the complete activation history for the selected policy in reverse chronological order.
    20  		//
    21  		// See: https://techdocs.akamai.com/cloudlets/v2/reference/get-policy-activations
    22  		ListPolicyActivations(context.Context, ListPolicyActivationsRequest) ([]PolicyActivation, error)
    23  
    24  		// ActivatePolicyVersion activates the selected cloudlet policy version.
    25  		//
    26  		// See: https://techdocs.akamai.com/cloudlets/v2/reference/post-policy-version-activations
    27  		ActivatePolicyVersion(context.Context, ActivatePolicyVersionRequest) ([]PolicyActivation, error)
    28  	}
    29  
    30  	// ListPolicyActivationsRequest contains the request parameters for ListPolicyActivations
    31  	ListPolicyActivationsRequest struct {
    32  		PolicyID     int64
    33  		Network      PolicyActivationNetwork
    34  		PropertyName string
    35  	}
    36  
    37  	// ActivatePolicyVersionRequest contains the request parameters for ActivatePolicyVersion
    38  	ActivatePolicyVersionRequest struct {
    39  		PolicyID int64
    40  		Async    bool
    41  		Version  int64
    42  		PolicyVersionActivation
    43  	}
    44  
    45  	// PolicyVersionActivation is the body content for an ActivatePolicyVersion request
    46  	PolicyVersionActivation struct {
    47  		Network                 PolicyActivationNetwork `json:"network"`
    48  		AdditionalPropertyNames []string                `json:"additionalPropertyNames,omitempty"`
    49  	}
    50  
    51  	// PolicyActivationNetwork is the activation network type for policy
    52  	PolicyActivationNetwork string
    53  )
    54  
    55  var (
    56  	// ErrListPolicyActivations is returned when ListPolicyActivations fails
    57  	ErrListPolicyActivations = errors.New("list policy activations")
    58  	// ErrActivatePolicyVersion is returned when ActivatePolicyVersion fails
    59  	ErrActivatePolicyVersion = errors.New("activate policy version")
    60  )
    61  
    62  const (
    63  	// PolicyActivationNetworkStaging is the staging network for policy
    64  	PolicyActivationNetworkStaging PolicyActivationNetwork = "staging"
    65  	// PolicyActivationNetworkProduction is the production network for policy
    66  	PolicyActivationNetworkProduction PolicyActivationNetwork = "prod"
    67  )
    68  
    69  // Validate validates ListPolicyActivationsRequest
    70  func (r ListPolicyActivationsRequest) Validate() error {
    71  	errs := validation.Errors{
    72  		"PolicyID": validation.Validate(r.PolicyID, validation.Required),
    73  		"Network": validation.Validate(
    74  			r.Network,
    75  			validation.In(PolicyActivationNetworkStaging, PolicyActivationNetworkProduction).Error(
    76  				fmt.Sprintf("value '%s' is invalid. Must be one of: 'staging', 'prod' or '' (empty)", (&r).Network)),
    77  		),
    78  	}
    79  	return edgegriderr.ParseValidationErrors(errs)
    80  }
    81  
    82  // Validate validates ActivatePolicyVersionRequest
    83  func (r ActivatePolicyVersionRequest) Validate() error {
    84  	errs := validation.Errors{
    85  		"PolicyID":                            validation.Validate(r.PolicyID, validation.Required),
    86  		"Version":                             validation.Validate(r.Version, validation.Required),
    87  		"RequestBody.AdditionalPropertyNames": validation.Validate(r.PolicyVersionActivation.AdditionalPropertyNames, validation.Required),
    88  		"RequestBody.Network": validation.Validate(
    89  			r.PolicyVersionActivation.Network,
    90  			validation.Required,
    91  			validation.In(PolicyActivationNetworkStaging, PolicyActivationNetworkProduction).Error(
    92  				fmt.Sprintf("value '%s' is invalid. Must be one of: 'staging' or 'prod'", (&r).PolicyVersionActivation.Network)),
    93  		),
    94  	}
    95  	return edgegriderr.ParseValidationErrors(errs)
    96  }
    97  
    98  // UnmarshalJSON unifies json network field into well defined values
    99  func (n *PolicyActivationNetwork) UnmarshalJSON(data []byte) error {
   100  	d := bytes.Trim(data, "\"")
   101  
   102  	switch string(d) {
   103  	case "STAGING", "staging":
   104  		*n = PolicyActivationNetworkStaging
   105  	case "PRODUCTION", "production", "prod":
   106  		*n = PolicyActivationNetworkProduction
   107  	default:
   108  		return fmt.Errorf("cannot unmarshall PolicyActivationNetwork: %q", d)
   109  	}
   110  	return nil
   111  }
   112  
   113  func (c *cloudlets) ListPolicyActivations(ctx context.Context, params ListPolicyActivationsRequest) ([]PolicyActivation, error) {
   114  	c.Log(ctx).Debug("ListPolicyActivations")
   115  
   116  	if err := params.Validate(); err != nil {
   117  		return nil, fmt.Errorf("%s: %w:\n%s", ErrListPolicyActivations, ErrStructValidation, err)
   118  	}
   119  
   120  	uri, err := url.Parse(fmt.Sprintf("/cloudlets/api/v2/policies/%d/activations", params.PolicyID))
   121  	if err != nil {
   122  		return nil, fmt.Errorf("%w: failed to parse url: %s", ErrListPolicyActivations, err)
   123  	}
   124  
   125  	q := uri.Query()
   126  	if params.Network != "" {
   127  		q.Set("network", string(params.Network))
   128  	}
   129  	if params.PropertyName != "" {
   130  		q.Set("propertyName", params.PropertyName)
   131  	}
   132  	uri.RawQuery = q.Encode()
   133  
   134  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri.String(), nil)
   135  	if err != nil {
   136  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrListPolicyActivations, err)
   137  	}
   138  
   139  	var result []PolicyActivation
   140  	response, err := c.Exec(req, &result)
   141  	if err != nil {
   142  		return nil, fmt.Errorf("%w: request failed: %s", ErrListPolicyActivations, err)
   143  	}
   144  
   145  	if response.StatusCode != http.StatusOK {
   146  		return nil, fmt.Errorf("%s: %w", ErrListPolicyActivations, c.Error(response))
   147  	}
   148  
   149  	return result, nil
   150  }
   151  
   152  func (c *cloudlets) ActivatePolicyVersion(ctx context.Context, params ActivatePolicyVersionRequest) ([]PolicyActivation, error) {
   153  	c.Log(ctx).Debug("ActivatePolicyVersion")
   154  
   155  	if err := params.Validate(); err != nil {
   156  		return nil, fmt.Errorf("%s: %w:\n%s", ErrActivatePolicyVersion, ErrStructValidation, err)
   157  	}
   158  
   159  	uri, err := url.Parse(fmt.Sprintf(
   160  		"/cloudlets/api/v2/policies/%d/versions/%d/activations",
   161  		params.PolicyID, params.Version))
   162  	if err != nil {
   163  		return nil, fmt.Errorf("%w: failed to create POST URI: %s", ErrActivatePolicyVersion, err)
   164  	}
   165  
   166  	req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri.String(), nil)
   167  	if err != nil {
   168  		return nil, fmt.Errorf("%w: failed to create POST request: %s", ErrActivatePolicyVersion, err)
   169  	}
   170  
   171  	var result []PolicyActivation
   172  	response, err := c.Exec(req, &result, params.PolicyVersionActivation)
   173  	if err != nil {
   174  		return nil, fmt.Errorf("%w: request failed: %s", ErrActivatePolicyVersion, err)
   175  	}
   176  
   177  	if response.StatusCode >= http.StatusBadRequest {
   178  		return nil, fmt.Errorf("%w: %s", ErrActivatePolicyVersion, c.Error(response))
   179  	}
   180  
   181  	return result, nil
   182  }