diff --git a/.generated-info b/.generated-info index 2f92126afb..c0aee112f2 100644 --- a/.generated-info +++ b/.generated-info @@ -1,4 +1,4 @@ { - "spec_repo_commit": "c3e3e39", - "generated": "2025-08-13 13:35:59.473" + "spec_repo_commit": "8001cbb", + "generated": "2025-08-13 20:27:33.480" } diff --git a/examples/v2/security-monitoring/ConvertExistingSecurityMonitoringRule.py b/examples/v2/security-monitoring/ConvertExistingSecurityMonitoringRule.py index d204c627bc..6e682bee83 100644 --- a/examples/v2/security-monitoring/ConvertExistingSecurityMonitoringRule.py +++ b/examples/v2/security-monitoring/ConvertExistingSecurityMonitoringRule.py @@ -6,14 +6,14 @@ from datadog_api_client import ApiClient, Configuration from datadog_api_client.v2.api.security_monitoring_api import SecurityMonitoringApi -# there is a valid "security_rule" in the system -SECURITY_RULE_ID = environ["SECURITY_RULE_ID"] +# there is a valid "security_rule_hash" in the system +SECURITY_RULE_HASH_ID = environ["SECURITY_RULE_HASH_ID"] configuration = Configuration() with ApiClient(configuration) as api_client: api_instance = SecurityMonitoringApi(api_client) response = api_instance.convert_existing_security_monitoring_rule( - rule_id=SECURITY_RULE_ID, + rule_id=SECURITY_RULE_HASH_ID, ) print(response) diff --git a/examples/v2/security-monitoring/ConvertSecurityMonitoringRuleFromJSONToTerraform.py b/examples/v2/security-monitoring/ConvertSecurityMonitoringRuleFromJSONToTerraform.py index ad4f91cd03..1681694168 100644 --- a/examples/v2/security-monitoring/ConvertSecurityMonitoringRuleFromJSONToTerraform.py +++ b/examples/v2/security-monitoring/ConvertSecurityMonitoringRuleFromJSONToTerraform.py @@ -22,7 +22,7 @@ from datadog_api_client.v2.model.security_monitoring_standard_rule_query import SecurityMonitoringStandardRuleQuery body = SecurityMonitoringStandardRulePayload( - name="Example-Security-Monitoring", + name="_49768568946de993", queries=[ SecurityMonitoringStandardRuleQuery( query="@test:true", diff --git a/tests/v2/cassettes/test_scenarios/test_convert_a_rule_from_json_to_terraform_returns_ok_response.frozen b/tests/v2/cassettes/test_scenarios/test_convert_a_rule_from_json_to_terraform_returns_ok_response.frozen index e80ec51462..8f630e980f 100644 --- a/tests/v2/cassettes/test_scenarios/test_convert_a_rule_from_json_to_terraform_returns_ok_response.frozen +++ b/tests/v2/cassettes/test_scenarios/test_convert_a_rule_from_json_to_terraform_returns_ok_response.frozen @@ -1 +1 @@ -2025-04-24T11:34:50.866Z \ No newline at end of file +2025-08-13T20:13:44.192Z \ No newline at end of file diff --git a/tests/v2/cassettes/test_scenarios/test_convert_a_rule_from_json_to_terraform_returns_ok_response.yaml b/tests/v2/cassettes/test_scenarios/test_convert_a_rule_from_json_to_terraform_returns_ok_response.yaml index 370b35aed2..f045470111 100644 --- a/tests/v2/cassettes/test_scenarios/test_convert_a_rule_from_json_to_terraform_returns_ok_response.yaml +++ b/tests/v2/cassettes/test_scenarios/test_convert_a_rule_from_json_to_terraform_returns_ok_response.yaml @@ -1,7 +1,7 @@ interactions: - request: body: '{"cases":[{"condition":"a > 0","name":"","notifications":[],"status":"info"}],"filters":[],"isEnabled":true,"message":"Test - rule","name":"Test-Convert_a_rule_from_JSON_to_Terraform_returns_OK_response-1745494490","options":{"evaluationWindow":900,"keepAlive":3600,"maxSignalDuration":86400},"queries":[{"aggregation":"count","distinctFields":[],"groupByFields":[],"metric":"","query":"@test:true"}],"tags":[],"type":"log_detection"}' + rule","name":"_b87eac89722bbff0","options":{"evaluationWindow":900,"keepAlive":3600,"maxSignalDuration":86400},"queries":[{"aggregation":"count","distinctFields":[],"groupByFields":[],"metric":"","query":"@test:true"}],"tags":[],"type":"log_detection"}' headers: accept: - application/json @@ -12,9 +12,8 @@ interactions: response: body: string: '{"terraformContent":"resource \"datadog_security_monitoring_rule\" - \"test-convert_a_rule_from_json_to_terraform_returns_ok_response-1745494490\" - {\n\tname = \"Test-Convert_a_rule_from_JSON_to_Terraform_returns_OK_response-1745494490\"\n\tenabled - = true\n\tquery {\n\t\tquery = \"@test:true\"\n\t\tgroup_by_fields = []\n\t\tdistinct_fields + \"_b87eac89722bbff0\" {\n\tname = \"_b87eac89722bbff0\"\n\tenabled = true\n\tquery + {\n\t\tquery = \"@test:true\"\n\t\tgroup_by_fields = []\n\t\tdistinct_fields = []\n\t\taggregation = \"count\"\n\t\tname = \"\"\n\t\tdata_source = \"logs\"\n\t}\n\toptions {\n\t\tkeep_alive = 3600\n\t\tmax_signal_duration = 86400\n\t\tdetection_method = \"threshold\"\n\t\tevaluation_window = 900\n\t}\n\tcase {\n\t\tname = \"\"\n\t\tstatus diff --git a/tests/v2/cassettes/test_scenarios/test_convert_an_existing_rule_from_json_to_terraform_returns_ok_response.frozen b/tests/v2/cassettes/test_scenarios/test_convert_an_existing_rule_from_json_to_terraform_returns_ok_response.frozen index cb7f9eae20..82a36934d8 100644 --- a/tests/v2/cassettes/test_scenarios/test_convert_an_existing_rule_from_json_to_terraform_returns_ok_response.frozen +++ b/tests/v2/cassettes/test_scenarios/test_convert_an_existing_rule_from_json_to_terraform_returns_ok_response.frozen @@ -1 +1 @@ -2025-04-24T11:34:51.208Z \ No newline at end of file +2025-08-13T20:13:44.611Z \ No newline at end of file diff --git a/tests/v2/cassettes/test_scenarios/test_convert_an_existing_rule_from_json_to_terraform_returns_ok_response.yaml b/tests/v2/cassettes/test_scenarios/test_convert_an_existing_rule_from_json_to_terraform_returns_ok_response.yaml index b134d2f5e2..dfd28dbf02 100644 --- a/tests/v2/cassettes/test_scenarios/test_convert_an_existing_rule_from_json_to_terraform_returns_ok_response.yaml +++ b/tests/v2/cassettes/test_scenarios/test_convert_an_existing_rule_from_json_to_terraform_returns_ok_response.yaml @@ -1,7 +1,7 @@ interactions: - request: body: '{"cases":[{"condition":"a > 0","name":"","notifications":[],"status":"info"}],"filters":[],"isEnabled":true,"message":"Test - rule","name":"Test-Convert_an_existing_rule_from_JSON_to_Terraform_returns_OK_response-1745494491","options":{"evaluationWindow":900,"keepAlive":3600,"maxSignalDuration":86400},"queries":[{"aggregation":"count","distinctFields":[],"groupByFields":[],"metrics":[],"query":"@test:true"}],"tags":[],"type":"log_detection"}' + rule","name":"_1166a375f2500467","options":{"evaluationWindow":900,"keepAlive":3600,"maxSignalDuration":86400},"queries":[{"aggregation":"count","distinctFields":[],"groupByFields":[],"metrics":[],"query":"@test:true"}],"tags":[],"type":"log_detection"}' headers: accept: - application/json @@ -11,8 +11,8 @@ interactions: uri: https://api.datadoghq.com/api/v2/security_monitoring/rules response: body: - string: '{"name":"Test-Convert_an_existing_rule_from_JSON_to_Terraform_returns_OK_response-1745494491","createdAt":1745494491502,"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":"e60-iv6-d7e","blocking":false,"metadata":{"entities":null,"sources":null},"creationAuthorId":1445416,"creator":{"handle":"frog@datadoghq.com","name":"frog"},"updater":{"handle":"","name":""}}' + string: '{"name":"_1166a375f2500467","createdAt":1755116024952,"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":"shm-tx8-e8x","blocking":false,"metadata":{"entities":null,"sources":null},"creationAuthorId":1445416,"creator":{"handle":"frog@datadoghq.com","name":"frog"},"updater":{"handle":"","name":""}}' headers: content-type: - application/json @@ -25,13 +25,12 @@ interactions: accept: - application/json method: GET - uri: https://api.datadoghq.com/api/v2/security_monitoring/rules/e60-iv6-d7e/convert + uri: https://api.datadoghq.com/api/v2/security_monitoring/rules/shm-tx8-e8x/convert response: body: string: '{"terraformContent":"resource \"datadog_security_monitoring_rule\" - \"test-convert_an_existing_rule_from_json_to_terraform_returns_ok_response-1745494491\" - {\n\tname = \"Test-Convert_an_existing_rule_from_JSON_to_Terraform_returns_OK_response-1745494491\"\n\tenabled - = true\n\tquery {\n\t\tquery = \"@test:true\"\n\t\tgroup_by_fields = []\n\t\tdistinct_fields + \"_1166a375f2500467\" {\n\tname = \"_1166a375f2500467\"\n\tenabled = true\n\tquery + {\n\t\tquery = \"@test:true\"\n\t\tgroup_by_fields = []\n\t\tdistinct_fields = []\n\t\taggregation = \"count\"\n\t\tname = \"\"\n\t\tdata_source = \"logs\"\n\t}\n\toptions {\n\t\tkeep_alive = 3600\n\t\tmax_signal_duration = 86400\n\t\tdetection_method = \"threshold\"\n\t\tevaluation_window = 900\n\t}\n\tcase {\n\t\tname = \"\"\n\t\tstatus @@ -49,7 +48,7 @@ interactions: accept: - '*/*' method: DELETE - uri: https://api.datadoghq.com/api/v2/security_monitoring/rules/e60-iv6-d7e + uri: https://api.datadoghq.com/api/v2/security_monitoring/rules/shm-tx8-e8x response: body: string: '' diff --git a/tests/v2/features/given.json b/tests/v2/features/given.json index 904a03d759..b609709365 100644 --- a/tests/v2/features/given.json +++ b/tests/v2/features/given.json @@ -804,6 +804,18 @@ "tag": "Security Monitoring", "operationId": "CreateSecurityMonitoringRule" }, + { + "parameters": [ + { + "name": "body", + "value": "{\n \"name\": \"_{{ unique_hash }}\",\n \"queries\": [{\n \"query\": \"@test:true\",\n \"aggregation\": \"count\",\n \"groupByFields\": [],\n \"distinctFields\": [],\n \"metrics\": []\n }],\n \"filters\": [],\n \"cases\": [{\n \"name\": \"\",\n \"status\": \"info\",\n \"condition\": \"a > 0\",\n \"notifications\": []\n }],\n \"options\": {\n \"evaluationWindow\": 900,\n \"keepAlive\": 3600,\n \"maxSignalDuration\": 86400\n },\n \"message\": \"Test rule\",\n \"tags\": [],\n \"isEnabled\": true,\n \"type\": \"log_detection\"\n}" + } + ], + "step": "there is a valid \"security_rule_hash\" in the system", + "key": "security_rule_hash", + "tag": "Security Monitoring", + "operationId": "CreateSecurityMonitoringRule" + }, { "step": "a valid \"configuration\" in the system", "key": "configuration", diff --git a/tests/v2/features/security_monitoring.feature b/tests/v2/features/security_monitoring.feature index 3acea8148d..1ef29aec3e 100644 --- a/tests/v2/features/security_monitoring.feature +++ b/tests/v2/features/security_monitoring.feature @@ -132,10 +132,10 @@ Feature: Security Monitoring @team:DataDog/k9-cloud-security-platform Scenario: Convert a rule from JSON to Terraform returns "OK" response Given new "ConvertSecurityMonitoringRuleFromJSONToTerraform" request - And body with value {"name":"{{ unique }}", "queries":[{"query":"@test:true","aggregation":"count","groupByFields":[],"distinctFields":[],"metric":""}],"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"} + And body with value {"name":"_{{ unique_hash }}", "queries":[{"query":"@test:true","aggregation":"count","groupByFields":[],"distinctFields":[],"metric":""}],"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"} When the request is sent Then the response status is 200 OK - And the response "terraformContent" is equal to "resource \"datadog_security_monitoring_rule\" \"{{ unique_lower }}\" {\n\tname = \"{{ unique }}\"\n\tenabled = true\n\tquery {\n\t\tquery = \"@test:true\"\n\t\tgroup_by_fields = []\n\t\tdistinct_fields = []\n\t\taggregation = \"count\"\n\t\tname = \"\"\n\t\tdata_source = \"logs\"\n\t}\n\toptions {\n\t\tkeep_alive = 3600\n\t\tmax_signal_duration = 86400\n\t\tdetection_method = \"threshold\"\n\t\tevaluation_window = 900\n\t}\n\tcase {\n\t\tname = \"\"\n\t\tstatus = \"info\"\n\t\tnotifications = []\n\t\tcondition = \"a > 0\"\n\t}\n\tmessage = \"Test rule\"\n\ttags = []\n\thas_extended_title = false\n\ttype = \"log_detection\"\n}\n" + And the response "terraformContent" is equal to "resource \"datadog_security_monitoring_rule\" \"_{{ unique_hash }}\" {\n\tname = \"_{{ unique_hash }}\"\n\tenabled = true\n\tquery {\n\t\tquery = \"@test:true\"\n\t\tgroup_by_fields = []\n\t\tdistinct_fields = []\n\t\taggregation = \"count\"\n\t\tname = \"\"\n\t\tdata_source = \"logs\"\n\t}\n\toptions {\n\t\tkeep_alive = 3600\n\t\tmax_signal_duration = 86400\n\t\tdetection_method = \"threshold\"\n\t\tevaluation_window = 900\n\t}\n\tcase {\n\t\tname = \"\"\n\t\tstatus = \"info\"\n\t\tnotifications = []\n\t\tcondition = \"a > 0\"\n\t}\n\tmessage = \"Test rule\"\n\ttags = []\n\thas_extended_title = false\n\ttype = \"log_detection\"\n}\n" @skip @team:DataDog/k9-cloud-security-platform Scenario: Convert an existing rule from JSON to Terraform returns "Bad Request" response @@ -154,11 +154,11 @@ Feature: Security Monitoring @team:DataDog/k9-cloud-security-platform Scenario: Convert an existing rule from JSON to Terraform returns "OK" response Given new "ConvertExistingSecurityMonitoringRule" request - And there is a valid "security_rule" in the system - And request contains "rule_id" parameter from "security_rule.id" + And there is a valid "security_rule_hash" in the system + And request contains "rule_id" parameter from "security_rule_hash.id" When the request is sent Then the response status is 200 OK - And the response "terraformContent" is equal to "resource \"datadog_security_monitoring_rule\" \"{{ unique_lower }}\" {\n\tname = \"{{ unique }}\"\n\tenabled = true\n\tquery {\n\t\tquery = \"@test:true\"\n\t\tgroup_by_fields = []\n\t\tdistinct_fields = []\n\t\taggregation = \"count\"\n\t\tname = \"\"\n\t\tdata_source = \"logs\"\n\t}\n\toptions {\n\t\tkeep_alive = 3600\n\t\tmax_signal_duration = 86400\n\t\tdetection_method = \"threshold\"\n\t\tevaluation_window = 900\n\t}\n\tcase {\n\t\tname = \"\"\n\t\tstatus = \"info\"\n\t\tnotifications = []\n\t\tcondition = \"a > 0\"\n\t}\n\tmessage = \"Test rule\"\n\ttags = []\n\thas_extended_title = false\n\ttype = \"log_detection\"\n}\n" + And the response "terraformContent" is equal to "resource \"datadog_security_monitoring_rule\" \"_{{ unique_hash }}\" {\n\tname = \"_{{ unique_hash }}\"\n\tenabled = true\n\tquery {\n\t\tquery = \"@test:true\"\n\t\tgroup_by_fields = []\n\t\tdistinct_fields = []\n\t\taggregation = \"count\"\n\t\tname = \"\"\n\t\tdata_source = \"logs\"\n\t}\n\toptions {\n\t\tkeep_alive = 3600\n\t\tmax_signal_duration = 86400\n\t\tdetection_method = \"threshold\"\n\t\tevaluation_window = 900\n\t}\n\tcase {\n\t\tname = \"\"\n\t\tstatus = \"info\"\n\t\tnotifications = []\n\t\tcondition = \"a > 0\"\n\t}\n\tmessage = \"Test rule\"\n\ttags = []\n\thas_extended_title = false\n\ttype = \"log_detection\"\n}\n" @skip-validation @team:DataDog/k9-cloud-security-platform Scenario: Create a cloud_configuration rule returns "OK" response