Skip to content

Commit c562fc9

Browse files
api-clients-generation-pipeline[bot]ci.datadog-api-spec
andauthored
Add user behavior case actions in API spec (#2497)
Co-authored-by: ci.datadog-api-spec <[email protected]>
1 parent c78846b commit c562fc9

8 files changed

+46
-20
lines changed

.apigentools-info

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@
44
"spec_versions": {
55
"v1": {
66
"apigentools_version": "1.6.6",
7-
"regenerated": "2025-04-10 11:41:56.358780",
8-
"spec_repo_commit": "7f98e0a9"
7+
"regenerated": "2025-04-10 18:01:30.298822",
8+
"spec_repo_commit": "c0a45137"
99
},
1010
"v2": {
1111
"apigentools_version": "1.6.6",
12-
"regenerated": "2025-04-10 11:41:56.373787",
13-
"spec_repo_commit": "7f98e0a9"
12+
"regenerated": "2025-04-10 18:01:30.315459",
13+
"spec_repo_commit": "c0a45137"
1414
}
1515
}
1616
}

.generator/schemas/v2/openapi.yaml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27215,6 +27215,7 @@ components:
2721527215
$ref: '#/components/schemas/SecurityMonitoringRuleCaseActionType'
2721627216
type: object
2721727217
SecurityMonitoringRuleCaseActionOptions:
27218+
additionalProperties: {}
2721827219
description: Options for the rule action
2721927220
properties:
2722027221
duration:
@@ -27223,16 +27224,24 @@ components:
2722327224
format: int64
2722427225
minimum: 0
2722527226
type: integer
27227+
userBehaviorName:
27228+
$ref: '#/components/schemas/SecurityMonitoringRuleCaseActionOptionsUserBehaviorName'
2722627229
type: object
27230+
SecurityMonitoringRuleCaseActionOptionsUserBehaviorName:
27231+
description: Used with the case action of type 'user_behavior'. The value specified
27232+
in this field is applied as a risk tag to all users affected by the rule.
27233+
type: string
2722727234
SecurityMonitoringRuleCaseActionType:
2722827235
description: The action type.
2722927236
enum:
2723027237
- block_ip
2723127238
- block_user
27239+
- user_behavior
2723227240
type: string
2723327241
x-enum-varnames:
2723427242
- BLOCK_IP
2723527243
- BLOCK_USER
27244+
- USER_BEHAVIOR
2723627245
SecurityMonitoringRuleCaseCreate:
2723727246
description: Case when signal is generated.
2723827247
properties:

examples/v2/security-monitoring/CreateSecurityMonitoringRule_1965169892.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,12 @@
5757
duration=900,
5858
),
5959
),
60+
SecurityMonitoringRuleCaseAction(
61+
type=SecurityMonitoringRuleCaseActionType.USER_BEHAVIOR,
62+
options=SecurityMonitoringRuleCaseActionOptions(
63+
user_behavior_name="behavior",
64+
),
65+
),
6066
],
6167
),
6268
],

src/datadog_api_client/v2/model/security_monitoring_rule_case_action_options.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,28 @@ class SecurityMonitoringRuleCaseActionOptions(ModelNormal):
2424
def openapi_types(_):
2525
return {
2626
"duration": (int,),
27+
"user_behavior_name": (str,),
2728
}
2829

2930
attribute_map = {
3031
"duration": "duration",
32+
"user_behavior_name": "userBehaviorName",
3133
}
3234

33-
def __init__(self_, duration: Union[int, UnsetType] = unset, **kwargs):
35+
def __init__(
36+
self_, duration: Union[int, UnsetType] = unset, user_behavior_name: Union[str, UnsetType] = unset, **kwargs
37+
):
3438
"""
3539
Options for the rule action
3640
3741
:param duration: Duration of the action in seconds. 0 indicates no expiration.
3842
:type duration: int, optional
43+
44+
:param user_behavior_name: Used with the case action of type 'user_behavior'. The value specified in this field is applied as a risk tag to all users affected by the rule.
45+
:type user_behavior_name: str, optional
3946
"""
4047
if duration is not unset:
4148
kwargs["duration"] = duration
49+
if user_behavior_name is not unset:
50+
kwargs["user_behavior_name"] = user_behavior_name
4251
super().__init__(kwargs)

src/datadog_api_client/v2/model/security_monitoring_rule_case_action_type.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,18 @@ class SecurityMonitoringRuleCaseActionType(ModelSimple):
1616
"""
1717
The action type.
1818
19-
:param value: Must be one of ["block_ip", "block_user"].
19+
:param value: Must be one of ["block_ip", "block_user", "user_behavior"].
2020
:type value: str
2121
"""
2222

2323
allowed_values = {
2424
"block_ip",
2525
"block_user",
26+
"user_behavior",
2627
}
2728
BLOCK_IP: ClassVar["SecurityMonitoringRuleCaseActionType"]
2829
BLOCK_USER: ClassVar["SecurityMonitoringRuleCaseActionType"]
30+
USER_BEHAVIOR: ClassVar["SecurityMonitoringRuleCaseActionType"]
2931

3032
@cached_property
3133
def openapi_types(_):
@@ -36,3 +38,4 @@ def openapi_types(_):
3638

3739
SecurityMonitoringRuleCaseActionType.BLOCK_IP = SecurityMonitoringRuleCaseActionType("block_ip")
3840
SecurityMonitoringRuleCaseActionType.BLOCK_USER = SecurityMonitoringRuleCaseActionType("block_user")
41+
SecurityMonitoringRuleCaseActionType.USER_BEHAVIOR = SecurityMonitoringRuleCaseActionType("user_behavior")
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2025-02-06T16:50:39.787Z
1+
2025-04-09T15:02:05.047Z
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
interactions:
22
- request:
3-
body: '{"cases":[{"actions":[{"options":{"duration":900},"type":"block_ip"}],"condition":"a
3+
body: '{"cases":[{"actions":[{"options":{"duration":900},"type":"block_ip"},{"options":{"userBehaviorName":"behavior"},"type":"user_behavior"}],"condition":"a
44
> 100000","name":"","notifications":[],"status":"info"}],"filters":[],"groupSignalsBy":["service"],"isEnabled":true,"message":"Test
5-
rule","name":"Test-Create_a_detection_rule_with_type_application_security_returns_OK_response-1738860639_appsec_rule","options":{"detectionMethod":"threshold","evaluationWindow":900,"keepAlive":3600,"maxSignalDuration":86400},"queries":[{"aggregation":"count","distinctFields":[],"groupByFields":["service","@http.client_ip"],"query":"@appsec.security_activity:business_logic.users.login.failure"}],"tags":[],"type":"application_security"}'
5+
rule","name":"Test-Create_a_detection_rule_with_type_application_security_returns_OK_response-1744210925_appsec_rule","options":{"detectionMethod":"threshold","evaluationWindow":900,"keepAlive":3600,"maxSignalDuration":86400},"queries":[{"aggregation":"count","distinctFields":[],"groupByFields":["service","@http.client_ip"],"query":"@appsec.security_activity:business_logic.users.login.failure"}],"tags":[],"type":"application_security"}'
66
headers:
77
accept:
88
- application/json
@@ -12,9 +12,10 @@ interactions:
1212
uri: https://api.datadoghq.com/api/v2/security_monitoring/rules
1313
response:
1414
body:
15-
string: '{"name":"Test-Create_a_detection_rule_with_type_application_security_returns_OK_response-1738860639_appsec_rule","createdAt":1738860640426,"isDefault":false,"isPartner":false,"isEnabled":true,"isBeta":false,"isDeleted":false,"isDeprecated":false,"queries":[{"query":"@appsec.security_activity:business_logic.users.login.failure","groupByFields":["service","@http.client_ip"],"hasOptionalGroupByFields":false,"distinctFields":[],"aggregation":"count","name":"","dataSource":"app_sec_spans"}],"options":{"evaluationWindow":900,"detectionMethod":"threshold","maxSignalDuration":86400,"keepAlive":3600},"cases":[{"name":"","status":"info","notifications":[],"condition":"a
16-
\u003e 100000","actions":[{"type":"block_ip","options":{"duration":900}}]}],"message":"Test
17-
rule","tags":[],"hasExtendedTitle":false,"type":"application_security","filters":[],"version":1,"id":"rfn-h2v-udr","blocking":true,"groupSignalsBy":["service"],"casesActions":[[{"type":"block_ip","options":{"duration":900}}]],"dependencies":["business_logic.users.login.failure"],"metadata":{"entities":null,"sources":null},"creator":{"handle":"","name":""},"updater":{"handle":"","name":""}}'
15+
string: '{"name":"Test-Create_a_detection_rule_with_type_application_security_returns_OK_response-1744210925_appsec_rule","createdAt":1744210925675,"isDefault":false,"isPartner":false,"isEnabled":true,"isBeta":false,"isDeleted":false,"isDeprecated":false,"queries":[{"query":"@appsec.security_activity:business_logic.users.login.failure","groupByFields":["service","@http.client_ip"],"hasOptionalGroupByFields":false,"distinctFields":[],"aggregation":"count","name":"","dataSource":"app_sec_spans"}],"options":{"evaluationWindow":900,"detectionMethod":"threshold","maxSignalDuration":86400,"keepAlive":3600},"cases":[{"name":"","status":"info","notifications":[],"condition":"a
16+
\u003e 100000","actions":[{"type":"block_ip","options":{"duration":900}},{"type":"user_behavior","options":{"userBehaviorName":"behavior"}}]}],"message":"Test
17+
rule","tags":[],"hasExtendedTitle":false,"type":"application_security","filters":[],"version":1,"id":"lfr-zxg-fyc","blocking":true,"groupSignalsBy":["service"],"dependencies":["business_logic.users.login.failure"],"metadata":{"entities":null,"sources":null},"creationAuthorId":2320499,"creator":{"handle":"9919ec9b-ebc7-49ee-8dc8-03626e717cca","name":"CI
18+
Account"},"updater":{"handle":"","name":""}}'
1819
headers:
1920
content-type:
2021
- application/json
@@ -27,14 +28,12 @@ interactions:
2728
accept:
2829
- '*/*'
2930
method: DELETE
30-
uri: https://api.datadoghq.com/api/v2/security_monitoring/rules/rfn-h2v-udr
31+
uri: https://api.datadoghq.com/api/v2/security_monitoring/rules/lfr-zxg-fyc
3132
response:
3233
body:
33-
string: '{"status":"404","title":"Not Found"}'
34-
headers:
35-
content-type:
36-
- application/json
34+
string: ''
35+
headers: {}
3736
status:
38-
code: 404
39-
message: Not Found
37+
code: 204
38+
message: No Content
4039
version: 1

tests/v2/features/security_monitoring.feature

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ Feature: Security Monitoring
203203
@skip-validation @team:DataDog/k9-cloud-security-platform
204204
Scenario: Create a detection rule with type 'application_security 'returns "OK" response
205205
Given new "CreateSecurityMonitoringRule" request
206-
And body with value {"type":"application_security","name":"{{unique}}_appsec_rule","queries":[{"query":"@appsec.security_activity:business_logic.users.login.failure","aggregation":"count","groupByFields":["service","@http.client_ip"],"distinctFields":[]}],"filters":[],"cases":[{"name":"","status":"info","notifications":[],"condition":"a > 100000","actions":[{"type":"block_ip","options":{"duration":900}}]}],"options":{"keepAlive":3600,"maxSignalDuration":86400,"evaluationWindow":900,"detectionMethod":"threshold"},"isEnabled":true,"message":"Test rule","tags":[],"groupSignalsBy":["service"]}
206+
And body with value {"type":"application_security","name":"{{unique}}_appsec_rule","queries":[{"query":"@appsec.security_activity:business_logic.users.login.failure","aggregation":"count","groupByFields":["service","@http.client_ip"],"distinctFields":[]}],"filters":[],"cases":[{"name":"","status":"info","notifications":[],"condition":"a > 100000","actions":[{"type":"block_ip","options":{"duration":900}}, {"type":"user_behavior","options":{"userBehaviorName":"behavior"}}]}],"options":{"keepAlive":3600,"maxSignalDuration":86400,"evaluationWindow":900,"detectionMethod":"threshold"},"isEnabled":true,"message":"Test rule","tags":[],"groupSignalsBy":["service"]}
207207
When the request is sent
208208
Then the response status is 200 OK
209209
And the response "name" is equal to "{{ unique }}_appsec_rule"

0 commit comments

Comments
 (0)