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 }