From dd1f8099a63c8c76e665930063c1eff227a109f6 Mon Sep 17 00:00:00 2001 From: "ci.datadog-api-spec" Date: Tue, 2 Sep 2025 17:54:33 +0000 Subject: [PATCH] Regenerate client from commit f9eba94 of spec repo --- .generator/schemas/v2/openapi.yaml | 59 ++++ .../GetSuppressionsAffectingFutureRule.java | 62 ++++ .../GetSuppressionsAffectingRule.java | 29 ++ .../client/v2/api/SecurityMonitoringApi.java | 280 ++++++++++++++++++ ...fic_rule_returns_Not_Found_response.freeze | 1 + ...cific_rule_returns_Not_Found_response.json | 28 ++ ...a_specific_rule_returns_OK_response.freeze | 1 + ...g_a_specific_rule_returns_OK_response.json | 79 +++++ ...e_rule_returns_Bad_Request_response.freeze | 1 + ...ure_rule_returns_Bad_Request_response.json | 32 ++ ...ing_future_rule_returns_OK_response.freeze | 1 + ...cting_future_rule_returns_OK_response.json | 32 ++ .../client/v2/api/security_monitoring.feature | 29 ++ ...oring_future_rule_suppression_payload.json | 30 ++ .../com/datadog/api/client/v2/api/undo.json | 12 + 15 files changed, 676 insertions(+) create mode 100644 examples/v2/security-monitoring/GetSuppressionsAffectingFutureRule.java create mode 100644 examples/v2/security-monitoring/GetSuppressionsAffectingRule.java create mode 100644 src/test/resources/cassettes/features/v2/Get_suppressions_affecting_a_specific_rule_returns_Not_Found_response.freeze create mode 100644 src/test/resources/cassettes/features/v2/Get_suppressions_affecting_a_specific_rule_returns_Not_Found_response.json create mode 100644 src/test/resources/cassettes/features/v2/Get_suppressions_affecting_a_specific_rule_returns_OK_response.freeze create mode 100644 src/test/resources/cassettes/features/v2/Get_suppressions_affecting_a_specific_rule_returns_OK_response.json create mode 100644 src/test/resources/cassettes/features/v2/Get_suppressions_affecting_future_rule_returns_Bad_Request_response.freeze create mode 100644 src/test/resources/cassettes/features/v2/Get_suppressions_affecting_future_rule_returns_Bad_Request_response.json create mode 100644 src/test/resources/cassettes/features/v2/Get_suppressions_affecting_future_rule_returns_OK_response.freeze create mode 100644 src/test/resources/cassettes/features/v2/Get_suppressions_affecting_future_rule_returns_OK_response.json create mode 100644 src/test/resources/com/datadog/api/client/v2/api/security_monitoring_future_rule_suppression_payload.json diff --git a/.generator/schemas/v2/openapi.yaml b/.generator/schemas/v2/openapi.yaml index 4d0c4849320..5235bcb17ce 100644 --- a/.generator/schemas/v2/openapi.yaml +++ b/.generator/schemas/v2/openapi.yaml @@ -64757,6 +64757,65 @@ paths: tags: - Security Monitoring x-codegen-request-body-name: body + /api/v2/security_monitoring/configuration/suppressions/rules: + post: + description: Get the list of suppressions that would affect a rule. + operationId: GetSuppressionsAffectingFutureRule + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/SecurityMonitoringRuleCreatePayload' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/SecurityMonitoringSuppressionsResponse' + description: OK + '400': + $ref: '#/components/responses/BadRequestResponse' + '403': + $ref: '#/components/responses/NotAuthorizedResponse' + '429': + $ref: '#/components/responses/TooManyRequestsResponse' + security: + - apiKeyAuth: [] + appKeyAuth: [] + - AuthZ: + - security_monitoring_suppressions_read + summary: Get suppressions affecting future rule + tags: + - Security Monitoring + /api/v2/security_monitoring/configuration/suppressions/rules/{rule_id}: + get: + description: Get the list of suppressions that affect a specific existing rule + by its ID. + operationId: GetSuppressionsAffectingRule + parameters: + - $ref: '#/components/parameters/SecurityMonitoringRuleID' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/SecurityMonitoringSuppressionsResponse' + description: OK + '403': + $ref: '#/components/responses/NotAuthorizedResponse' + '404': + $ref: '#/components/responses/NotFoundResponse' + '429': + $ref: '#/components/responses/TooManyRequestsResponse' + security: + - apiKeyAuth: [] + appKeyAuth: [] + - AuthZ: + - security_monitoring_suppressions_read + summary: Get suppressions affecting a specific rule + tags: + - Security Monitoring /api/v2/security_monitoring/configuration/suppressions/{suppression_id}: delete: description: Delete a specific suppression rule. diff --git a/examples/v2/security-monitoring/GetSuppressionsAffectingFutureRule.java b/examples/v2/security-monitoring/GetSuppressionsAffectingFutureRule.java new file mode 100644 index 00000000000..1283502464e --- /dev/null +++ b/examples/v2/security-monitoring/GetSuppressionsAffectingFutureRule.java @@ -0,0 +1,62 @@ +// Get suppressions affecting future rule returns "OK" response + +import com.datadog.api.client.ApiClient; +import com.datadog.api.client.ApiException; +import com.datadog.api.client.v2.api.SecurityMonitoringApi; +import com.datadog.api.client.v2.model.SecurityMonitoringRuleCaseCreate; +import com.datadog.api.client.v2.model.SecurityMonitoringRuleCreatePayload; +import com.datadog.api.client.v2.model.SecurityMonitoringRuleEvaluationWindow; +import com.datadog.api.client.v2.model.SecurityMonitoringRuleKeepAlive; +import com.datadog.api.client.v2.model.SecurityMonitoringRuleMaxSignalDuration; +import com.datadog.api.client.v2.model.SecurityMonitoringRuleOptions; +import com.datadog.api.client.v2.model.SecurityMonitoringRuleQueryAggregation; +import com.datadog.api.client.v2.model.SecurityMonitoringRuleSeverity; +import com.datadog.api.client.v2.model.SecurityMonitoringRuleTypeCreate; +import com.datadog.api.client.v2.model.SecurityMonitoringStandardRuleCreatePayload; +import com.datadog.api.client.v2.model.SecurityMonitoringStandardRuleQuery; +import com.datadog.api.client.v2.model.SecurityMonitoringSuppressionsResponse; +import java.util.Collections; + +public class Example { + public static void main(String[] args) { + ApiClient defaultClient = ApiClient.getDefaultApiClient(); + SecurityMonitoringApi apiInstance = new SecurityMonitoringApi(defaultClient); + + SecurityMonitoringRuleCreatePayload body = + new SecurityMonitoringRuleCreatePayload( + new SecurityMonitoringStandardRuleCreatePayload() + .name("Example-Security-Monitoring") + .queries( + Collections.singletonList( + new SecurityMonitoringStandardRuleQuery() + .query("@test:true") + .aggregation(SecurityMonitoringRuleQueryAggregation.COUNT))) + .cases( + Collections.singletonList( + new SecurityMonitoringRuleCaseCreate() + .name("") + .status(SecurityMonitoringRuleSeverity.INFO) + .condition("a > 0"))) + .options( + new SecurityMonitoringRuleOptions() + .evaluationWindow(SecurityMonitoringRuleEvaluationWindow.FIFTEEN_MINUTES) + .keepAlive(SecurityMonitoringRuleKeepAlive.ONE_HOUR) + .maxSignalDuration(SecurityMonitoringRuleMaxSignalDuration.ONE_DAY)) + .message("Test rule") + .isEnabled(true) + .type(SecurityMonitoringRuleTypeCreate.LOG_DETECTION)); + + try { + SecurityMonitoringSuppressionsResponse result = + apiInstance.getSuppressionsAffectingFutureRule(body); + System.out.println(result); + } catch (ApiException e) { + System.err.println( + "Exception when calling SecurityMonitoringApi#getSuppressionsAffectingFutureRule"); + System.err.println("Status code: " + e.getCode()); + System.err.println("Reason: " + e.getResponseBody()); + System.err.println("Response headers: " + e.getResponseHeaders()); + e.printStackTrace(); + } + } +} diff --git a/examples/v2/security-monitoring/GetSuppressionsAffectingRule.java b/examples/v2/security-monitoring/GetSuppressionsAffectingRule.java new file mode 100644 index 00000000000..0a04732851b --- /dev/null +++ b/examples/v2/security-monitoring/GetSuppressionsAffectingRule.java @@ -0,0 +1,29 @@ +// Get suppressions affecting a specific rule returns "OK" response + +import com.datadog.api.client.ApiClient; +import com.datadog.api.client.ApiException; +import com.datadog.api.client.v2.api.SecurityMonitoringApi; +import com.datadog.api.client.v2.model.SecurityMonitoringSuppressionsResponse; + +public class Example { + public static void main(String[] args) { + ApiClient defaultClient = ApiClient.getDefaultApiClient(); + SecurityMonitoringApi apiInstance = new SecurityMonitoringApi(defaultClient); + + // there is a valid "security_rule" in the system + String SECURITY_RULE_ID = System.getenv("SECURITY_RULE_ID"); + + try { + SecurityMonitoringSuppressionsResponse result = + apiInstance.getSuppressionsAffectingRule(SECURITY_RULE_ID); + System.out.println(result); + } catch (ApiException e) { + System.err.println( + "Exception when calling SecurityMonitoringApi#getSuppressionsAffectingRule"); + System.err.println("Status code: " + e.getCode()); + System.err.println("Reason: " + e.getResponseBody()); + System.err.println("Response headers: " + e.getResponseHeaders()); + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/datadog/api/client/v2/api/SecurityMonitoringApi.java b/src/main/java/com/datadog/api/client/v2/api/SecurityMonitoringApi.java index fbcd45a3997..2e0f45d3853 100644 --- a/src/main/java/com/datadog/api/client/v2/api/SecurityMonitoringApi.java +++ b/src/main/java/com/datadog/api/client/v2/api/SecurityMonitoringApi.java @@ -5083,6 +5083,286 @@ public CompletableFuture> getSignalNotificationRulesWithHttp new GenericType() {}); } + /** + * Get suppressions affecting future rule. + * + *

See {@link #getSuppressionsAffectingFutureRuleWithHttpInfo}. + * + * @param body (required) + * @return SecurityMonitoringSuppressionsResponse + * @throws ApiException if fails to make API call + */ + public SecurityMonitoringSuppressionsResponse getSuppressionsAffectingFutureRule( + SecurityMonitoringRuleCreatePayload body) throws ApiException { + return getSuppressionsAffectingFutureRuleWithHttpInfo(body).getData(); + } + + /** + * Get suppressions affecting future rule. + * + *

See {@link #getSuppressionsAffectingFutureRuleWithHttpInfoAsync}. + * + * @param body (required) + * @return CompletableFuture<SecurityMonitoringSuppressionsResponse> + */ + public CompletableFuture + getSuppressionsAffectingFutureRuleAsync(SecurityMonitoringRuleCreatePayload body) { + return getSuppressionsAffectingFutureRuleWithHttpInfoAsync(body) + .thenApply( + response -> { + return response.getData(); + }); + } + + /** + * Get the list of suppressions that would affect a rule. + * + * @param body (required) + * @return ApiResponse<SecurityMonitoringSuppressionsResponse> + * @throws ApiException if fails to make API call + * @http.response.details + * + * + * + * + * + * + * + *
Response details
Status Code Description Response Headers
200 OK -
400 Bad Request -
403 Not Authorized -
429 Too many requests -
+ */ + public ApiResponse + getSuppressionsAffectingFutureRuleWithHttpInfo(SecurityMonitoringRuleCreatePayload body) + throws ApiException { + Object localVarPostBody = body; + + // verify the required parameter 'body' is set + if (body == null) { + throw new ApiException( + 400, + "Missing the required parameter 'body' when calling getSuppressionsAffectingFutureRule"); + } + // create path and map variables + String localVarPath = "/api/v2/security_monitoring/configuration/suppressions/rules"; + + Map localVarHeaderParams = new HashMap(); + + Invocation.Builder builder = + apiClient.createBuilder( + "v2.SecurityMonitoringApi.getSuppressionsAffectingFutureRule", + localVarPath, + new ArrayList(), + localVarHeaderParams, + new HashMap(), + new String[] {"application/json"}, + new String[] {"apiKeyAuth", "appKeyAuth", "AuthZ"}); + return apiClient.invokeAPI( + "POST", + builder, + localVarHeaderParams, + new String[] {"application/json"}, + localVarPostBody, + new HashMap(), + false, + new GenericType() {}); + } + + /** + * Get suppressions affecting future rule. + * + *

See {@link #getSuppressionsAffectingFutureRuleWithHttpInfo}. + * + * @param body (required) + * @return CompletableFuture<ApiResponse<SecurityMonitoringSuppressionsResponse>> + */ + public CompletableFuture> + getSuppressionsAffectingFutureRuleWithHttpInfoAsync( + SecurityMonitoringRuleCreatePayload body) { + Object localVarPostBody = body; + + // verify the required parameter 'body' is set + if (body == null) { + CompletableFuture> result = + new CompletableFuture<>(); + result.completeExceptionally( + new ApiException( + 400, + "Missing the required parameter 'body' when calling" + + " getSuppressionsAffectingFutureRule")); + return result; + } + // create path and map variables + String localVarPath = "/api/v2/security_monitoring/configuration/suppressions/rules"; + + Map localVarHeaderParams = new HashMap(); + + Invocation.Builder builder; + try { + builder = + apiClient.createBuilder( + "v2.SecurityMonitoringApi.getSuppressionsAffectingFutureRule", + localVarPath, + new ArrayList(), + localVarHeaderParams, + new HashMap(), + new String[] {"application/json"}, + new String[] {"apiKeyAuth", "appKeyAuth", "AuthZ"}); + } catch (ApiException ex) { + CompletableFuture> result = + new CompletableFuture<>(); + result.completeExceptionally(ex); + return result; + } + return apiClient.invokeAPIAsync( + "POST", + builder, + localVarHeaderParams, + new String[] {"application/json"}, + localVarPostBody, + new HashMap(), + false, + new GenericType() {}); + } + + /** + * Get suppressions affecting a specific rule. + * + *

See {@link #getSuppressionsAffectingRuleWithHttpInfo}. + * + * @param ruleId The ID of the rule. (required) + * @return SecurityMonitoringSuppressionsResponse + * @throws ApiException if fails to make API call + */ + public SecurityMonitoringSuppressionsResponse getSuppressionsAffectingRule(String ruleId) + throws ApiException { + return getSuppressionsAffectingRuleWithHttpInfo(ruleId).getData(); + } + + /** + * Get suppressions affecting a specific rule. + * + *

See {@link #getSuppressionsAffectingRuleWithHttpInfoAsync}. + * + * @param ruleId The ID of the rule. (required) + * @return CompletableFuture<SecurityMonitoringSuppressionsResponse> + */ + public CompletableFuture + getSuppressionsAffectingRuleAsync(String ruleId) { + return getSuppressionsAffectingRuleWithHttpInfoAsync(ruleId) + .thenApply( + response -> { + return response.getData(); + }); + } + + /** + * Get the list of suppressions that affect a specific existing rule by its ID. + * + * @param ruleId The ID of the rule. (required) + * @return ApiResponse<SecurityMonitoringSuppressionsResponse> + * @throws ApiException if fails to make API call + * @http.response.details + * + * + * + * + * + * + * + *
Response details
Status Code Description Response Headers
200 OK -
403 Not Authorized -
404 Not Found -
429 Too many requests -
+ */ + public ApiResponse + getSuppressionsAffectingRuleWithHttpInfo(String ruleId) throws ApiException { + Object localVarPostBody = null; + + // verify the required parameter 'ruleId' is set + if (ruleId == null) { + throw new ApiException( + 400, "Missing the required parameter 'ruleId' when calling getSuppressionsAffectingRule"); + } + // create path and map variables + String localVarPath = + "/api/v2/security_monitoring/configuration/suppressions/rules/{rule_id}" + .replaceAll("\\{" + "rule_id" + "\\}", apiClient.escapeString(ruleId.toString())); + + Map localVarHeaderParams = new HashMap(); + + Invocation.Builder builder = + apiClient.createBuilder( + "v2.SecurityMonitoringApi.getSuppressionsAffectingRule", + localVarPath, + new ArrayList(), + localVarHeaderParams, + new HashMap(), + new String[] {"application/json"}, + new String[] {"apiKeyAuth", "appKeyAuth", "AuthZ"}); + return apiClient.invokeAPI( + "GET", + builder, + localVarHeaderParams, + new String[] {}, + localVarPostBody, + new HashMap(), + false, + new GenericType() {}); + } + + /** + * Get suppressions affecting a specific rule. + * + *

See {@link #getSuppressionsAffectingRuleWithHttpInfo}. + * + * @param ruleId The ID of the rule. (required) + * @return CompletableFuture<ApiResponse<SecurityMonitoringSuppressionsResponse>> + */ + public CompletableFuture> + getSuppressionsAffectingRuleWithHttpInfoAsync(String ruleId) { + Object localVarPostBody = null; + + // verify the required parameter 'ruleId' is set + if (ruleId == null) { + CompletableFuture> result = + new CompletableFuture<>(); + result.completeExceptionally( + new ApiException( + 400, + "Missing the required parameter 'ruleId' when calling getSuppressionsAffectingRule")); + return result; + } + // create path and map variables + String localVarPath = + "/api/v2/security_monitoring/configuration/suppressions/rules/{rule_id}" + .replaceAll("\\{" + "rule_id" + "\\}", apiClient.escapeString(ruleId.toString())); + + Map localVarHeaderParams = new HashMap(); + + Invocation.Builder builder; + try { + builder = + apiClient.createBuilder( + "v2.SecurityMonitoringApi.getSuppressionsAffectingRule", + localVarPath, + new ArrayList(), + localVarHeaderParams, + new HashMap(), + new String[] {"application/json"}, + new String[] {"apiKeyAuth", "appKeyAuth", "AuthZ"}); + } catch (ApiException ex) { + CompletableFuture> result = + new CompletableFuture<>(); + result.completeExceptionally(ex); + return result; + } + return apiClient.invokeAPIAsync( + "GET", + builder, + localVarHeaderParams, + new String[] {}, + localVarPostBody, + new HashMap(), + false, + new GenericType() {}); + } + /** * Get details of a vulnerability notification rule. * diff --git a/src/test/resources/cassettes/features/v2/Get_suppressions_affecting_a_specific_rule_returns_Not_Found_response.freeze b/src/test/resources/cassettes/features/v2/Get_suppressions_affecting_a_specific_rule_returns_Not_Found_response.freeze new file mode 100644 index 00000000000..e815ab1ebfb --- /dev/null +++ b/src/test/resources/cassettes/features/v2/Get_suppressions_affecting_a_specific_rule_returns_Not_Found_response.freeze @@ -0,0 +1 @@ +2025-08-30T15:29:04.687Z \ No newline at end of file diff --git a/src/test/resources/cassettes/features/v2/Get_suppressions_affecting_a_specific_rule_returns_Not_Found_response.json b/src/test/resources/cassettes/features/v2/Get_suppressions_affecting_a_specific_rule_returns_Not_Found_response.json new file mode 100644 index 00000000000..9bd508d6554 --- /dev/null +++ b/src/test/resources/cassettes/features/v2/Get_suppressions_affecting_a_specific_rule_returns_Not_Found_response.json @@ -0,0 +1,28 @@ +[ + { + "httpRequest": { + "headers": {}, + "method": "GET", + "path": "/api/v2/security_monitoring/configuration/suppressions/rules/aaa-bbb-ccc-ddd", + "keepAlive": false, + "secure": true + }, + "httpResponse": { + "body": "{\"errors\":[\"not_found(Threat detection rule not found: aaa-bbb-ccc-ddd)\"]}", + "headers": { + "Content-Type": [ + "application/json" + ] + }, + "statusCode": 404, + "reasonPhrase": "Not Found" + }, + "times": { + "remainingTimes": 1 + }, + "timeToLive": { + "unlimited": true + }, + "id": "9d5ff251-844c-e2b3-c190-6442c1b68494" + } +] \ No newline at end of file diff --git a/src/test/resources/cassettes/features/v2/Get_suppressions_affecting_a_specific_rule_returns_OK_response.freeze b/src/test/resources/cassettes/features/v2/Get_suppressions_affecting_a_specific_rule_returns_OK_response.freeze new file mode 100644 index 00000000000..21a44ca0c24 --- /dev/null +++ b/src/test/resources/cassettes/features/v2/Get_suppressions_affecting_a_specific_rule_returns_OK_response.freeze @@ -0,0 +1 @@ +2025-08-30T11:40:50.061Z \ No newline at end of file diff --git a/src/test/resources/cassettes/features/v2/Get_suppressions_affecting_a_specific_rule_returns_OK_response.json b/src/test/resources/cassettes/features/v2/Get_suppressions_affecting_a_specific_rule_returns_OK_response.json new file mode 100644 index 00000000000..352710409fe --- /dev/null +++ b/src/test/resources/cassettes/features/v2/Get_suppressions_affecting_a_specific_rule_returns_OK_response.json @@ -0,0 +1,79 @@ +[ + { + "httpRequest": { + "body": { + "type": "JSON", + "json": "{\"cases\":[{\"condition\":\"a > 0\",\"name\":\"\",\"notifications\":[],\"status\":\"info\"}],\"filters\":[],\"isEnabled\":true,\"message\":\"Test rule\",\"name\":\"Test-Get_suppressions_affecting_a_specific_rule_returns_OK_response-1756554050\",\"options\":{\"evaluationWindow\":900,\"keepAlive\":3600,\"maxSignalDuration\":86400},\"queries\":[{\"aggregation\":\"count\",\"distinctFields\":[],\"groupByFields\":[],\"metrics\":[],\"query\":\"@test:true\"}],\"tags\":[],\"type\":\"log_detection\"}" + }, + "headers": {}, + "method": "POST", + "path": "/api/v2/security_monitoring/rules", + "keepAlive": false, + "secure": true + }, + "httpResponse": { + "body": "{\"name\":\"Test-Get_suppressions_affecting_a_specific_rule_returns_OK_response-1756554050\",\"createdAt\":1756554050604,\"isDefault\":false,\"isPartner\":false,\"isEnabled\":true,\"isBeta\":false,\"isDeleted\":false,\"isDeprecated\":false,\"queries\":[{\"query\":\"@test:true\",\"groupByFields\":[],\"hasOptionalGroupByFields\":false,\"distinctFields\":[],\"aggregation\":\"count\",\"name\":\"\",\"dataSource\":\"logs\"}],\"options\":{\"evaluationWindow\":900,\"detectionMethod\":\"threshold\",\"maxSignalDuration\":86400,\"keepAlive\":3600},\"cases\":[{\"name\":\"\",\"status\":\"info\",\"notifications\":[],\"condition\":\"a \\u003e 0\"}],\"message\":\"Test rule\",\"tags\":[],\"hasExtendedTitle\":false,\"type\":\"log_detection\",\"filters\":[],\"version\":1,\"id\":\"wrh-hm6-4zf\",\"blocking\":false,\"metadata\":{\"entities\":null,\"sources\":null},\"creationAuthorId\":1445416,\"creator\":{\"handle\":\"frog@datadoghq.com\",\"name\":\"frog\"},\"updater\":{\"handle\":\"\",\"name\":\"\"}}", + "headers": { + "Content-Type": [ + "application/json" + ] + }, + "statusCode": 200, + "reasonPhrase": "OK" + }, + "times": { + "remainingTimes": 1 + }, + "timeToLive": { + "unlimited": true + }, + "id": "e94c52d6-c733-3f09-07bb-9c1b2513cce2" + }, + { + "httpRequest": { + "headers": {}, + "method": "GET", + "path": "/api/v2/security_monitoring/configuration/suppressions/rules/wrh-hm6-4zf", + "keepAlive": false, + "secure": true + }, + "httpResponse": { + "body": "{\"data\":[]}", + "headers": { + "Content-Type": [ + "application/vnd.api+json" + ] + }, + "statusCode": 200, + "reasonPhrase": "OK" + }, + "times": { + "remainingTimes": 1 + }, + "timeToLive": { + "unlimited": true + }, + "id": "fc789d52-da95-d58b-5dee-10bf3c714339" + }, + { + "httpRequest": { + "headers": {}, + "method": "DELETE", + "path": "/api/v2/security_monitoring/rules/wrh-hm6-4zf", + "keepAlive": false, + "secure": true + }, + "httpResponse": { + "headers": {}, + "statusCode": 204, + "reasonPhrase": "No Content" + }, + "times": { + "remainingTimes": 1 + }, + "timeToLive": { + "unlimited": true + }, + "id": "c506ab20-ac5d-5575-66fa-ea6f521afeba" + } +] \ No newline at end of file diff --git a/src/test/resources/cassettes/features/v2/Get_suppressions_affecting_future_rule_returns_Bad_Request_response.freeze b/src/test/resources/cassettes/features/v2/Get_suppressions_affecting_future_rule_returns_Bad_Request_response.freeze new file mode 100644 index 00000000000..561d45c65be --- /dev/null +++ b/src/test/resources/cassettes/features/v2/Get_suppressions_affecting_future_rule_returns_Bad_Request_response.freeze @@ -0,0 +1 @@ +2025-08-30T15:29:48.867Z \ No newline at end of file diff --git a/src/test/resources/cassettes/features/v2/Get_suppressions_affecting_future_rule_returns_Bad_Request_response.json b/src/test/resources/cassettes/features/v2/Get_suppressions_affecting_future_rule_returns_Bad_Request_response.json new file mode 100644 index 00000000000..c93619d5597 --- /dev/null +++ b/src/test/resources/cassettes/features/v2/Get_suppressions_affecting_future_rule_returns_Bad_Request_response.json @@ -0,0 +1,32 @@ +[ + { + "httpRequest": { + "body": { + "type": "JSON", + "json": "{\"invalid_key\":\"invalid_value\"}" + }, + "headers": {}, + "method": "POST", + "path": "/api/v2/security_monitoring/configuration/suppressions/rules", + "keepAlive": false, + "secure": true + }, + "httpResponse": { + "body": "{\"errors\":[\"invalid_argument(Invalid rule configuration)\"]}", + "headers": { + "Content-Type": [ + "application/json" + ] + }, + "statusCode": 400, + "reasonPhrase": "Bad Request" + }, + "times": { + "remainingTimes": 1 + }, + "timeToLive": { + "unlimited": true + }, + "id": "fd9fc853-27a5-b780-9be4-4020c43d12db" + } +] \ No newline at end of file diff --git a/src/test/resources/cassettes/features/v2/Get_suppressions_affecting_future_rule_returns_OK_response.freeze b/src/test/resources/cassettes/features/v2/Get_suppressions_affecting_future_rule_returns_OK_response.freeze new file mode 100644 index 00000000000..0cba1f03106 --- /dev/null +++ b/src/test/resources/cassettes/features/v2/Get_suppressions_affecting_future_rule_returns_OK_response.freeze @@ -0,0 +1 @@ +2025-08-30T15:30:01.229Z \ No newline at end of file diff --git a/src/test/resources/cassettes/features/v2/Get_suppressions_affecting_future_rule_returns_OK_response.json b/src/test/resources/cassettes/features/v2/Get_suppressions_affecting_future_rule_returns_OK_response.json new file mode 100644 index 00000000000..7ddc67dd12c --- /dev/null +++ b/src/test/resources/cassettes/features/v2/Get_suppressions_affecting_future_rule_returns_OK_response.json @@ -0,0 +1,32 @@ +[ + { + "httpRequest": { + "body": { + "type": "JSON", + "json": "{\"cases\":[{\"condition\":\"a > 0\",\"name\":\"\",\"notifications\":[],\"status\":\"info\"}],\"filters\":[],\"isEnabled\":true,\"message\":\"Test rule\",\"name\":\"Test-Get_suppressions_affecting_future_rule_returns_OK_response-1756567801\",\"options\":{\"evaluationWindow\":900,\"keepAlive\":3600,\"maxSignalDuration\":86400},\"queries\":[{\"aggregation\":\"count\",\"distinctFields\":[],\"groupByFields\":[],\"metrics\":[],\"query\":\"@test:true\"}],\"tags\":[],\"type\":\"log_detection\"}" + }, + "headers": {}, + "method": "POST", + "path": "/api/v2/security_monitoring/configuration/suppressions/rules", + "keepAlive": false, + "secure": true + }, + "httpResponse": { + "body": "{\"data\":[]}", + "headers": { + "Content-Type": [ + "application/vnd.api+json" + ] + }, + "statusCode": 200, + "reasonPhrase": "OK" + }, + "times": { + "remainingTimes": 1 + }, + "timeToLive": { + "unlimited": true + }, + "id": "443d5054-9a0b-8ef9-ee88-566128ab95c2" + } +] \ No newline at end of file diff --git a/src/test/resources/com/datadog/api/client/v2/api/security_monitoring.feature b/src/test/resources/com/datadog/api/client/v2/api/security_monitoring.feature index 1ef29aec3e6..bf07efac5ff 100644 --- a/src/test/resources/com/datadog/api/client/v2/api/security_monitoring.feature +++ b/src/test/resources/com/datadog/api/client/v2/api/security_monitoring.feature @@ -822,6 +822,35 @@ Feature: Security Monitoring And the response "data.attributes.count" is equal to 1 And the response "data.attributes.data[1].rule.name" has the same value as "security_rule.name" + @team:DataDog/k9-cloud-security-platform + Scenario: Get suppressions affecting a specific rule returns "Not Found" response + Given new "GetSuppressionsAffectingRule" request + And request contains "rule_id" parameter with value "aaa-bbb-ccc-ddd" + When the request is sent + Then the response status is 404 Not Found + + @team:DataDog/k9-cloud-security-platform + Scenario: Get suppressions affecting a specific rule returns "OK" response + Given new "GetSuppressionsAffectingRule" request + And there is a valid "security_rule" in the system + And request contains "rule_id" parameter from "security_rule.id" + When the request is sent + Then the response status is 200 OK + + @team:DataDog/k9-cloud-security-platform + Scenario: Get suppressions affecting future rule returns "Bad Request" response + Given new "GetSuppressionsAffectingFutureRule" request + And body with value {"invalid_key":"invalid_value"} + When the request is sent + Then the response status is 400 Bad Request + + @team:DataDog/k9-cloud-security-platform + Scenario: Get suppressions affecting future rule returns "OK" response + Given new "GetSuppressionsAffectingFutureRule" request + And body from file "security_monitoring_future_rule_suppression_payload.json" + When the request is sent + Then the response status is 200 OK + @team:DataDog/cloud-security-posture-management Scenario: Get the list of signal-based notification rules returns "The list of notification rules." response Given there is a valid "valid_signal_notification_rule" in the system diff --git a/src/test/resources/com/datadog/api/client/v2/api/security_monitoring_future_rule_suppression_payload.json b/src/test/resources/com/datadog/api/client/v2/api/security_monitoring_future_rule_suppression_payload.json new file mode 100644 index 00000000000..b2c79709b06 --- /dev/null +++ b/src/test/resources/com/datadog/api/client/v2/api/security_monitoring_future_rule_suppression_payload.json @@ -0,0 +1,30 @@ +{ + "name": "{{ unique }}", + "queries": [ + { + "query": "@test:true", + "aggregation": "count", + "groupByFields": [], + "distinctFields": [], + "metrics": [] + } + ], + "filters": [], + "cases": [ + { + "name": "", + "status": "info", + "condition": "a > 0", + "notifications": [] + } + ], + "options": { + "evaluationWindow": 900, + "keepAlive": 3600, + "maxSignalDuration": 86400 + }, + "message": "Test rule", + "tags": [], + "isEnabled": true, + "type": "log_detection" +} diff --git a/src/test/resources/com/datadog/api/client/v2/api/undo.json b/src/test/resources/com/datadog/api/client/v2/api/undo.json index fb630772c1c..85b612d9d9c 100644 --- a/src/test/resources/com/datadog/api/client/v2/api/undo.json +++ b/src/test/resources/com/datadog/api/client/v2/api/undo.json @@ -3012,6 +3012,18 @@ "type": "unsafe" } }, + "GetSuppressionsAffectingFutureRule": { + "tag": "Security Monitoring", + "undo": { + "type": "safe" + } + }, + "GetSuppressionsAffectingRule": { + "tag": "Security Monitoring", + "undo": { + "type": "safe" + } + }, "DeleteSecurityMonitoringSuppression": { "tag": "Security Monitoring", "undo": {