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 }