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