Skip to content

Commit 232819e

Browse files
api-clients-generation-pipeline[bot]ci.datadog-api-spec
andauthored
Security Monitoring - Validation Endpoint for Suppressions (#3322)
Co-authored-by: ci.datadog-api-spec <packages@datadoghq.com>
1 parent f2e72d9 commit 232819e

10 files changed

Lines changed: 206 additions & 0 deletions

.generator/schemas/v2/openapi.yaml

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64816,6 +64816,38 @@ paths:
6481664816
summary: Get suppressions affecting a specific rule
6481764817
tags:
6481864818
- Security Monitoring
64819+
/api/v2/security_monitoring/configuration/suppressions/validation:
64820+
post:
64821+
description: Validate a suppression rule.
64822+
operationId: ValidateSecurityMonitoringSuppression
64823+
requestBody:
64824+
content:
64825+
application/json:
64826+
schema:
64827+
$ref: '#/components/schemas/SecurityMonitoringSuppressionUpdateRequest'
64828+
required: true
64829+
responses:
64830+
'204':
64831+
description: OK
64832+
'400':
64833+
$ref: '#/components/responses/BadRequestResponse'
64834+
'403':
64835+
$ref: '#/components/responses/NotAuthorizedResponse'
64836+
'429':
64837+
$ref: '#/components/responses/TooManyRequestsResponse'
64838+
security:
64839+
- apiKeyAuth: []
64840+
appKeyAuth: []
64841+
- AuthZ:
64842+
- security_monitoring_suppressions_write
64843+
summary: Validate a suppression rule
64844+
tags:
64845+
- Security Monitoring
64846+
x-codegen-request-body-name: body
64847+
x-permission:
64848+
operator: OR
64849+
permissions:
64850+
- security_monitoring_suppressions_write
6481964851
/api/v2/security_monitoring/configuration/suppressions/{suppression_id}:
6482064852
delete:
6482164853
description: Delete a specific suppression rule.

api/datadogV2/api_security_monitoring.go

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6273,6 +6273,76 @@ func (a *SecurityMonitoringApi) ValidateSecurityMonitoringRule(ctx _context.Cont
62736273
return localVarHTTPResponse, nil
62746274
}
62756275

6276+
// ValidateSecurityMonitoringSuppression Validate a suppression rule.
6277+
// Validate a suppression rule.
6278+
func (a *SecurityMonitoringApi) ValidateSecurityMonitoringSuppression(ctx _context.Context, body SecurityMonitoringSuppressionUpdateRequest) (*_nethttp.Response, error) {
6279+
var (
6280+
localVarHTTPMethod = _nethttp.MethodPost
6281+
localVarPostBody interface{}
6282+
)
6283+
6284+
localBasePath, err := a.Client.Cfg.ServerURLWithContext(ctx, "v2.SecurityMonitoringApi.ValidateSecurityMonitoringSuppression")
6285+
if err != nil {
6286+
return nil, datadog.GenericOpenAPIError{ErrorMessage: err.Error()}
6287+
}
6288+
6289+
localVarPath := localBasePath + "/api/v2/security_monitoring/configuration/suppressions/validation"
6290+
6291+
localVarHeaderParams := make(map[string]string)
6292+
localVarQueryParams := _neturl.Values{}
6293+
localVarFormParams := _neturl.Values{}
6294+
localVarHeaderParams["Content-Type"] = "application/json"
6295+
localVarHeaderParams["Accept"] = "*/*"
6296+
6297+
// body params
6298+
localVarPostBody = &body
6299+
if a.Client.Cfg.DelegatedTokenConfig != nil {
6300+
err = datadog.UseDelegatedTokenAuth(ctx, &localVarHeaderParams, a.Client.Cfg.DelegatedTokenConfig)
6301+
if err != nil {
6302+
return nil, err
6303+
}
6304+
} else {
6305+
datadog.SetAuthKeys(
6306+
ctx,
6307+
&localVarHeaderParams,
6308+
[2]string{"apiKeyAuth", "DD-API-KEY"},
6309+
[2]string{"appKeyAuth", "DD-APPLICATION-KEY"},
6310+
)
6311+
}
6312+
req, err := a.Client.PrepareRequest(ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, nil)
6313+
if err != nil {
6314+
return nil, err
6315+
}
6316+
6317+
localVarHTTPResponse, err := a.Client.CallAPI(req)
6318+
if err != nil || localVarHTTPResponse == nil {
6319+
return localVarHTTPResponse, err
6320+
}
6321+
6322+
localVarBody, err := datadog.ReadBody(localVarHTTPResponse)
6323+
if err != nil {
6324+
return localVarHTTPResponse, err
6325+
}
6326+
6327+
if localVarHTTPResponse.StatusCode >= 300 {
6328+
newErr := datadog.GenericOpenAPIError{
6329+
ErrorBody: localVarBody,
6330+
ErrorMessage: localVarHTTPResponse.Status,
6331+
}
6332+
if localVarHTTPResponse.StatusCode == 400 || localVarHTTPResponse.StatusCode == 403 || localVarHTTPResponse.StatusCode == 429 {
6333+
var v APIErrorResponse
6334+
err = a.Client.Decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
6335+
if err != nil {
6336+
return localVarHTTPResponse, newErr
6337+
}
6338+
newErr.ErrorModel = v
6339+
}
6340+
return localVarHTTPResponse, newErr
6341+
}
6342+
6343+
return localVarHTTPResponse, nil
6344+
}
6345+
62766346
// NewSecurityMonitoringApi Returns NewSecurityMonitoringApi.
62776347
func NewSecurityMonitoringApi(client *datadog.APIClient) *SecurityMonitoringApi {
62786348
return &SecurityMonitoringApi{

api/datadogV2/doc.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,7 @@
454454
// - [SecurityMonitoringApi.UpdateSecurityMonitoringRule]
455455
// - [SecurityMonitoringApi.UpdateSecurityMonitoringSuppression]
456456
// - [SecurityMonitoringApi.ValidateSecurityMonitoringRule]
457+
// - [SecurityMonitoringApi.ValidateSecurityMonitoringSuppression]
457458
// - [SensitiveDataScannerApi.CreateScanningGroup]
458459
// - [SensitiveDataScannerApi.CreateScanningRule]
459460
// - [SensitiveDataScannerApi.DeleteScanningGroup]
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// Validate a suppression rule returns "OK" response
2+
3+
package main
4+
5+
import (
6+
"context"
7+
"fmt"
8+
"os"
9+
10+
"github.com/DataDog/datadog-api-client-go/v2/api/datadog"
11+
"github.com/DataDog/datadog-api-client-go/v2/api/datadogV2"
12+
)
13+
14+
func main() {
15+
body := datadogV2.SecurityMonitoringSuppressionUpdateRequest{
16+
Data: datadogV2.SecurityMonitoringSuppressionUpdateData{
17+
Attributes: datadogV2.SecurityMonitoringSuppressionUpdateAttributes{
18+
DataExclusionQuery: datadog.PtrString("source:cloudtrail account_id:12345"),
19+
Description: datadog.PtrString("This rule suppresses low-severity signals in staging environments."),
20+
Enabled: datadog.PtrBool(true),
21+
Name: datadog.PtrString("Custom suppression"),
22+
RuleQuery: datadog.PtrString("type:log_detection source:cloudtrail"),
23+
},
24+
Type: datadogV2.SECURITYMONITORINGSUPPRESSIONTYPE_SUPPRESSIONS,
25+
},
26+
}
27+
ctx := datadog.NewDefaultContext(context.Background())
28+
configuration := datadog.NewConfiguration()
29+
apiClient := datadog.NewAPIClient(configuration)
30+
api := datadogV2.NewSecurityMonitoringApi(apiClient)
31+
r, err := api.ValidateSecurityMonitoringSuppression(ctx, body)
32+
33+
if err != nil {
34+
fmt.Fprintf(os.Stderr, "Error when calling `SecurityMonitoringApi.ValidateSecurityMonitoringSuppression`: %v\n", err)
35+
fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r)
36+
}
37+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
2025-09-01T21:36:42.334Z
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
interactions:
2+
- request:
3+
body: |
4+
{"data":{"attributes":{"data_exclusion_query":"not enough attributes"},"type":"suppressions"}}
5+
form: {}
6+
headers:
7+
Accept:
8+
- '*/*'
9+
Content-Type:
10+
- application/json
11+
id: 0
12+
method: POST
13+
url: https://api.datadoghq.com/api/v2/security_monitoring/configuration/suppressions/validation
14+
response:
15+
body: '{"errors":["input_validation_error(Field ''data.attributes.rule_query''
16+
is invalid: field ''rule_query'' is required)","input_validation_error(Field
17+
''data.attributes.name'' is invalid: name cannot be empty)"]}'
18+
code: 400
19+
duration: 0ms
20+
headers:
21+
Content-Type:
22+
- application/json
23+
status: 400 Bad Request
24+
version: 2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
2025-09-01T21:36:20.593Z
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
interactions:
2+
- request:
3+
body: |
4+
{"data":{"attributes":{"data_exclusion_query":"source:cloudtrail account_id:12345","description":"This rule suppresses low-severity signals in staging environments.","enabled":true,"name":"Custom suppression","rule_query":"type:log_detection source:cloudtrail"},"type":"suppressions"}}
5+
form: {}
6+
headers:
7+
Accept:
8+
- '*/*'
9+
Content-Type:
10+
- application/json
11+
id: 0
12+
method: POST
13+
url: https://api.datadoghq.com/api/v2/security_monitoring/configuration/suppressions/validation
14+
response:
15+
body: ''
16+
code: 204
17+
duration: 0ms
18+
headers: {}
19+
status: 204 No Content
20+
version: 2

tests/scenarios/features/v2/security_monitoring.feature

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1389,3 +1389,17 @@ Feature: Security Monitoring
13891389
And body with value {"cases":[{"name":"","status":"info","notifications":[],"condition":"a > 0"}],"hasExtendedTitle":true,"isEnabled":true,"message":"My security monitoring rule","name":"My security monitoring rule","options":{"evaluationWindow":1800,"keepAlive":1800,"maxSignalDuration":1800,"detectionMethod":"threshold"},"queries":[{"query":"source:source_here","groupByFields":["@userIdentity.assumed_role"],"distinctFields":[],"aggregation":"count","name":""}],"tags":["env:prod","team:security"],"type":"log_detection"}
13901390
When the request is sent
13911391
Then the response status is 204 OK
1392+
1393+
@team:DataDog/k9-cloud-security-platform
1394+
Scenario: Validate a suppression rule returns "Bad Request" response
1395+
Given new "ValidateSecurityMonitoringSuppression" request
1396+
And body with value {"data": {"attributes": {"data_exclusion_query": "not enough attributes"}, "type": "suppressions"}}
1397+
When the request is sent
1398+
Then the response status is 400 Bad Request
1399+
1400+
@team:DataDog/k9-cloud-security-platform
1401+
Scenario: Validate a suppression rule returns "OK" response
1402+
Given new "ValidateSecurityMonitoringSuppression" request
1403+
And body with value {"data": {"attributes": {"data_exclusion_query": "source:cloudtrail account_id:12345", "description": "This rule suppresses low-severity signals in staging environments.", "enabled": true, "name": "Custom suppression", "rule_query": "type:log_detection source:cloudtrail"}, "type": "suppressions"}}
1404+
When the request is sent
1405+
Then the response status is 204 OK

tests/scenarios/features/v2/undo.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3024,6 +3024,12 @@
30243024
"type": "safe"
30253025
}
30263026
},
3027+
"ValidateSecurityMonitoringSuppression": {
3028+
"tag": "Security Monitoring",
3029+
"undo": {
3030+
"type": "idempotent"
3031+
}
3032+
},
30273033
"DeleteSecurityMonitoringSuppression": {
30283034
"tag": "Security Monitoring",
30293035
"undo": {

0 commit comments

Comments
 (0)