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

     1  package edgeworkers
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"fmt"
     7  	"net/http"
     8  	"net/url"
     9  
    10  	validation "github.com/go-ozzo/ozzo-validation/v4"
    11  )
    12  
    13  type (
    14  	// Activations is an edgeworkers activations API interface
    15  	Activations interface {
    16  		// ListActivations lists all activations for an EdgeWorker
    17  		//
    18  		// See: https://techdocs.akamai.com/edgeworkers/reference/get-activations-1
    19  		ListActivations(context.Context, ListActivationsRequest) (*ListActivationsResponse, error)
    20  
    21  		// GetActivation fetches an EdgeWorker activation by id
    22  		//
    23  		// See: https://techdocs.akamai.com/edgeworkers/reference/get-activation-1
    24  		GetActivation(context.Context, GetActivationRequest) (*Activation, error)
    25  
    26  		// ActivateVersion activates an EdgeWorker version on a given network
    27  		//
    28  		// See: https://techdocs.akamai.com/edgeworkers/reference/post-activations-1
    29  		ActivateVersion(context.Context, ActivateVersionRequest) (*Activation, error)
    30  
    31  		// CancelPendingActivation cancels pending activation with a given id
    32  		//
    33  		// See: https://techdocs.akamai.com/edgeworkers/reference/cancel-activation
    34  		CancelPendingActivation(context.Context, CancelActivationRequest) (*Activation, error)
    35  	}
    36  
    37  	// ListActivationsRequest contains parameters used to list activations
    38  	ListActivationsRequest struct {
    39  		EdgeWorkerID int
    40  		Version      string
    41  	}
    42  
    43  	// ActivateVersionRequest contains path parameters and request body used to activate an edge worker
    44  	ActivateVersionRequest struct {
    45  		EdgeWorkerID int
    46  		ActivateVersion
    47  	}
    48  
    49  	// ActivateVersion represents the request body used to activate a version
    50  	ActivateVersion struct {
    51  		Network ActivationNetwork `json:"network"`
    52  		Version string            `json:"version"`
    53  		Note    string            `json:"note,omitempty"`
    54  	}
    55  
    56  	// ActivationNetwork represents available activation network types
    57  	ActivationNetwork string
    58  
    59  	// GetActivationRequest contains path parameters used to fetch edge worker activation
    60  	GetActivationRequest struct {
    61  		EdgeWorkerID int
    62  		ActivationID int
    63  	}
    64  
    65  	// ListActivationsResponse represents a response object returned when listing activations
    66  	ListActivationsResponse struct {
    67  		Activations []Activation `json:"activations"`
    68  	}
    69  
    70  	// CancelActivationRequest contains path parameters used to cancel edge worker activation
    71  	CancelActivationRequest struct {
    72  		EdgeWorkerID int
    73  		ActivationID int
    74  	}
    75  
    76  	// Activation represents an activation object
    77  	Activation struct {
    78  		AccountID        string `json:"accountId"`
    79  		ActivationID     int    `json:"activationId"`
    80  		CreatedBy        string `json:"createdBy"`
    81  		CreatedTime      string `json:"createdTime"`
    82  		EdgeWorkerID     int    `json:"edgeWorkerId"`
    83  		LastModifiedTime string `json:"lastModifiedTime"`
    84  		Network          string `json:"network"`
    85  		Status           string `json:"status"`
    86  		Version          string `json:"version"`
    87  		Note             string `json:"note"`
    88  	}
    89  )
    90  
    91  const (
    92  	// ActivationNetworkStaging is the staging network
    93  	ActivationNetworkStaging ActivationNetwork = "STAGING"
    94  
    95  	// ActivationNetworkProduction is the production network
    96  	ActivationNetworkProduction ActivationNetwork = "PRODUCTION"
    97  )
    98  
    99  // Validate validates ListActivationsRequest
   100  func (r ListActivationsRequest) Validate() error {
   101  	return validation.Errors{
   102  		"EdgeWorkerID": validation.Validate(r.EdgeWorkerID, validation.Required),
   103  	}.Filter()
   104  }
   105  
   106  // Validate validates GetActivationRequest
   107  func (r GetActivationRequest) Validate() error {
   108  	return validation.Errors{
   109  		"EdgeWorkerID": validation.Validate(r.EdgeWorkerID, validation.Required),
   110  		"ActivationID": validation.Validate(r.ActivationID, validation.Required),
   111  	}.Filter()
   112  }
   113  
   114  // Validate validates ActivateVersionRequest
   115  func (r ActivateVersionRequest) Validate() error {
   116  	return validation.Errors{
   117  		"EdgeWorkerID":    validation.Validate(r.EdgeWorkerID, validation.Required),
   118  		"ActivateVersion": validation.Validate(&r.ActivateVersion, validation.Required),
   119  	}.Filter()
   120  }
   121  
   122  // Validate validates ActivateVersion
   123  func (r ActivateVersion) Validate() error {
   124  	return validation.Errors{
   125  		"Network": validation.Validate(r.Network, validation.Required, validation.In(ActivationNetworkStaging, ActivationNetworkProduction).Error(
   126  			fmt.Sprintf("value '%s' is invalid. Must be one of: '%s' or '%s'", r.Network, ActivationNetworkStaging, ActivationNetworkProduction))),
   127  		"Version": validation.Validate(r.Version, validation.Required),
   128  	}.Filter()
   129  }
   130  
   131  // Validate validates CancelActivationRequest
   132  func (r CancelActivationRequest) Validate() error {
   133  	return validation.Errors{
   134  		"EdgeWorkerID": validation.Validate(r.EdgeWorkerID, validation.Required),
   135  		"ActivationID": validation.Validate(r.ActivationID, validation.Required),
   136  	}.Filter()
   137  }
   138  
   139  var (
   140  	// ErrListActivations is returned when ListActivations fails
   141  	ErrListActivations = errors.New("list activations")
   142  	// ErrGetActivation is returned when GetActivation fails
   143  	ErrGetActivation = errors.New("get activation")
   144  	// ErrActivateVersion is returned when ActivateVersion fails
   145  	ErrActivateVersion = errors.New("activate version")
   146  	// ErrCancelActivation is returned when CancelPendingActivation fails
   147  	ErrCancelActivation = errors.New("cancel activation")
   148  )
   149  
   150  func (e edgeworkers) ListActivations(ctx context.Context, params ListActivationsRequest) (*ListActivationsResponse, error) {
   151  	logger := e.Log(ctx)
   152  	logger.Debug("ListActivations")
   153  
   154  	if err := params.Validate(); err != nil {
   155  		return nil, fmt.Errorf("%s: %w: %s", ErrListActivations, ErrStructValidation, err)
   156  	}
   157  
   158  	uri, err := url.Parse(fmt.Sprintf("/edgeworkers/v1/ids/%d/activations", params.EdgeWorkerID))
   159  	if err != nil {
   160  		return nil, fmt.Errorf("%w: failed to parse url: %s", ErrListActivations, err)
   161  	}
   162  
   163  	q := uri.Query()
   164  	if params.Version != "" {
   165  		q.Add("version", params.Version)
   166  	}
   167  	uri.RawQuery = q.Encode()
   168  
   169  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri.String(), nil)
   170  	if err != nil {
   171  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrListActivations, err)
   172  	}
   173  
   174  	var result ListActivationsResponse
   175  	resp, err := e.Exec(req, &result)
   176  	if err != nil {
   177  		return nil, fmt.Errorf("%w: request failed: %s", ErrListActivations, err)
   178  	}
   179  
   180  	if resp.StatusCode != http.StatusOK {
   181  		return nil, fmt.Errorf("%s: %w", ErrListActivations, e.Error(resp))
   182  	}
   183  
   184  	return &result, nil
   185  }
   186  
   187  func (e edgeworkers) GetActivation(ctx context.Context, params GetActivationRequest) (*Activation, error) {
   188  	logger := e.Log(ctx)
   189  	logger.Debug("GetActivation")
   190  
   191  	if err := params.Validate(); err != nil {
   192  		return nil, fmt.Errorf("%s: %w: %s", ErrGetActivation, ErrStructValidation, err)
   193  	}
   194  
   195  	uri := fmt.Sprintf("/edgeworkers/v1/ids/%d/activations/%d", params.EdgeWorkerID, params.ActivationID)
   196  
   197  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
   198  	if err != nil {
   199  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrGetActivation, err)
   200  	}
   201  
   202  	var result Activation
   203  	resp, err := e.Exec(req, &result)
   204  	if err != nil {
   205  		return nil, fmt.Errorf("%w: request failed: %s", ErrGetActivation, err)
   206  	}
   207  
   208  	if resp.StatusCode != http.StatusOK {
   209  		return nil, fmt.Errorf("%s: %w", ErrGetActivation, e.Error(resp))
   210  	}
   211  
   212  	return &result, nil
   213  }
   214  
   215  func (e edgeworkers) ActivateVersion(ctx context.Context, params ActivateVersionRequest) (*Activation, error) {
   216  	logger := e.Log(ctx)
   217  	logger.Debug("ActivateVersion")
   218  
   219  	if err := params.Validate(); err != nil {
   220  		return nil, fmt.Errorf("%s: %w: %s", ErrActivateVersion, ErrStructValidation, err)
   221  	}
   222  
   223  	uri := fmt.Sprintf("/edgeworkers/v1/ids/%d/activations", params.EdgeWorkerID)
   224  
   225  	req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri, nil)
   226  	if err != nil {
   227  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrActivateVersion, err)
   228  	}
   229  
   230  	var result Activation
   231  
   232  	resp, err := e.Exec(req, &result, params.ActivateVersion)
   233  	if err != nil {
   234  		return nil, fmt.Errorf("%w: request failed: %s", ErrActivateVersion, err)
   235  	}
   236  
   237  	if resp.StatusCode != http.StatusCreated {
   238  		return nil, fmt.Errorf("%s: %w", ErrActivateVersion, e.Error(resp))
   239  	}
   240  
   241  	return &result, nil
   242  }
   243  
   244  func (e edgeworkers) CancelPendingActivation(ctx context.Context, params CancelActivationRequest) (*Activation, error) {
   245  	logger := e.Log(ctx)
   246  	logger.Debug("CancelPendingActivation")
   247  
   248  	if err := params.Validate(); err != nil {
   249  		return nil, fmt.Errorf("%s: %w: %s", ErrCancelActivation, ErrStructValidation, err)
   250  	}
   251  
   252  	uri := fmt.Sprintf("/edgeworkers/v1/ids/%d/activations/%d", params.EdgeWorkerID, params.ActivationID)
   253  
   254  	req, err := http.NewRequestWithContext(ctx, http.MethodDelete, uri, nil)
   255  	if err != nil {
   256  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrCancelActivation, err)
   257  	}
   258  
   259  	var result Activation
   260  
   261  	resp, err := e.Exec(req, &result)
   262  	if err != nil {
   263  		return nil, fmt.Errorf("%w: request failed: %s", ErrCancelActivation, err)
   264  	}
   265  
   266  	if resp.StatusCode != http.StatusOK {
   267  		return nil, fmt.Errorf("%s: %w", ErrCancelActivation, e.Error(resp))
   268  	}
   269  
   270  	return &result, nil
   271  }