github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/edgeworkers/deactivations.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  	// Deactivations is an EdgeWorkers deactivations API interface
    15  	Deactivations interface {
    16  		// ListDeactivations lists all deactivations for a given EdgeWorker ID
    17  		//
    18  		// See: https://techdocs.akamai.com/edgeworkers/reference/get-deactivations-1
    19  		ListDeactivations(context.Context, ListDeactivationsRequest) (*ListDeactivationsResponse, error)
    20  
    21  		// GetDeactivation gets details for a specific deactivation
    22  		//
    23  		// See: https://techdocs.akamai.com/edgeworkers/reference/get-deactivation-1
    24  		GetDeactivation(context.Context, GetDeactivationRequest) (*Deactivation, error)
    25  
    26  		// DeactivateVersion deactivates an existing EdgeWorker version on the akamai network
    27  		//
    28  		// See: https://techdocs.akamai.com/edgeworkers/reference/post-deactivations-1
    29  		DeactivateVersion(context.Context, DeactivateVersionRequest) (*Deactivation, error)
    30  	}
    31  
    32  	// Deactivation is the response returned by GetDeactivation, DeactivateVersion and ListDeactivation
    33  	Deactivation struct {
    34  		EdgeWorkerID     int               `json:"edgeWorkerId"`
    35  		Version          string            `json:"version"`
    36  		DeactivationID   int               `json:"deactivationId"`
    37  		AccountID        string            `json:"accountId"`
    38  		Status           string            `json:"status"`
    39  		Network          ActivationNetwork `json:"network"`
    40  		Note             string            `json:"note,omitempty"`
    41  		CreatedBy        string            `json:"createdBy"`
    42  		CreatedTime      string            `json:"createdTime"`
    43  		LastModifiedTime string            `json:"lastModifiedTime"`
    44  	}
    45  
    46  	// ListDeactivationsRequest describes the parameters for the list deactivations request
    47  	ListDeactivationsRequest struct {
    48  		EdgeWorkerID int
    49  		Version      string
    50  	}
    51  
    52  	// DeactivateVersionRequest describes the request parameters for DeactivateVersion
    53  	DeactivateVersionRequest struct {
    54  		EdgeWorkerID int
    55  		DeactivateVersion
    56  	}
    57  
    58  	// GetDeactivationRequest describes the request parameters for GetDeactivation
    59  	GetDeactivationRequest struct {
    60  		EdgeWorkerID   int
    61  		DeactivationID int
    62  	}
    63  
    64  	// DeactivateVersion represents the request body used to deactivate a version
    65  	DeactivateVersion struct {
    66  		Network ActivationNetwork `json:"network"`
    67  		Note    string            `json:"note,omitempty"`
    68  		Version string            `json:"version"`
    69  	}
    70  
    71  	// ListDeactivationsResponse describes the list deactivations response
    72  	ListDeactivationsResponse struct {
    73  		Deactivations []Deactivation `json:"deactivations"`
    74  	}
    75  )
    76  
    77  // Validate validates ListDeactivationsRequest
    78  func (r *ListDeactivationsRequest) Validate() error {
    79  	return validation.Errors{
    80  		"EdgeWorkerID": validation.Validate(r.EdgeWorkerID, validation.Required),
    81  	}.Filter()
    82  }
    83  
    84  // Validate validates DeactivateVersionRequest
    85  func (r *DeactivateVersionRequest) Validate() error {
    86  	return validation.Errors{
    87  		"EdgeWorkerID":      validation.Validate(r.EdgeWorkerID, validation.Required),
    88  		"DeactivateVersion": validation.Validate(&r.DeactivateVersion),
    89  	}.Filter()
    90  }
    91  
    92  // Validate validates DeactivateVersion
    93  func (r *DeactivateVersion) Validate() error {
    94  	return validation.Errors{
    95  		"Network": validation.Validate(r.Network, validation.Required, validation.In(
    96  			ActivationNetworkProduction, ActivationNetworkStaging,
    97  		).Error(fmt.Sprintf("value '%s' is invalid. Must be one of: '%s' or '%s'",
    98  			r.Network, ActivationNetworkStaging, ActivationNetworkProduction))),
    99  		"Version": validation.Validate(r.Version, validation.Required),
   100  	}.Filter()
   101  }
   102  
   103  // Validate validates GetDeactivationRequest
   104  func (r *GetDeactivationRequest) Validate() error {
   105  	return validation.Errors{
   106  		"EdgeWorkerID":   validation.Validate(r.EdgeWorkerID, validation.Required),
   107  		"DeactivationID": validation.Validate(r.DeactivationID, validation.Required),
   108  	}.Filter()
   109  }
   110  
   111  var (
   112  	// ErrListDeactivations is returned when ListDeactivations fails
   113  	ErrListDeactivations = errors.New("list deactivations")
   114  	// ErrDeactivateVersion is returned when DeactivateVersion fails
   115  	ErrDeactivateVersion = errors.New("deactivate version")
   116  	// ErrGetDeactivation is returned when GetDeactivation fails
   117  	ErrGetDeactivation = errors.New("get deactivation")
   118  )
   119  
   120  func (e *edgeworkers) ListDeactivations(ctx context.Context, params ListDeactivationsRequest) (*ListDeactivationsResponse, error) {
   121  	logger := e.Log(ctx)
   122  	logger.Debug("ListDeactivations")
   123  
   124  	if err := params.Validate(); err != nil {
   125  		return nil, fmt.Errorf("%s: %w: %s", ErrListDeactivations, ErrStructValidation, err.Error())
   126  	}
   127  
   128  	uri, err := url.Parse(fmt.Sprintf("/edgeworkers/v1/ids/%d/deactivations", params.EdgeWorkerID))
   129  	if err != nil {
   130  		return nil, fmt.Errorf("%w: failed to parse URL: %s", ErrListDeactivations, err.Error())
   131  	}
   132  
   133  	q := uri.Query()
   134  	if params.Version != "" {
   135  		q.Add("version", params.Version)
   136  	}
   137  	uri.RawQuery = q.Encode()
   138  
   139  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri.String(), nil)
   140  	if err != nil {
   141  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrListDeactivations, err.Error())
   142  	}
   143  
   144  	var result ListDeactivationsResponse
   145  	resp, err := e.Exec(req, &result)
   146  	if err != nil {
   147  		return nil, fmt.Errorf("%w: request failed: %s", ErrListDeactivations, err.Error())
   148  	}
   149  
   150  	if resp.StatusCode != http.StatusOK {
   151  		return nil, fmt.Errorf("%s: %w", ErrListDeactivations, e.Error(resp))
   152  	}
   153  
   154  	return &result, nil
   155  }
   156  
   157  func (e *edgeworkers) DeactivateVersion(ctx context.Context, params DeactivateVersionRequest) (*Deactivation, error) {
   158  	logger := e.Log(ctx)
   159  	logger.Debug("DeactivateVersion")
   160  
   161  	if err := params.Validate(); err != nil {
   162  		return nil, fmt.Errorf("%s: %w: %s", ErrDeactivateVersion, ErrStructValidation, err.Error())
   163  	}
   164  
   165  	uri, err := url.Parse(fmt.Sprintf("/edgeworkers/v1/ids/%d/deactivations", params.EdgeWorkerID))
   166  	if err != nil {
   167  		return nil, fmt.Errorf("%w: failed to parse URL: %s", ErrDeactivateVersion, err.Error())
   168  	}
   169  
   170  	req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri.String(), nil)
   171  	if err != nil {
   172  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrDeactivateVersion, err.Error())
   173  	}
   174  
   175  	var result Deactivation
   176  	resp, err := e.Exec(req, &result, params.DeactivateVersion)
   177  	if err != nil {
   178  		return nil, fmt.Errorf("%w: request failed: %s", ErrDeactivateVersion, err.Error())
   179  	}
   180  
   181  	if resp.StatusCode != http.StatusCreated {
   182  		return nil, fmt.Errorf("%s: %w", ErrDeactivateVersion, e.Error(resp))
   183  	}
   184  
   185  	return &result, nil
   186  }
   187  
   188  func (e *edgeworkers) GetDeactivation(ctx context.Context, params GetDeactivationRequest) (*Deactivation, error) {
   189  	logger := e.Log(ctx)
   190  	logger.Debug("GetDeactivation")
   191  
   192  	if err := params.Validate(); err != nil {
   193  		return nil, fmt.Errorf("%s: %w: %s", ErrGetDeactivation, ErrStructValidation, err.Error())
   194  	}
   195  
   196  	uri, err := url.Parse(fmt.Sprintf("/edgeworkers/v1/ids/%d/deactivations/%d", params.EdgeWorkerID, params.DeactivationID))
   197  	if err != nil {
   198  		return nil, fmt.Errorf("%w: failed to parse URL: %s", ErrGetDeactivation, err.Error())
   199  	}
   200  
   201  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri.String(), nil)
   202  
   203  	var result Deactivation
   204  	resp, err := e.Exec(req, &result)
   205  	if err != nil {
   206  		return nil, fmt.Errorf("%w: request failed: %s", ErrGetDeactivation, err.Error())
   207  	}
   208  
   209  	if resp.StatusCode != http.StatusOK {
   210  		return nil, fmt.Errorf("%s: %w", ErrGetDeactivation, e.Error(resp))
   211  	}
   212  
   213  	return &result, nil
   214  }