github.com/akamai/AkamaiOPEN-edgegrid-golang/v2@v2.17.0/pkg/appsec/activations.go (about) 1 package appsec 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 the activation and deactivation of security configurations. 14 // 15 // https://developer.akamai.com/api/cloud_security/application_security/v1.html#activation 16 Activations interface { 17 // GetActivations returns the status of an activation. 18 // https://developer.akamai.com/api/cloud_security/application_security/v1.html#getactivationid 19 GetActivations(ctx context.Context, params GetActivationsRequest) (*GetActivationsResponse, error) 20 21 // GetActivationHistory lists the activation history for a configuration. 22 // https://techdocs.akamai.com/application-security/reference/get-activation-history 23 GetActivationHistory(ctx context.Context, params GetActivationHistoryRequest) (*GetActivationHistoryResponse, error) 24 25 // CreateActivations activates a configuration. If acknowledgeWarnings is true and warnings are 26 // returned on the first attempt, a second attempt is made acknowledging the warnings. 27 // https://developer.akamai.com/api/cloud_security/application_security/v1.html#postactivations 28 CreateActivations(ctx context.Context, params CreateActivationsRequest, acknowledgeWarnings bool) (*CreateActivationsResponse, error) 29 30 // RemoveActivations deactivates a configuration. 31 // https://developer.akamai.com/api/cloud_security/application_security/v1.html#postactivations 32 RemoveActivations(ctx context.Context, params RemoveActivationsRequest) (*RemoveActivationsResponse, error) 33 } 34 35 // GetActivationsRequest is used to request the status of an activation request. 36 GetActivationsRequest struct { 37 ActivationID int `json:"activationId"` 38 } 39 40 // GetActivationsResponse is returned from a call to GetActivations. 41 GetActivationsResponse struct { 42 DispatchCount int `json:"dispatchCount"` 43 ActivationID int `json:"activationId"` 44 Action string `json:"action"` 45 Status StatusValue `json:"status"` 46 Network NetworkValue `json:"network"` 47 Estimate string `json:"estimate"` 48 CreatedBy string `json:"createdBy"` 49 CreateDate time.Time `json:"createDate"` 50 ActivationConfigs []struct { 51 ConfigID int `json:"configId"` 52 ConfigName string `json:"configName"` 53 ConfigVersion int `json:"configVersion"` 54 PreviousConfigVersion int `json:"previousConfigVersion"` 55 } `json:"activationConfigs"` 56 } 57 58 // GetActivationHistoryRequest is used to request the activation history for a configuration. 59 GetActivationHistoryRequest struct { 60 ConfigID int `json:"configId"` 61 } 62 63 // GetActivationHistoryResponse lists the activation history for a configuration. 64 GetActivationHistoryResponse struct { 65 ConfigID int `json:"configId"` 66 ActivationHistory []Activation `json:"activationHistory,omitempty"` 67 } 68 69 // Activation represents the status of a configuration activation. 70 Activation struct { 71 ActivationID int `json:"activationId"` 72 Version int `json:"version"` 73 Status string `json:"status"` 74 Network string `json:"Network"` 75 ActivatedBy string `json:"activatedBy"` 76 ActivationDate time.Time `json:"activationDate"` 77 Notes string `json:"notes"` 78 NotificationEmails []string `json:"notificationEmails"` 79 } 80 81 // CreateActivationsRequest is used to request activation or deactivation of a configuration. 82 CreateActivationsRequest struct { 83 Action string `json:"action"` 84 Network string `json:"network"` 85 Note string `json:"note"` 86 NotificationEmails []string `json:"notificationEmails"` 87 ActivationConfigs []struct { 88 ConfigID int `json:"configId"` 89 ConfigVersion int `json:"configVersion"` 90 } `json:"activationConfigs"` 91 } 92 93 // CreateActivationsResponse is returned from a call to CreateActivations. 94 CreateActivationsResponse struct { 95 DispatchCount int `json:"dispatchCount"` 96 ActivationID int `json:"activationId"` 97 Action string `json:"action"` 98 Status StatusValue `json:"status"` 99 Network NetworkValue `json:"network"` 100 Estimate string `json:"estimate"` 101 CreatedBy string `json:"createdBy"` 102 CreateDate time.Time `json:"createDate"` 103 ActivationConfigs []struct { 104 ConfigID int `json:"configId"` 105 ConfigName string `json:"configName"` 106 ConfigVersion int `json:"configVersion"` 107 PreviousConfigVersion int `json:"previousConfigVersion"` 108 } `json:"activationConfigs"` 109 } 110 111 // ActivationConfigs describes a specific configuration version to be activated or deactivated. 112 ActivationConfigs struct { 113 ConfigID int `json:"configId"` 114 ConfigVersion int `json:"configVersion"` 115 } 116 117 // RemoveActivationsRequest is used to request deactivation of one or more configurations. 118 RemoveActivationsRequest struct { 119 ActivationID int `json:"-"` 120 Action string `json:"action"` 121 Network string `json:"network"` 122 Note string `json:"note"` 123 NotificationEmails []string `json:"notificationEmails"` 124 ActivationConfigs []struct { 125 ConfigID int `json:"configId"` 126 ConfigVersion int `json:"configVersion"` 127 } `json:"activationConfigs"` 128 } 129 130 // RemoveActivationsResponse is returned from a call to RemoveActivations. 131 RemoveActivationsResponse struct { 132 DispatchCount int `json:"dispatchCount"` 133 ActivationID int `json:"activationId"` 134 Action string `json:"action"` 135 Status StatusValue `json:"status"` 136 Network NetworkValue `json:"network"` 137 Estimate string `json:"estimate"` 138 CreatedBy string `json:"createdBy"` 139 CreateDate time.Time `json:"createDate"` 140 ActivationConfigs []struct { 141 ConfigID int `json:"configId"` 142 ConfigName string `json:"configName"` 143 ConfigVersion int `json:"configVersion"` 144 PreviousConfigVersion int `json:"previousConfigVersion"` 145 } `json:"activationConfigs"` 146 } 147 ) 148 149 // Validate validates a GetActivationsRequest. 150 func (v GetActivationsRequest) Validate() error { 151 return validation.Errors{ 152 "activationid": validation.Validate(v.ActivationID, validation.Required), 153 }.Filter() 154 } 155 156 // Validate validates a GetActivationHistoryRequest. 157 func (v GetActivationHistoryRequest) Validate() error { 158 return validation.Errors{ 159 "configId": validation.Validate(v.ConfigID, validation.Required), 160 }.Filter() 161 } 162 163 func (p *appsec) GetActivations(ctx context.Context, params GetActivationsRequest) (*GetActivationsResponse, error) { 164 logger := p.Log(ctx) 165 logger.Debug("GetActivations") 166 167 if err := params.Validate(); err != nil { 168 return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 169 } 170 171 uri := fmt.Sprintf( 172 "/appsec/v1/activations/%d", 173 params.ActivationID) 174 175 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil) 176 if err != nil { 177 return nil, fmt.Errorf("failed to create GetActivations request: %w", err) 178 } 179 180 var result GetActivationsResponse 181 resp, errp := p.Exec(req, &result) 182 if errp != nil { 183 return nil, fmt.Errorf("get activations request failed: %w", errp) 184 } 185 186 if resp.StatusCode != http.StatusOK { 187 return nil, p.Error(resp) 188 } 189 190 return &result, nil 191 } 192 193 func (p *appsec) GetActivationHistory(ctx context.Context, params GetActivationHistoryRequest) (*GetActivationHistoryResponse, error) { 194 logger := p.Log(ctx) 195 logger.Debug("GetActivationHistory") 196 197 if err := params.Validate(); err != nil { 198 return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 199 } 200 201 uri := fmt.Sprintf( 202 "/appsec/v1/configs/%d/activations", 203 params.ConfigID) 204 205 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil) 206 if err != nil { 207 return nil, fmt.Errorf("failed to create GetActivationHistory request: %w", err) 208 } 209 210 var result GetActivationHistoryResponse 211 resp, err := p.Exec(req, &result) 212 if err != nil { 213 return nil, fmt.Errorf("get activation history request failed: %w", err) 214 } 215 216 if resp.StatusCode != http.StatusOK { 217 return nil, p.Error(resp) 218 } 219 220 return &result, nil 221 } 222 223 func (p *appsec) CreateActivations(ctx context.Context, params CreateActivationsRequest, _ bool) (*CreateActivationsResponse, error) { 224 logger := p.Log(ctx) 225 logger.Debug("CreateActivations") 226 227 uri := "/appsec/v1/activations" 228 229 req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri, nil) 230 if err != nil { 231 return nil, fmt.Errorf("failed to create CreateActivations request: %w", err) 232 } 233 234 var result CreateActivationsResponse 235 resp, err := p.Exec(req, &result, params) 236 if err != nil { 237 return nil, fmt.Errorf("create activations request failed: %w", err) 238 } 239 if resp.StatusCode != http.StatusOK { 240 return nil, p.Error(resp) 241 } 242 243 uriget := fmt.Sprintf( 244 "/appsec/v1/activations/%d", 245 result.ActivationID, 246 ) 247 248 req, err = http.NewRequestWithContext(ctx, http.MethodGet, uriget, nil) 249 if err != nil { 250 return nil, fmt.Errorf("failed to create GetActivation request: %w", err) 251 } 252 253 resp, err = p.Exec(req, &result) 254 if err != nil { 255 return nil, fmt.Errorf("get activation request failed: %w", err) 256 } 257 if resp.StatusCode != http.StatusOK { 258 return nil, p.Error(resp) 259 } 260 261 return &result, nil 262 } 263 264 func (p *appsec) RemoveActivations(ctx context.Context, params RemoveActivationsRequest) (*RemoveActivationsResponse, error) { 265 logger := p.Log(ctx) 266 logger.Debug("RemoveActivations") 267 268 uri := "/appsec/v1/activations" 269 270 req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri, nil) 271 if err != nil { 272 return nil, fmt.Errorf("failed to create RemoveActivations request: %w", err) 273 } 274 275 var result RemoveActivationsResponse 276 resp, errp := p.Exec(req, &result, params) 277 if errp != nil { 278 return nil, fmt.Errorf("remove activations request failed: %w", errp) 279 } 280 if resp.StatusCode != http.StatusOK { 281 return nil, p.Error(resp) 282 } 283 284 return &result, nil 285 } 286 287 // ActivationValue is used to create an "enum" of possible Activation.ActivationType values 288 type ActivationValue string 289 290 // NetworkValue is used to create an "enum" of possible Activation.Network values 291 type NetworkValue string 292 293 // StatusValue is used to create an "enum" of possible Activation.Status values 294 type StatusValue string 295 296 const ( 297 298 // ActivationTypeActivate is used to activate a configuration. 299 ActivationTypeActivate ActivationValue = "ACTIVATE" 300 301 // ActivationTypeDeactivate is used to deactivate a configuration. 302 ActivationTypeDeactivate ActivationValue = "DEACTIVATE" 303 304 // NetworkProduction is used to activate/deactivate a configuration in the production network. 305 NetworkProduction NetworkValue = "PRODUCTION" 306 307 // NetworkStaging is used to activate/deactivate a configuration in the staging network. 308 NetworkStaging NetworkValue = "STAGING" 309 310 // StatusActive indicates that a configuration has been activated. 311 StatusActive StatusValue = "ACTIVATED" 312 313 // StatusInactive indicates that a configuration is inactive. 314 StatusInactive StatusValue = "INACTIVE" 315 316 // StatusPending indicates that an activation/deactivation request has been received. 317 StatusPending StatusValue = "RECEIVED" 318 319 // StatusAborted indicates that an activation/deactivation request has been aborted. 320 StatusAborted StatusValue = "ABORTED" 321 322 // StatusFailed indicates that an activation/deactivation request has failed. 323 StatusFailed StatusValue = "FAILED" 324 325 // StatusDeactivated indicates that an configuration has been deactivated. 326 StatusDeactivated StatusValue = "DEACTIVATED" 327 328 // StatusPendingDeactivation indicates that a deactivation request is in progress. 329 StatusPendingDeactivation StatusValue = "PENDING_DEACTIVATION" 330 331 // StatusNew indicates that a deactivation request is new. 332 StatusNew StatusValue = "NEW" 333 )