github.com/akamai/AkamaiOPEN-edgegrid-golang/v2@v2.17.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/activations#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-link/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/activations#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/activations#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  	}
    54  
    55  	// ActivationNetwork represents available activation network types
    56  	ActivationNetwork string
    57  
    58  	// GetActivationRequest contains path parameters used to fetch edge worker activation
    59  	GetActivationRequest struct {
    60  		EdgeWorkerID int
    61  		ActivationID int
    62  	}
    63  
    64  	// ListActivationsResponse represents a response object returned when listing activations
    65  	ListActivationsResponse struct {
    66  		Activations []Activation `json:"activations"`
    67  	}
    68  
    69  	// CancelActivationRequest contains path parameters used to cancel edge worker activation
    70  	CancelActivationRequest struct {
    71  		EdgeWorkerID int
    72  		ActivationID int
    73  	}
    74  
    75  	// Activation represents an activation object
    76  	Activation struct {
    77  		AccountID        string `json:"accountId"`
    78  		ActivationID     int    `json:"activationId"`
    79  		CreatedBy        string `json:"createdBy"`
    80  		CreatedTime      string `json:"createdTime"`
    81  		EdgeWorkerID     int    `json:"edgeWorkerId"`
    82  		LastModifiedTime string `json:"lastModifiedTime"`
    83  		Network          string `json:"network"`
    84  		Status           string `json:"status"`
    85  		Version          string `json:"version"`
    86  	}
    87  )
    88  
    89  const (
    90  	// ActivationNetworkStaging is the staging network
    91  	ActivationNetworkStaging ActivationNetwork = "STAGING"
    92  
    93  	// ActivationNetworkProduction is the production network
    94  	ActivationNetworkProduction ActivationNetwork = "PRODUCTION"
    95  )
    96  
    97  // Validate validates ListActivationsRequest
    98  func (r ListActivationsRequest) Validate() error {
    99  	return validation.Errors{
   100  		"EdgeWorkerID": validation.Validate(r.EdgeWorkerID, validation.Required),
   101  	}.Filter()
   102  }
   103  
   104  // Validate validates GetActivationRequest
   105  func (r GetActivationRequest) Validate() error {
   106  	return validation.Errors{
   107  		"EdgeWorkerID": validation.Validate(r.EdgeWorkerID, validation.Required),
   108  		"ActivationID": validation.Validate(r.ActivationID, validation.Required),
   109  	}.Filter()
   110  }
   111  
   112  // Validate validates ActivateVersionRequest
   113  func (r ActivateVersionRequest) Validate() error {
   114  	return validation.Errors{
   115  		"EdgeWorkerID":    validation.Validate(r.EdgeWorkerID, validation.Required),
   116  		"ActivateVersion": validation.Validate(&r.ActivateVersion, validation.Required),
   117  	}.Filter()
   118  }
   119  
   120  // Validate validates ActivateVersion
   121  func (r ActivateVersion) Validate() error {
   122  	return validation.Errors{
   123  		"Network": validation.Validate(r.Network, validation.Required, validation.In(ActivationNetworkStaging, ActivationNetworkProduction).Error(
   124  			fmt.Sprintf("value '%s' is invalid. Must be one of: '%s' or '%s'", r.Network, ActivationNetworkStaging, ActivationNetworkProduction))),
   125  		"Version": validation.Validate(r.Version, validation.Required),
   126  	}.Filter()
   127  }
   128  
   129  // Validate validates CancelActivationRequest
   130  func (r CancelActivationRequest) Validate() error {
   131  	return validation.Errors{
   132  		"EdgeWorkerID": validation.Validate(r.EdgeWorkerID, validation.Required),
   133  		"ActivationID": validation.Validate(r.ActivationID, validation.Required),
   134  	}.Filter()
   135  }
   136  
   137  var (
   138  	// ErrListActivations is returned when ListActivations fails
   139  	ErrListActivations = errors.New("list activations")
   140  	// ErrGetActivation is returned when GetActivation fails
   141  	ErrGetActivation = errors.New("get activation")
   142  	// ErrActivateVersion is returned when ActivateVersion fails
   143  	ErrActivateVersion = errors.New("activate version")
   144  	// ErrCancelActivation is returned when CancelPendingActivation fails
   145  	ErrCancelActivation = errors.New("cancel activation")
   146  )
   147  
   148  func (e edgeworkers) ListActivations(ctx context.Context, params ListActivationsRequest) (*ListActivationsResponse, error) {
   149  	logger := e.Log(ctx)
   150  	logger.Debug("ListActivations")
   151  
   152  	if err := params.Validate(); err != nil {
   153  		return nil, fmt.Errorf("%s: %w: %s", ErrListActivations, ErrStructValidation, err)
   154  	}
   155  
   156  	uri, err := url.Parse(fmt.Sprintf("/edgeworkers/v1/ids/%d/activations", params.EdgeWorkerID))
   157  	if err != nil {
   158  		return nil, fmt.Errorf("%w: failed to parse url: %s", ErrListActivations, err)
   159  	}
   160  
   161  	q := uri.Query()
   162  	if params.Version != "" {
   163  		q.Add("version", params.Version)
   164  	}
   165  	uri.RawQuery = q.Encode()
   166  
   167  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri.String(), nil)
   168  	if err != nil {
   169  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrListActivations, err)
   170  	}
   171  
   172  	var result ListActivationsResponse
   173  	resp, err := e.Exec(req, &result)
   174  	if err != nil {
   175  		return nil, fmt.Errorf("%w: request failed: %s", ErrListActivations, err)
   176  	}
   177  
   178  	if resp.StatusCode != http.StatusOK {
   179  		return nil, fmt.Errorf("%s: %w", ErrListActivations, e.Error(resp))
   180  	}
   181  
   182  	return &result, nil
   183  }
   184  
   185  func (e edgeworkers) GetActivation(ctx context.Context, params GetActivationRequest) (*Activation, error) {
   186  	logger := e.Log(ctx)
   187  	logger.Debug("GetActivation")
   188  
   189  	if err := params.Validate(); err != nil {
   190  		return nil, fmt.Errorf("%s: %w: %s", ErrGetActivation, ErrStructValidation, err)
   191  	}
   192  
   193  	uri := fmt.Sprintf("/edgeworkers/v1/ids/%d/activations/%d", params.EdgeWorkerID, params.ActivationID)
   194  
   195  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
   196  	if err != nil {
   197  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrGetActivation, err)
   198  	}
   199  
   200  	var result Activation
   201  	resp, err := e.Exec(req, &result)
   202  	if err != nil {
   203  		return nil, fmt.Errorf("%w: request failed: %s", ErrGetActivation, err)
   204  	}
   205  
   206  	if resp.StatusCode != http.StatusOK {
   207  		return nil, fmt.Errorf("%s: %w", ErrGetActivation, e.Error(resp))
   208  	}
   209  
   210  	return &result, nil
   211  }
   212  
   213  func (e edgeworkers) ActivateVersion(ctx context.Context, params ActivateVersionRequest) (*Activation, error) {
   214  	logger := e.Log(ctx)
   215  	logger.Debug("ActivateVersion")
   216  
   217  	if err := params.Validate(); err != nil {
   218  		return nil, fmt.Errorf("%s: %w: %s", ErrActivateVersion, ErrStructValidation, err)
   219  	}
   220  
   221  	uri := fmt.Sprintf("/edgeworkers/v1/ids/%d/activations", params.EdgeWorkerID)
   222  
   223  	req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri, nil)
   224  	if err != nil {
   225  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrActivateVersion, err)
   226  	}
   227  
   228  	var result Activation
   229  
   230  	resp, err := e.Exec(req, &result, params.ActivateVersion)
   231  	if err != nil {
   232  		return nil, fmt.Errorf("%w: request failed: %s", ErrActivateVersion, err)
   233  	}
   234  
   235  	if resp.StatusCode != http.StatusCreated {
   236  		return nil, fmt.Errorf("%s: %w", ErrActivateVersion, e.Error(resp))
   237  	}
   238  
   239  	return &result, nil
   240  }
   241  
   242  func (e edgeworkers) CancelPendingActivation(ctx context.Context, params CancelActivationRequest) (*Activation, error) {
   243  	logger := e.Log(ctx)
   244  	logger.Debug("CancelPendingActivation")
   245  
   246  	if err := params.Validate(); err != nil {
   247  		return nil, fmt.Errorf("%s: %w: %s", ErrCancelActivation, ErrStructValidation, err)
   248  	}
   249  
   250  	uri := fmt.Sprintf("/edgeworkers/v1/ids/%d/activations/%d", params.EdgeWorkerID, params.ActivationID)
   251  
   252  	req, err := http.NewRequestWithContext(ctx, http.MethodDelete, uri, nil)
   253  	if err != nil {
   254  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrCancelActivation, err)
   255  	}
   256  
   257  	var result Activation
   258  
   259  	resp, err := e.Exec(req, &result)
   260  	if err != nil {
   261  		return nil, fmt.Errorf("%w: request failed: %s", ErrCancelActivation, err)
   262  	}
   263  
   264  	if resp.StatusCode != http.StatusOK {
   265  		return nil, fmt.Errorf("%s: %w", ErrCancelActivation, e.Error(resp))
   266  	}
   267  
   268  	return &result, nil
   269  }