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

     1  package v3
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"fmt"
     7  	"net/http"
     8  	"net/url"
     9  	"strconv"
    10  	"time"
    11  
    12  	"github.com/akamai/AkamaiOPEN-edgegrid-golang/v8/pkg/edgegriderr"
    13  	validation "github.com/go-ozzo/ozzo-validation/v4"
    14  )
    15  
    16  // ListPolicyActivationsRequest contains request parameters for ListPolicyActivations.
    17  type ListPolicyActivationsRequest struct {
    18  	PolicyID int64
    19  	Page     int
    20  	Size     int
    21  }
    22  
    23  // GetPolicyActivationRequest contains request parameters for GetPolicyActivation.
    24  type GetPolicyActivationRequest struct {
    25  	PolicyID     int64
    26  	ActivationID int64
    27  }
    28  
    29  // ActivatePolicyRequest contains request parameters for ActivatePolicy.
    30  type ActivatePolicyRequest struct {
    31  	PolicyID      int64
    32  	Network       Network
    33  	PolicyVersion int64
    34  }
    35  
    36  // DeactivatePolicyRequest contains request parameters for DeactivatePolicy.
    37  type DeactivatePolicyRequest struct {
    38  	PolicyID      int64
    39  	Network       Network
    40  	PolicyVersion int64
    41  }
    42  
    43  type policyActivationRequest struct {
    44  	Operation     PolicyActivationOperation `json:"operation"`
    45  	Network       Network                   `json:"network"`
    46  	PolicyVersion int64                     `json:"policyVersion"`
    47  }
    48  
    49  // PolicyActivation represents a single policy activation.
    50  type PolicyActivation struct {
    51  	CreatedBy            string                    `json:"createdBy"`
    52  	CreatedDate          time.Time                 `json:"createdDate"`
    53  	FinishDate           *time.Time                `json:"finishDate"`
    54  	ID                   int64                     `json:"id"`
    55  	Network              Network                   `json:"network"`
    56  	Operation            PolicyActivationOperation `json:"operation"`
    57  	PolicyID             int64                     `json:"policyId"`
    58  	Status               ActivationStatus          `json:"status"`
    59  	PolicyVersion        int64                     `json:"policyVersion"`
    60  	PolicyVersionDeleted bool                      `json:"policyVersionDeleted"`
    61  	Links                []Link                    `json:"links"`
    62  }
    63  
    64  // PolicyActivations represents the response data from ListPolicyActivations.
    65  type PolicyActivations struct {
    66  	Page              Page               `json:"page"`
    67  	PolicyActivations []PolicyActivation `json:"content"`
    68  	Links             []Link             `json:"links"`
    69  }
    70  
    71  // PolicyActivationOperation is an enum for policy activation operation
    72  type PolicyActivationOperation string
    73  
    74  const (
    75  	// OperationActivation represents an operation used for activating a policy
    76  	OperationActivation PolicyActivationOperation = "ACTIVATION"
    77  	// OperationDeactivation represents an operation used for deactivating a policy
    78  	OperationDeactivation PolicyActivationOperation = "DEACTIVATION"
    79  )
    80  
    81  // ActivationStatus represents information about policy activation status.
    82  type ActivationStatus string
    83  
    84  const (
    85  	// ActivationStatusInProgress informs that activation is in progress.
    86  	ActivationStatusInProgress ActivationStatus = "IN_PROGRESS"
    87  	// ActivationStatusSuccess informs that activation succeeded.
    88  	ActivationStatusSuccess ActivationStatus = "SUCCESS"
    89  	// ActivationStatusFailed informs that activation failed.
    90  	ActivationStatusFailed ActivationStatus = "FAILED"
    91  )
    92  
    93  // Network represents network on which policy version or property can be activated on.
    94  type Network string
    95  
    96  const (
    97  	// StagingNetwork represents staging network.
    98  	StagingNetwork Network = "STAGING"
    99  	// ProductionNetwork represents production network.
   100  	ProductionNetwork Network = "PRODUCTION"
   101  )
   102  
   103  var (
   104  	// ErrListPolicyActivations is returned when ListPolicyActivations fails.
   105  	ErrListPolicyActivations = errors.New("list policy activations")
   106  	// ErrActivatePolicy is returned when ActivatePolicy fails.
   107  	ErrActivatePolicy = errors.New("activate policy")
   108  	// ErrDeactivatePolicy is returned when DeactivatePolicy fails.
   109  	ErrDeactivatePolicy = errors.New("deactivate policy")
   110  	// ErrGetPolicyActivation is returned when GetPolicyActivation fails.
   111  	ErrGetPolicyActivation = errors.New("get policy activation")
   112  )
   113  
   114  // Validate validates ListPolicyActivationsRequest.
   115  func (r ListPolicyActivationsRequest) Validate() error {
   116  	return edgegriderr.ParseValidationErrors(validation.Errors{
   117  		"PolicyID": validation.Validate(r.PolicyID, validation.Required),
   118  		"Page":     validation.Validate(r.Page, validation.Min(0)),
   119  		"Size":     validation.Validate(r.Size, validation.Min(10)),
   120  	})
   121  }
   122  
   123  // Validate validates GetPolicyActivationRequest.
   124  func (r GetPolicyActivationRequest) Validate() error {
   125  	return edgegriderr.ParseValidationErrors(validation.Errors{
   126  		"PolicyID":     validation.Validate(r.PolicyID, validation.Required),
   127  		"ActivationID": validation.Validate(r.ActivationID, validation.Required),
   128  	})
   129  }
   130  
   131  // Validate validates ActivatePolicyRequest.
   132  func (r ActivatePolicyRequest) Validate() error {
   133  	return edgegriderr.ParseValidationErrors(validation.Errors{
   134  		"PolicyID":      validation.Validate(r.PolicyID, validation.Required),
   135  		"PolicyVersion": validation.Validate(r.PolicyVersion, validation.Required),
   136  		"Network": validation.Validate(r.Network, validation.Required, validation.In(StagingNetwork, ProductionNetwork).Error(
   137  			fmt.Sprintf("value '%s' is invalid. Must be one of: 'STAGING' or 'PRODUCTION'", r.Network))),
   138  	})
   139  }
   140  
   141  // Validate validates DeactivatePolicyRequest.
   142  func (r DeactivatePolicyRequest) Validate() error {
   143  	return edgegriderr.ParseValidationErrors(validation.Errors{
   144  		"PolicyID":      validation.Validate(r.PolicyID, validation.Required),
   145  		"PolicyVersion": validation.Validate(r.PolicyVersion, validation.Required),
   146  		"Network": validation.Validate(r.Network, validation.Required, validation.In(StagingNetwork, ProductionNetwork).Error(
   147  			fmt.Sprintf("value '%s' is invalid. Must be one of: 'STAGING' or 'PRODUCTION'", r.Network))),
   148  	})
   149  }
   150  
   151  func (c *cloudlets) ListPolicyActivations(ctx context.Context, params ListPolicyActivationsRequest) (*PolicyActivations, error) {
   152  	c.Log(ctx).Debug("ListPolicyActivations")
   153  
   154  	if err := params.Validate(); err != nil {
   155  		return nil, fmt.Errorf("%s: %w: %s", ErrListPolicyActivations, ErrStructValidation, err)
   156  	}
   157  
   158  	uri, err := url.Parse(fmt.Sprintf("/cloudlets/v3/policies/%d/activations", params.PolicyID))
   159  	if err != nil {
   160  		return nil, fmt.Errorf("%w: failed to parse url: %s", ErrListPolicyActivations, err)
   161  	}
   162  
   163  	q := uri.Query()
   164  	if params.Size != 0 {
   165  		q.Add("size", strconv.Itoa(params.Size))
   166  	}
   167  	if params.Page != 0 {
   168  		q.Add("page", strconv.Itoa(params.Page))
   169  	}
   170  	uri.RawQuery = q.Encode()
   171  
   172  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri.String(), nil)
   173  	if err != nil {
   174  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrListPolicyActivations, err)
   175  	}
   176  
   177  	var result PolicyActivations
   178  	resp, err := c.Exec(req, &result)
   179  	if err != nil {
   180  		return nil, fmt.Errorf("%w: request failed: %s", ErrListPolicyActivations, err)
   181  	}
   182  
   183  	if resp.StatusCode != http.StatusOK {
   184  		return nil, fmt.Errorf("%s: %w", ErrListPolicyActivations, c.Error(resp))
   185  	}
   186  
   187  	return &result, nil
   188  }
   189  
   190  func (c *cloudlets) ActivatePolicy(ctx context.Context, params ActivatePolicyRequest) (*PolicyActivation, error) {
   191  	c.Log(ctx).Debug("ActivatePolicy")
   192  
   193  	if err := params.Validate(); err != nil {
   194  		return nil, fmt.Errorf("%s: %w: %s", ErrActivatePolicy, ErrStructValidation, err)
   195  	}
   196  
   197  	uri := fmt.Sprintf("/cloudlets/v3/policies/%d/activations", params.PolicyID)
   198  	req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri, nil)
   199  	if err != nil {
   200  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrActivatePolicy, err)
   201  	}
   202  
   203  	reqBody := policyActivationRequest{
   204  		Network:       params.Network,
   205  		PolicyVersion: params.PolicyVersion,
   206  		Operation:     OperationActivation,
   207  	}
   208  
   209  	var result PolicyActivation
   210  	resp, err := c.Exec(req, &result, reqBody)
   211  	if err != nil {
   212  		return nil, fmt.Errorf("%w: request failed: %s", ErrActivatePolicy, err)
   213  	}
   214  
   215  	if resp.StatusCode != http.StatusAccepted {
   216  		return nil, fmt.Errorf("%s: %w", ErrActivatePolicy, c.Error(resp))
   217  	}
   218  
   219  	return &result, nil
   220  }
   221  
   222  func (c *cloudlets) DeactivatePolicy(ctx context.Context, params DeactivatePolicyRequest) (*PolicyActivation, error) {
   223  	c.Log(ctx).Debug("DeactivatePolicy")
   224  
   225  	if err := params.Validate(); err != nil {
   226  		return nil, fmt.Errorf("%s: %w: %s", ErrDeactivatePolicy, ErrStructValidation, err)
   227  	}
   228  
   229  	uri := fmt.Sprintf("/cloudlets/v3/policies/%d/activations", params.PolicyID)
   230  	req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri, nil)
   231  	if err != nil {
   232  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrDeactivatePolicy, err)
   233  	}
   234  
   235  	reqBody := policyActivationRequest{
   236  		Network:       params.Network,
   237  		PolicyVersion: params.PolicyVersion,
   238  		Operation:     OperationDeactivation,
   239  	}
   240  
   241  	var result PolicyActivation
   242  	resp, err := c.Exec(req, &result, reqBody)
   243  	if err != nil {
   244  		return nil, fmt.Errorf("%w: request failed: %s", ErrDeactivatePolicy, err)
   245  	}
   246  
   247  	if resp.StatusCode != http.StatusAccepted {
   248  		return nil, fmt.Errorf("%s: %w", ErrDeactivatePolicy, c.Error(resp))
   249  	}
   250  
   251  	return &result, nil
   252  }
   253  
   254  func (c *cloudlets) GetPolicyActivation(ctx context.Context, params GetPolicyActivationRequest) (*PolicyActivation, error) {
   255  	c.Log(ctx).Debug("GetPolicyActivation")
   256  
   257  	if err := params.Validate(); err != nil {
   258  		return nil, fmt.Errorf("%s: %w: %s", ErrGetPolicyActivation, ErrStructValidation, err)
   259  	}
   260  
   261  	uri := fmt.Sprintf("/cloudlets/v3/policies/%d/activations/%d", params.PolicyID, params.ActivationID)
   262  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
   263  	if err != nil {
   264  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrGetPolicyActivation, err)
   265  	}
   266  
   267  	var result PolicyActivation
   268  	resp, err := c.Exec(req, &result)
   269  	if err != nil {
   270  		return nil, fmt.Errorf("%w: request failed: %s", ErrGetPolicyActivation, err)
   271  	}
   272  
   273  	if resp.StatusCode != http.StatusOK {
   274  		return nil, fmt.Errorf("%s: %w", ErrGetPolicyActivation, c.Error(resp))
   275  	}
   276  
   277  	return &result, nil
   278  }