github.com/akamai/AkamaiOPEN-edgegrid-golang/v2@v2.17.0/pkg/networklists/activations.go (about) 1 package networklists 2 3 import ( 4 "context" 5 "fmt" 6 "net/http" 7 "time" 8 9 validation "github.com/go-ozzo/ozzo-validation/v4" 10 ) 11 12 type ( 13 // The Activations interface supports activating and deactivating network lists. 14 // 15 // https://developer.akamai.com/api/cloud_security/network_lists/v2.html#activationrequest 16 Activations interface { 17 // https://developer.akamai.com/api/cloud_security/network_lists/v2.html#getactivationstatus 18 GetActivations(ctx context.Context, params GetActivationsRequest) (*GetActivationsResponse, error) 19 20 // https://developer.akamai.com/api/cloud_security/network_lists/v2.html#getactivationstatus 21 GetActivation(ctx context.Context, params GetActivationRequest) (*GetActivationResponse, error) 22 23 // https://developer.akamai.com/api/cloud_security/network_lists/v2.html#postactivate 24 CreateActivations(ctx context.Context, params CreateActivationsRequest) (*CreateActivationsResponse, error) 25 26 // https://developer.akamai.com/api/cloud_security/network_lists/v2.html#postactivate 27 RemoveActivations(ctx context.Context, params RemoveActivationsRequest) (*RemoveActivationsResponse, error) 28 } 29 30 // GetActivationsRequest contains request parameters for getting activation status 31 GetActivationsRequest struct { 32 UniqueID string `json:"-"` 33 Action string `json:"-"` 34 Network string `json:"network"` 35 ActivationID int `json:"activationId"` 36 } 37 38 // GetActivationRequest contains request parameters for getting activation details 39 GetActivationRequest struct { 40 ActivationID int `json:"activationId"` 41 } 42 43 // GetActivationsResponse contains response with activation status 44 GetActivationsResponse struct { 45 ActivationID int `json:"activationId"` 46 ActivationComments string `json:"activationComments"` 47 ActivationStatus string `json:"activationStatus"` 48 SyncPoint int `json:"syncPoint"` 49 UniqueID string `json:"uniqueId"` 50 Fast bool `json:"fast"` 51 DispatchCount int `json:"dispatchCount"` 52 Links struct { 53 AppendItems struct { 54 Href string `json:"href"` 55 Method string `json:"method"` 56 } `json:"appendItems"` 57 Retrieve struct { 58 Href string `json:"href"` 59 } `json:"retrieve"` 60 StatusInProduction struct { 61 Href string `json:"href"` 62 } `json:"statusInProduction"` 63 StatusInStaging struct { 64 Href string `json:"href"` 65 } `json:"statusInStaging"` 66 SyncPointHistory struct { 67 Href string `json:"href"` 68 } `json:"syncPointHistory"` 69 Update struct { 70 Href string `json:"href"` 71 Method string `json:"method"` 72 } `json:"update"` 73 ActivationDetails struct { 74 Href string `json:"href"` 75 } `json:"activationDetails"` 76 } `json:"links"` 77 } 78 79 // GetActivationResponse contains response with activation details 80 GetActivationResponse struct { 81 ActivationID int `json:"activationId"` 82 CreateDate time.Time `json:"createDate"` 83 CreatedBy string `json:"createdBy"` 84 Environment string `json:"environment"` 85 Fast bool `json:"fast"` 86 ActivationStatus string `json:"status"` 87 NetworkList struct { 88 ActivationComments string `json:"activationComments"` 89 ActivationStatus string `json:"activationStatus"` 90 Links struct { 91 AppendItems struct { 92 Href string `json:"href"` 93 Method string `json:"method"` 94 } `json:"appendItems"` 95 Retrieve struct { 96 Href string `json:"href"` 97 } `json:"retrieve"` 98 StatusInProduction struct { 99 Href string `json:"href"` 100 } `json:"statusInProduction"` 101 StatusInStaging struct { 102 Href string `json:"href"` 103 } `json:"statusInStaging"` 104 SyncPointHistory struct { 105 Href string `json:"href"` 106 } `json:"syncPointHistory"` 107 Update struct { 108 Href string `json:"href"` 109 Method string `json:"method"` 110 } `json:"update"` 111 } `json:"links"` 112 SyncPoint int `json:"syncPoint"` 113 UniqueID string `json:"uniqueId"` 114 } `json:"networkList"` 115 } 116 117 // CreateActivationsRequest contains request parameters for creating new activation 118 CreateActivationsRequest struct { 119 UniqueID string `json:"-"` 120 Action string `json:"-"` 121 Network string `json:"network"` 122 Comments string `json:"comments"` 123 NotificationRecipients []string `json:"notificationRecipients"` 124 } 125 126 // CreateActivationsResponse contains response after creating new activation 127 CreateActivationsResponse struct { 128 ActivationID int `json:"activationId"` 129 ActivationComments string `json:"activationComments"` 130 ActivationStatus string `json:"activationStatus"` 131 SyncPoint int `json:"syncPoint"` 132 UniqueID string `json:"uniqueId"` 133 Fast bool `json:"fast"` 134 DispatchCount int `json:"dispatchCount"` 135 Links struct { 136 AppendItems struct { 137 Href string `json:"href"` 138 Method string `json:"method"` 139 } `json:"appendItems"` 140 Retrieve struct { 141 Href string `json:"href"` 142 } `json:"retrieve"` 143 StatusInProduction struct { 144 Href string `json:"href"` 145 } `json:"statusInProduction"` 146 StatusInStaging struct { 147 Href string `json:"href"` 148 } `json:"statusInStaging"` 149 SyncPointHistory struct { 150 Href string `json:"href"` 151 } `json:"syncPointHistory"` 152 Update struct { 153 Href string `json:"href"` 154 Method string `json:"method"` 155 } `json:"update"` 156 ActivationDetails struct { 157 Href string `json:"href"` 158 } `json:"activationDetails"` 159 } `json:"links"` 160 } 161 162 // RemoveActivationsRequest contains request parameters of Activation to deactivate 163 RemoveActivationsRequest struct { 164 UniqueID string `json:"-"` 165 ActivationID int `json:"-"` 166 Action string `json:"action"` 167 Network string `json:"network"` 168 Comments string `json:"comments"` 169 NotificationRecipients []string `json:"notificationRecipients"` 170 } 171 172 // RemoveActivationsResponse contains response of Activation deactivation 173 RemoveActivationsResponse struct { 174 ActivationID int `json:"activationId"` 175 ActivationComments string `json:"activationComments"` 176 ActivationStatus string `json:"activationStatus"` 177 SyncPoint int `json:"syncPoint"` 178 UniqueID string `json:"uniqueId"` 179 Fast bool `json:"fast"` 180 DispatchCount int `json:"dispatchCount"` 181 Links struct { 182 AppendItems struct { 183 Href string `json:"href"` 184 Method string `json:"method"` 185 } `json:"appendItems"` 186 Retrieve struct { 187 Href string `json:"href"` 188 } `json:"retrieve"` 189 StatusInProduction struct { 190 Href string `json:"href"` 191 } `json:"statusInProduction"` 192 StatusInStaging struct { 193 Href string `json:"href"` 194 } `json:"statusInStaging"` 195 SyncPointHistory struct { 196 Href string `json:"href"` 197 } `json:"syncPointHistory"` 198 Update struct { 199 Href string `json:"href"` 200 Method string `json:"method"` 201 } `json:"update"` 202 ActivationDetails struct { 203 Href string `json:"href"` 204 } `json:"activationDetails"` 205 } `json:"links"` 206 } 207 208 // ActivationValue is used to create an "enum" of possible Activation.ActivationType values 209 ActivationValue string 210 211 // NetworkValue is used to create an "enum" of possible Activation.Network values 212 NetworkValue string 213 214 // StatusValue is used to create an "enum" of possible Activation.Status values 215 StatusValue string 216 ) 217 218 const ( 219 // ActivationTypeActivate Activation.ActivationType value ACTIVATE 220 ActivationTypeActivate ActivationValue = "ACTIVATE" 221 // ActivationTypeDeactivate Activation.ActivationType value DEACTIVATE 222 ActivationTypeDeactivate ActivationValue = "DEACTIVATE" 223 224 // NetworkProduction Activation.Network value PRODUCTION 225 NetworkProduction NetworkValue = "PRODUCTION" 226 // NetworkStaging Activation.Network value STAGING 227 NetworkStaging NetworkValue = "STAGING" 228 229 // StatusActive Activation.Status value ACTIVE 230 StatusActive StatusValue = "ACTIVATED" 231 // StatusInactive Activation.Status value INACTIVE 232 StatusInactive StatusValue = "INACTIVE" 233 // StatusPending Activation.Status value RECEIVED 234 StatusPending StatusValue = "RECEIVED" 235 // StatusAborted Activation.Status value ABORTED 236 StatusAborted StatusValue = "ABORTED" 237 // StatusFailed Activation.Status value FAILED 238 StatusFailed StatusValue = "FAILED" 239 // StatusDeactivated Activation.Status value DEACTIVATED 240 StatusDeactivated StatusValue = "DEACTIVATED" 241 // StatusPendingDeactivation Activation.Status value PENDING_DEACTIVATION 242 StatusPendingDeactivation StatusValue = "PENDING_DEACTIVATION" 243 // StatusNew Activation.Status value NEW 244 StatusNew StatusValue = "NEW" 245 ) 246 247 // Validate validates GetActivationsRequest 248 func (v GetActivationsRequest) Validate() error { 249 return validation.Errors{ 250 "UniqueID": validation.Validate(v.UniqueID, validation.Required), 251 }.Filter() 252 } 253 254 // Validate validates GetActivationRequest 255 func (v GetActivationRequest) Validate() error { 256 return validation.Errors{ 257 "ActivationID": validation.Validate(v.ActivationID, validation.Required), 258 }.Filter() 259 } 260 261 // GetActivations populates *Activations with it's related Activations 262 // 263 // API Docs: // appsec v1 264 // 265 // https://developer.akamai.com/api/cloud_security/application_security/v1.html 266 func (p *networklists) GetActivations(ctx context.Context, params GetActivationsRequest) (*GetActivationsResponse, error) { 267 if err := params.Validate(); err != nil { 268 return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 269 } 270 271 logger := p.Log(ctx) 272 logger.Debug("GetActivations") 273 274 var rval GetActivationsResponse 275 276 uri := fmt.Sprintf("/network-list/v2/network-lists/%s/environments/%s/status", 277 params.UniqueID, 278 params.Network, 279 ) 280 281 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil) 282 if err != nil { 283 return nil, fmt.Errorf("failed to create getactivations request: %s", err.Error()) 284 } 285 286 resp, err := p.Exec(req, &rval) 287 if err != nil { 288 return nil, fmt.Errorf("getactivations request failed: %s", err.Error()) 289 } 290 291 if resp.StatusCode != http.StatusOK { 292 return nil, p.Error(resp) 293 } 294 295 return &rval, nil 296 } 297 298 // GetActivation populates *Activation with it's related Activations 299 // 300 // API Docs: // appsec v1 301 // 302 // https://developer.akamai.com/api/cloud_security/application_security/v1.html 303 func (p *networklists) GetActivation(ctx context.Context, params GetActivationRequest) (*GetActivationResponse, error) { 304 if err := params.Validate(); err != nil { 305 return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 306 } 307 308 logger := p.Log(ctx) 309 logger.Debug("GetActivation") 310 311 var rval GetActivationResponse 312 313 uri := fmt.Sprintf("/network-list/v2/activations/%d", 314 params.ActivationID, 315 ) 316 317 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil) 318 if err != nil { 319 return nil, fmt.Errorf("failed to create getactivation request: %s", err.Error()) 320 } 321 322 resp, err := p.Exec(req, &rval) 323 if err != nil { 324 return nil, fmt.Errorf("getactivation request failed: %s", err.Error()) 325 } 326 327 if resp.StatusCode != http.StatusOK { 328 return nil, p.Error(resp) 329 } 330 331 return &rval, nil 332 } 333 334 // Save activates a given Configuration 335 // 336 // If acknowledgeWarnings is true and warnings are returned on the first attempt, 337 // a second attempt is made, acknowledging the warnings. 338 // 339 func (p *networklists) CreateActivations(ctx context.Context, params CreateActivationsRequest) (*CreateActivationsResponse, error) { 340 341 logger := p.Log(ctx) 342 logger.Debug("CreateActivations") 343 344 uri := fmt.Sprintf("/network-list/v2/network-lists/%s/environments/%s/activate", 345 params.UniqueID, 346 params.Network, 347 ) 348 349 req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri, nil) 350 if err != nil { 351 return nil, fmt.Errorf("failed to create create activation request: %s", err.Error()) 352 } 353 354 var rval CreateActivationsResponse 355 356 resp, err := p.Exec(req, &rval, params) 357 if err != nil { 358 return nil, fmt.Errorf("create activation request failed: %s", err.Error()) 359 } 360 361 var rvalget CreateActivationsResponse 362 363 uriget := fmt.Sprintf("/network-list/v2/network-lists/%s/environments/%s/status", 364 params.UniqueID, 365 params.Network, 366 ) 367 368 req, err = http.NewRequestWithContext(ctx, http.MethodGet, uriget, nil) 369 if err != nil { 370 return nil, fmt.Errorf("failed to get activation request: %s", err.Error()) 371 } 372 373 resp, err = p.Exec(req, &rvalget) 374 if err != nil { 375 return nil, fmt.Errorf("get activation request failed: %s", err.Error()) 376 } 377 378 if resp.StatusCode != http.StatusOK { 379 return nil, p.Error(resp) 380 } 381 382 return &rvalget, nil 383 384 } 385 386 // Delete will delete a Activations 387 // 388 // 389 // API Docs: // appsec v1 390 // 391 // https://developer.akamai.com/api/cloud_security/application_security/v1.html#deleteactivations 392 func (p *networklists) RemoveActivations(ctx context.Context, params RemoveActivationsRequest) (*RemoveActivationsResponse, error) { 393 394 logger := p.Log(ctx) 395 logger.Debug("RemoveActivations") 396 397 uri := fmt.Sprintf("/network-list/v2/network-lists/%s/environments/%s/deactivate", 398 params.UniqueID, 399 params.Network, 400 ) 401 req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri, nil) 402 if err != nil { 403 return nil, fmt.Errorf("failed to create remove activation request: %s", err.Error()) 404 } 405 406 var rval RemoveActivationsResponse 407 408 _, err = p.Exec(req, &rval, params) 409 if err != nil { 410 return nil, fmt.Errorf("remove activation request failed: %s", err.Error()) 411 } 412 413 return &rval, nil 414 }