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 }