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

     1  package edgeworkers
     2  
     3  import (
     4  	"bytes"
     5  	"context"
     6  	"errors"
     7  	"fmt"
     8  	"io"
     9  	"io/ioutil"
    10  	"net/http"
    11  
    12  	validation "github.com/go-ozzo/ozzo-validation/v4"
    13  )
    14  
    15  type (
    16  	// EdgeWorkerVersions is EdgeWorker Version API interface
    17  	EdgeWorkerVersions interface {
    18  		// GetEdgeWorkerVersion gets details for a specific EdgeWorkerVersion
    19  		//
    20  		// See: https://techdocs.akamai.com/edgeworkers/reference/get-version
    21  		GetEdgeWorkerVersion(context.Context, GetEdgeWorkerVersionRequest) (*EdgeWorkerVersion, error)
    22  
    23  		// ListEdgeWorkerVersions lists EdgeWorkerVersions in the identified group
    24  		//
    25  		// See: https://techdocs.akamai.com/edgeworkers/reference/get-versions
    26  		ListEdgeWorkerVersions(context.Context, ListEdgeWorkerVersionsRequest) (*ListEdgeWorkerVersionsResponse, error)
    27  
    28  		// GetEdgeWorkerVersionContent gets content bundle for a specific EdgeWorkerVersion
    29  		//
    30  		// See: https://techdocs.akamai.com/edgeworkers/reference/get-version-content
    31  		GetEdgeWorkerVersionContent(context.Context, GetEdgeWorkerVersionContentRequest) (*Bundle, error)
    32  
    33  		// CreateEdgeWorkerVersion creates a new EdgeWorkerVersion
    34  		//
    35  		// See: https://techdocs.akamai.com/edgeworkers/reference/post-versions
    36  		CreateEdgeWorkerVersion(context.Context, CreateEdgeWorkerVersionRequest) (*EdgeWorkerVersion, error)
    37  
    38  		// DeleteEdgeWorkerVersion deletes an EdgeWorkerVersion
    39  		//
    40  		// See: https://techdocs.akamai.com/edgeworkers/reference/delete-version
    41  		DeleteEdgeWorkerVersion(context.Context, DeleteEdgeWorkerVersionRequest) error
    42  	}
    43  
    44  	// GetEdgeWorkerVersionRequest contains parameters used to get an EdgeWorkerVersion
    45  	GetEdgeWorkerVersionRequest EdgeWorkerVersionRequest
    46  
    47  	// EdgeWorkerVersion represents an EdgeWorkerVersion object
    48  	EdgeWorkerVersion struct {
    49  		EdgeWorkerID   int    `json:"edgeWorkerId"`
    50  		Version        string `json:"version"`
    51  		AccountID      string `json:"accountId"`
    52  		Checksum       string `json:"checksum"`
    53  		SequenceNumber int    `json:"sequenceNumber"`
    54  		CreatedBy      string `json:"createdBy"`
    55  		CreatedTime    string `json:"createdTime"`
    56  	}
    57  
    58  	// ListEdgeWorkerVersionsRequest contains query parameters used to list EdgeWorkerVersions
    59  	ListEdgeWorkerVersionsRequest struct {
    60  		EdgeWorkerID int
    61  	}
    62  
    63  	// ListEdgeWorkerVersionsResponse represents a response object returned by ListEdgeWorkerVersions
    64  	ListEdgeWorkerVersionsResponse struct {
    65  		EdgeWorkerVersions []EdgeWorkerVersion `json:"versions"`
    66  	}
    67  
    68  	// GetEdgeWorkerVersionContentRequest contains parameters used to get content bundle of an EdgeWorkerVersion
    69  	GetEdgeWorkerVersionContentRequest EdgeWorkerVersionRequest
    70  
    71  	// CreateEdgeWorkerVersionRequest contains parameters used to create EdgeWorkerVersion
    72  	CreateEdgeWorkerVersionRequest struct {
    73  		EdgeWorkerID  int
    74  		ContentBundle Bundle
    75  	}
    76  
    77  	// DeleteEdgeWorkerVersionRequest contains parameters used to delete an EdgeWorkerVersion
    78  	DeleteEdgeWorkerVersionRequest EdgeWorkerVersionRequest
    79  
    80  	// EdgeWorkerVersionRequest contains request parameters used by GetEdgeWorkerVersion, GetEdgeWorkerVersionContent and DeleteEdgeWorkerVersion
    81  	EdgeWorkerVersionRequest struct {
    82  		EdgeWorkerID int
    83  		Version      string
    84  	}
    85  
    86  	// Bundle is the type for content bundle of an Edgeworker Version
    87  	Bundle struct {
    88  		io.Reader
    89  	}
    90  )
    91  
    92  // Validate validates GetEdgeWorkerVersionRequest
    93  func (g GetEdgeWorkerVersionRequest) Validate() error {
    94  	return validation.Errors{
    95  		"EdgeWorkerID": validation.Validate(g.EdgeWorkerID, validation.Required),
    96  		"Version":      validation.Validate(g.Version, validation.Required),
    97  	}.Filter()
    98  }
    99  
   100  // Validate validates ListEdgeWorkerVersionsRequest
   101  func (g ListEdgeWorkerVersionsRequest) Validate() error {
   102  	return validation.Errors{
   103  		"EdgeWorkerID": validation.Validate(g.EdgeWorkerID, validation.Required),
   104  	}.Filter()
   105  }
   106  
   107  // Validate validates CreateEdgeWorkerVersionRequest
   108  func (g CreateEdgeWorkerVersionRequest) Validate() error {
   109  	return validation.Errors{
   110  		"EdgeWorkerID":  validation.Validate(g.EdgeWorkerID, validation.Required),
   111  		"ContentBundle": validation.Validate(g.ContentBundle.Reader, validation.Required),
   112  	}.Filter()
   113  }
   114  
   115  // Validate validates GetEdgeWorkerVersionContentRequest
   116  func (g GetEdgeWorkerVersionContentRequest) Validate() error {
   117  	return validation.Errors{
   118  		"EdgeWorkerID": validation.Validate(g.EdgeWorkerID, validation.Required),
   119  		"Version":      validation.Validate(g.Version, validation.Required),
   120  	}.Filter()
   121  }
   122  
   123  // Validate validates DeleteEdgeWorkerVersionRequest
   124  func (g DeleteEdgeWorkerVersionRequest) Validate() error {
   125  	return validation.Errors{
   126  		"EdgeWorkerID": validation.Validate(g.EdgeWorkerID, validation.Required),
   127  		"Version":      validation.Validate(g.Version, validation.Required),
   128  	}.Filter()
   129  }
   130  
   131  var (
   132  	// ErrGetEdgeWorkerVersion is returned in case an error occurs on GetEdgeWorkerVersion operation
   133  	ErrGetEdgeWorkerVersion = errors.New("get an EdgeWorker Version")
   134  	// ErrListEdgeWorkerVersions is returned in case an error occurs on ListEdgeWorkerVersions operation
   135  	ErrListEdgeWorkerVersions = errors.New("list EdgeWorkers Versions")
   136  	// ErrGetEdgeWorkerVersionContent is returned in case an error occurs on GetEdgeWorkerVersionContent operation
   137  	ErrGetEdgeWorkerVersionContent = errors.New("get an EdgeWorker Version Content Bundle")
   138  	// ErrCreateEdgeWorkerVersion is returned in case an error occurs on CreateEdgeWorkerVersion operation
   139  	ErrCreateEdgeWorkerVersion = errors.New("create an EdgeWorker Version")
   140  	// ErrDeleteEdgeWorkerVersion is returned in case an error occurs on DeleteEdgeWorkerVersion operation
   141  	ErrDeleteEdgeWorkerVersion = errors.New("delete an EdgeWorker Version")
   142  )
   143  
   144  func (e *edgeworkers) GetEdgeWorkerVersion(ctx context.Context, params GetEdgeWorkerVersionRequest) (*EdgeWorkerVersion, error) {
   145  	logger := e.Log(ctx)
   146  	logger.Debug("GetEdgeWorkerVersion")
   147  
   148  	if err := params.Validate(); err != nil {
   149  		return nil, fmt.Errorf("%s: %w: %s", ErrGetEdgeWorkerVersion, ErrStructValidation, err)
   150  	}
   151  
   152  	uri := fmt.Sprintf("/edgeworkers/v1/ids/%d/versions/%s", params.EdgeWorkerID, params.Version)
   153  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
   154  	if err != nil {
   155  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrGetEdgeWorkerVersion, err)
   156  	}
   157  
   158  	var result EdgeWorkerVersion
   159  	resp, err := e.Exec(req, &result)
   160  	if err != nil {
   161  		return nil, fmt.Errorf("%w: request failed: %s", ErrGetEdgeWorkerVersion, err)
   162  	}
   163  
   164  	if resp.StatusCode != http.StatusOK {
   165  		return nil, fmt.Errorf("%s: %w", ErrGetEdgeWorkerVersion, e.Error(resp))
   166  	}
   167  
   168  	return &result, nil
   169  }
   170  
   171  func (e *edgeworkers) ListEdgeWorkerVersions(ctx context.Context, params ListEdgeWorkerVersionsRequest) (*ListEdgeWorkerVersionsResponse, error) {
   172  	logger := e.Log(ctx)
   173  	logger.Debug("ListEdgeWorkerVersions")
   174  
   175  	if err := params.Validate(); err != nil {
   176  		return nil, fmt.Errorf("%s: %w: %s", ErrListEdgeWorkerVersions, ErrStructValidation, err)
   177  	}
   178  
   179  	uri := fmt.Sprintf("/edgeworkers/v1/ids/%d/versions", params.EdgeWorkerID)
   180  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
   181  	if err != nil {
   182  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrListEdgeWorkerVersions, err)
   183  	}
   184  
   185  	var result ListEdgeWorkerVersionsResponse
   186  	resp, err := e.Exec(req, &result)
   187  	if err != nil {
   188  		return nil, fmt.Errorf("%w: request failed: %s", ErrListEdgeWorkerVersions, err)
   189  	}
   190  
   191  	if resp.StatusCode != http.StatusOK {
   192  		return nil, fmt.Errorf("%s: %w", ErrListEdgeWorkerVersions, e.Error(resp))
   193  	}
   194  
   195  	return &result, nil
   196  }
   197  
   198  func (e *edgeworkers) GetEdgeWorkerVersionContent(ctx context.Context, params GetEdgeWorkerVersionContentRequest) (*Bundle, error) {
   199  	logger := e.Log(ctx)
   200  	logger.Debug("GetEdgeWorkerVersionContent")
   201  
   202  	if err := params.Validate(); err != nil {
   203  		return nil, fmt.Errorf("%s: %w: %s", ErrGetEdgeWorkerVersionContent, ErrStructValidation, err)
   204  	}
   205  
   206  	uri := fmt.Sprintf("/edgeworkers/v1/ids/%d/versions/%s/content", params.EdgeWorkerID, params.Version)
   207  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
   208  	if err != nil {
   209  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrGetEdgeWorkerVersionContent, err)
   210  	}
   211  
   212  	req.Header.Add("Accept", "application/gzip")
   213  	resp, err := e.Exec(req, nil)
   214  	if err != nil {
   215  		return nil, fmt.Errorf("%w: request failed: %s", ErrGetEdgeWorkerVersionContent, err)
   216  	}
   217  
   218  	var result Bundle
   219  	data, err := ioutil.ReadAll(resp.Body)
   220  	result.Reader = bytes.NewBuffer(data)
   221  	if err != nil {
   222  		return nil, fmt.Errorf("%w: failed to read response body: %s", ErrGetEdgeWorkerVersionContent, err)
   223  	}
   224  
   225  	resp.Body = ioutil.NopCloser(bytes.NewBuffer(data))
   226  	if resp.StatusCode != http.StatusOK {
   227  		return nil, fmt.Errorf("%s: %w", ErrGetEdgeWorkerVersionContent, e.Error(resp))
   228  	}
   229  
   230  	return &result, nil
   231  }
   232  
   233  func (e *edgeworkers) CreateEdgeWorkerVersion(ctx context.Context, params CreateEdgeWorkerVersionRequest) (*EdgeWorkerVersion, error) {
   234  	logger := e.Log(ctx)
   235  	logger.Debug("CreateEdgeWorkerVersion")
   236  
   237  	if err := params.Validate(); err != nil {
   238  		return nil, fmt.Errorf("%s: %w:\n%s", ErrCreateEdgeWorkerVersion, ErrStructValidation, err)
   239  	}
   240  
   241  	uri := fmt.Sprintf("/edgeworkers/v1/ids/%d/versions", params.EdgeWorkerID)
   242  	req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri, ioutil.NopCloser(params.ContentBundle))
   243  	if err != nil {
   244  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrCreateEdgeWorkerVersion, err)
   245  	}
   246  
   247  	req.Header.Add("Content-Type", "application/gzip")
   248  	var result EdgeWorkerVersion
   249  	resp, err := e.Exec(req, &result)
   250  	if err != nil {
   251  		return nil, fmt.Errorf("%w: request failed: %s", ErrCreateEdgeWorkerVersion, err)
   252  	}
   253  
   254  	if resp.StatusCode != http.StatusCreated {
   255  		return nil, fmt.Errorf("%s: %w", ErrCreateEdgeWorkerVersion, e.Error(resp))
   256  	}
   257  
   258  	return &result, nil
   259  }
   260  
   261  func (e *edgeworkers) DeleteEdgeWorkerVersion(ctx context.Context, params DeleteEdgeWorkerVersionRequest) error {
   262  	e.Log(ctx).Debug("DeleteEdgeWorkerVersion")
   263  
   264  	if err := params.Validate(); err != nil {
   265  		return fmt.Errorf("%s: %w:\n%s", ErrDeleteEdgeWorkerVersion, ErrStructValidation, err)
   266  	}
   267  
   268  	uri := fmt.Sprintf("/edgeworkers/v1/ids/%d/versions/%s", params.EdgeWorkerID, params.Version)
   269  	req, err := http.NewRequestWithContext(ctx, http.MethodDelete, uri, nil)
   270  	if err != nil {
   271  		return fmt.Errorf("%w: failed to create request: %s", ErrDeleteEdgeWorkerVersion, err)
   272  	}
   273  
   274  	resp, err := e.Exec(req, nil)
   275  	if err != nil {
   276  		return fmt.Errorf("%w: request failed: %s", ErrDeleteEdgeWorkerVersion, err)
   277  	}
   278  
   279  	if resp.StatusCode != http.StatusNoContent {
   280  		return fmt.Errorf("%s: %w", ErrDeleteEdgeWorkerVersion, e.Error(resp))
   281  	}
   282  
   283  	return nil
   284  }