diff --git a/.generator/schemas/v2/openapi.yaml b/.generator/schemas/v2/openapi.yaml index 5e1dce10cc..198c15204d 100644 --- a/.generator/schemas/v2/openapi.yaml +++ b/.generator/schemas/v2/openapi.yaml @@ -13006,6 +13006,30 @@ components: $ref: '#/components/schemas/GetInterfacesData' type: array type: object + GetRuleVersionHistoryData: + description: Data for the rule version history. + properties: + attributes: + $ref: '#/components/schemas/RuleVersionHistory' + id: + description: ID of the rule. + type: string + type: + $ref: '#/components/schemas/GetRuleVersionHistoryDataType' + type: object + GetRuleVersionHistoryDataType: + description: Type of data. + enum: + - GetRuleVersionHistoryResponse + type: string + x-enum-varnames: + - GETRULEVERSIONHISTORYRESPONSE + GetRuleVersionHistoryResponse: + description: Response for getting the rule version history. + properties: + data: + $ref: '#/components/schemas/GetRuleVersionHistoryData' + type: object GetSBOMResponse: description: The expected response schema when getting an SBOM. properties: @@ -23825,6 +23849,57 @@ components: example: John Doe type: string type: object + RuleVersionHistory: + description: Response object containing the version history of a rule. + properties: + count: + description: The number of rule versions. + format: int32 + maximum: 2147483647 + type: integer + data: + additionalProperties: + $ref: '#/components/schemas/RuleVersions' + description: A rule version with a list of updates. + description: The `RuleVersionHistory` `data`. + type: object + type: object + RuleVersionUpdate: + description: A change in a rule version. + properties: + change: + description: The new value of the field. + example: cloud_provider:aws + type: string + field: + description: The field that was changed. + example: Tags + type: string + type: + $ref: '#/components/schemas/RuleVersionUpdateType' + type: object + RuleVersionUpdateType: + description: The type of change. + enum: + - create + - update + - delete + type: string + x-enum-varnames: + - CREATE + - UPDATE + - DELETE + RuleVersions: + description: A rule version with a list of updates. + properties: + changes: + description: A list of changes. + items: + $ref: '#/components/schemas/RuleVersionUpdate' + type: array + rule: + $ref: '#/components/schemas/SecurityMonitoringRuleResponse' + type: object RumMetricCompute: description: The compute rule to compute the rum-based metric. properties: @@ -46712,6 +46787,42 @@ paths: operator: OR permissions: - security_monitoring_rules_write + /api/v2/security_monitoring/rules/{rule_id}/version_history: + get: + description: Get a rule's version history. + operationId: GetRuleVersionHistory + parameters: + - $ref: '#/components/parameters/SecurityMonitoringRuleID' + - $ref: '#/components/parameters/PageSize' + - $ref: '#/components/parameters/PageNumber' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/GetRuleVersionHistoryResponse' + description: OK + '400': + $ref: '#/components/responses/BadRequestResponse' + '403': + $ref: '#/components/responses/NotAuthorizedResponse' + '404': + $ref: '#/components/responses/NotFoundResponse' + '429': + $ref: '#/components/responses/TooManyRequestsResponse' + security: + - apiKeyAuth: [] + appKeyAuth: [] + - AuthZ: + - security_monitoring_rules_read + summary: Get a rule's version history + tags: + - Security Monitoring + x-permission: + operator: OR + permissions: + - security_monitoring_rules_read + x-unstable: '**Note**: This endpoint is in beta and may be subject to changes.' /api/v2/security_monitoring/signals: get: description: 'The list endpoint returns security signals that match a search diff --git a/docs/datadog_api_client.v2.model.rst b/docs/datadog_api_client.v2.model.rst index 3dab64da42..6694a57911 100644 --- a/docs/datadog_api_client.v2.model.rst +++ b/docs/datadog_api_client.v2.model.rst @@ -5331,6 +5331,27 @@ datadog\_api\_client.v2.model.get\_interfaces\_response module :members: :show-inheritance: +datadog\_api\_client.v2.model.get\_rule\_version\_history\_data module +---------------------------------------------------------------------- + +.. automodule:: datadog_api_client.v2.model.get_rule_version_history_data + :members: + :show-inheritance: + +datadog\_api\_client.v2.model.get\_rule\_version\_history\_data\_type module +---------------------------------------------------------------------------- + +.. automodule:: datadog_api_client.v2.model.get_rule_version_history_data_type + :members: + :show-inheritance: + +datadog\_api\_client.v2.model.get\_rule\_version\_history\_response module +-------------------------------------------------------------------------- + +.. automodule:: datadog_api_client.v2.model.get_rule_version_history_response + :members: + :show-inheritance: + datadog\_api\_client.v2.model.get\_sbom\_response module -------------------------------------------------------- @@ -10140,6 +10161,34 @@ datadog\_api\_client.v2.model.rule\_user module :members: :show-inheritance: +datadog\_api\_client.v2.model.rule\_version\_history module +----------------------------------------------------------- + +.. automodule:: datadog_api_client.v2.model.rule_version_history + :members: + :show-inheritance: + +datadog\_api\_client.v2.model.rule\_version\_update module +---------------------------------------------------------- + +.. automodule:: datadog_api_client.v2.model.rule_version_update + :members: + :show-inheritance: + +datadog\_api\_client.v2.model.rule\_version\_update\_type module +---------------------------------------------------------------- + +.. automodule:: datadog_api_client.v2.model.rule_version_update_type + :members: + :show-inheritance: + +datadog\_api\_client.v2.model.rule\_versions module +--------------------------------------------------- + +.. automodule:: datadog_api_client.v2.model.rule_versions + :members: + :show-inheritance: + datadog\_api\_client.v2.model.rum\_aggregate\_bucket\_value module ------------------------------------------------------------------ diff --git a/examples/v2/security-monitoring/GetRuleVersionHistory.py b/examples/v2/security-monitoring/GetRuleVersionHistory.py new file mode 100644 index 0000000000..827de8570b --- /dev/null +++ b/examples/v2/security-monitoring/GetRuleVersionHistory.py @@ -0,0 +1,16 @@ +""" +Get a rule's version history returns "OK" response +""" + +from datadog_api_client import ApiClient, Configuration +from datadog_api_client.v2.api.security_monitoring_api import SecurityMonitoringApi + +configuration = Configuration() +configuration.unstable_operations["get_rule_version_history"] = True +with ApiClient(configuration) as api_client: + api_instance = SecurityMonitoringApi(api_client) + response = api_instance.get_rule_version_history( + rule_id="rule_id", + ) + + print(response) diff --git a/examples/v2/security-monitoring/GetRuleVersionHistory_2467565841.py b/examples/v2/security-monitoring/GetRuleVersionHistory_2467565841.py new file mode 100644 index 0000000000..b4e3d786a8 --- /dev/null +++ b/examples/v2/security-monitoring/GetRuleVersionHistory_2467565841.py @@ -0,0 +1,20 @@ +""" +Get rule version history returns "OK" response +""" + +from os import environ +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"] + +configuration = Configuration() +configuration.unstable_operations["get_rule_version_history"] = True +with ApiClient(configuration) as api_client: + api_instance = SecurityMonitoringApi(api_client) + response = api_instance.get_rule_version_history( + rule_id=SECURITY_RULE_ID, + ) + + print(response) diff --git a/src/datadog_api_client/configuration.py b/src/datadog_api_client/configuration.py index 42cabc3f37..69bca934e7 100644 --- a/src/datadog_api_client/configuration.py +++ b/src/datadog_api_client/configuration.py @@ -290,6 +290,7 @@ def __init__( "v2.delete_historical_job": False, "v2.get_finding": False, "v2.get_historical_job": False, + "v2.get_rule_version_history": False, "v2.list_findings": False, "v2.list_historical_jobs": False, "v2.mute_findings": False, diff --git a/src/datadog_api_client/v2/api/security_monitoring_api.py b/src/datadog_api_client/v2/api/security_monitoring_api.py index d47d577280..2ab2ff3ec4 100644 --- a/src/datadog_api_client/v2/api/security_monitoring_api.py +++ b/src/datadog_api_client/v2/api/security_monitoring_api.py @@ -66,6 +66,7 @@ from datadog_api_client.v2.model.security_monitoring_rule_validate_payload import SecurityMonitoringRuleValidatePayload from datadog_api_client.v2.model.cloud_configuration_rule_payload import CloudConfigurationRulePayload from datadog_api_client.v2.model.security_monitoring_rule_update_payload import SecurityMonitoringRuleUpdatePayload +from datadog_api_client.v2.model.get_rule_version_history_response import GetRuleVersionHistoryResponse from datadog_api_client.v2.model.security_monitoring_signals_list_response import SecurityMonitoringSignalsListResponse from datadog_api_client.v2.model.security_monitoring_signals_sort import SecurityMonitoringSignalsSort from datadog_api_client.v2.model.security_monitoring_signal import SecurityMonitoringSignal @@ -556,6 +557,39 @@ def __init__(self, api_client=None): api_client=api_client, ) + self._get_rule_version_history_endpoint = _Endpoint( + settings={ + "response_type": (GetRuleVersionHistoryResponse,), + "auth": ["apiKeyAuth", "appKeyAuth", "AuthZ"], + "endpoint_path": "/api/v2/security_monitoring/rules/{rule_id}/version_history", + "operation_id": "get_rule_version_history", + "http_method": "GET", + "version": "v2", + }, + params_map={ + "rule_id": { + "required": True, + "openapi_types": (str,), + "attribute": "rule_id", + "location": "path", + }, + "page_size": { + "openapi_types": (int,), + "attribute": "page[size]", + "location": "query", + }, + "page_number": { + "openapi_types": (int,), + "attribute": "page[number]", + "location": "query", + }, + }, + headers_map={ + "accept": ["application/json"], + }, + api_client=api_client, + ) + self._get_sbom_endpoint = _Endpoint( settings={ "response_type": (GetSBOMResponse,), @@ -1958,6 +1992,36 @@ def get_historical_job( return self._get_historical_job_endpoint.call_with_http_info(**kwargs) + def get_rule_version_history( + self, + rule_id: str, + *, + page_size: Union[int, UnsetType] = unset, + page_number: Union[int, UnsetType] = unset, + ) -> GetRuleVersionHistoryResponse: + """Get a rule's version history. + + Get a rule's version history. + + :param rule_id: The ID of the rule. + :type rule_id: str + :param page_size: Size for a given page. The maximum allowed value is 100. + :type page_size: int, optional + :param page_number: Specific page number to return. + :type page_number: int, optional + :rtype: GetRuleVersionHistoryResponse + """ + kwargs: Dict[str, Any] = {} + kwargs["rule_id"] = rule_id + + if page_size is not unset: + kwargs["page_size"] = page_size + + if page_number is not unset: + kwargs["page_number"] = page_number + + return self._get_rule_version_history_endpoint.call_with_http_info(**kwargs) + def get_sbom( self, asset_type: AssetType, diff --git a/src/datadog_api_client/v2/model/get_rule_version_history_data.py b/src/datadog_api_client/v2/model/get_rule_version_history_data.py new file mode 100644 index 0000000000..59d867022e --- /dev/null +++ b/src/datadog_api_client/v2/model/get_rule_version_history_data.py @@ -0,0 +1,64 @@ +# Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019-Present Datadog, Inc. +from __future__ import annotations + +from typing import Union, TYPE_CHECKING + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, + unset, + UnsetType, +) + + +if TYPE_CHECKING: + from datadog_api_client.v2.model.rule_version_history import RuleVersionHistory + from datadog_api_client.v2.model.get_rule_version_history_data_type import GetRuleVersionHistoryDataType + + +class GetRuleVersionHistoryData(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.rule_version_history import RuleVersionHistory + from datadog_api_client.v2.model.get_rule_version_history_data_type import GetRuleVersionHistoryDataType + + return { + "attributes": (RuleVersionHistory,), + "id": (str,), + "type": (GetRuleVersionHistoryDataType,), + } + + attribute_map = { + "attributes": "attributes", + "id": "id", + "type": "type", + } + + def __init__( + self_, + attributes: Union[RuleVersionHistory, UnsetType] = unset, + id: Union[str, UnsetType] = unset, + type: Union[GetRuleVersionHistoryDataType, UnsetType] = unset, + **kwargs, + ): + """ + Data for the rule version history. + + :param attributes: Response object containing the version history of a rule. + :type attributes: RuleVersionHistory, optional + + :param id: ID of the rule. + :type id: str, optional + + :param type: Type of data. + :type type: GetRuleVersionHistoryDataType, optional + """ + if attributes is not unset: + kwargs["attributes"] = attributes + if id is not unset: + kwargs["id"] = id + if type is not unset: + kwargs["type"] = type + super().__init__(kwargs) diff --git a/src/datadog_api_client/v2/model/get_rule_version_history_data_type.py b/src/datadog_api_client/v2/model/get_rule_version_history_data_type.py new file mode 100644 index 0000000000..5f8800c08f --- /dev/null +++ b/src/datadog_api_client/v2/model/get_rule_version_history_data_type.py @@ -0,0 +1,37 @@ +# Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019-Present Datadog, Inc. +from __future__ import annotations + + +from datadog_api_client.model_utils import ( + ModelSimple, + cached_property, +) + +from typing import ClassVar + + +class GetRuleVersionHistoryDataType(ModelSimple): + """ + Type of data. + + :param value: If omitted defaults to "GetRuleVersionHistoryResponse". Must be one of ["GetRuleVersionHistoryResponse"]. + :type value: str + """ + + allowed_values = { + "GetRuleVersionHistoryResponse", + } + GETRULEVERSIONHISTORYRESPONSE: ClassVar["GetRuleVersionHistoryDataType"] + + @cached_property + def openapi_types(_): + return { + "value": (str,), + } + + +GetRuleVersionHistoryDataType.GETRULEVERSIONHISTORYRESPONSE = GetRuleVersionHistoryDataType( + "GetRuleVersionHistoryResponse" +) diff --git a/src/datadog_api_client/v2/model/get_rule_version_history_response.py b/src/datadog_api_client/v2/model/get_rule_version_history_response.py new file mode 100644 index 0000000000..9b6d6627ef --- /dev/null +++ b/src/datadog_api_client/v2/model/get_rule_version_history_response.py @@ -0,0 +1,42 @@ +# Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019-Present Datadog, Inc. +from __future__ import annotations + +from typing import Union, TYPE_CHECKING + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, + unset, + UnsetType, +) + + +if TYPE_CHECKING: + from datadog_api_client.v2.model.get_rule_version_history_data import GetRuleVersionHistoryData + + +class GetRuleVersionHistoryResponse(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.get_rule_version_history_data import GetRuleVersionHistoryData + + return { + "data": (GetRuleVersionHistoryData,), + } + + attribute_map = { + "data": "data", + } + + def __init__(self_, data: Union[GetRuleVersionHistoryData, UnsetType] = unset, **kwargs): + """ + Response for getting the rule version history. + + :param data: Data for the rule version history. + :type data: GetRuleVersionHistoryData, optional + """ + if data is not unset: + kwargs["data"] = data + super().__init__(kwargs) diff --git a/src/datadog_api_client/v2/model/rule_version_history.py b/src/datadog_api_client/v2/model/rule_version_history.py new file mode 100644 index 0000000000..fdc79f6a49 --- /dev/null +++ b/src/datadog_api_client/v2/model/rule_version_history.py @@ -0,0 +1,57 @@ +# Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019-Present Datadog, Inc. +from __future__ import annotations + +from typing import Dict, Union, TYPE_CHECKING + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, + unset, + UnsetType, +) + + +if TYPE_CHECKING: + from datadog_api_client.v2.model.rule_versions import RuleVersions + + +class RuleVersionHistory(ModelNormal): + validations = { + "count": { + "inclusive_maximum": 2147483647, + }, + } + + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.rule_versions import RuleVersions + + return { + "count": (int,), + "data": ({str: (RuleVersions,)},), + } + + attribute_map = { + "count": "count", + "data": "data", + } + + def __init__( + self_, count: Union[int, UnsetType] = unset, data: Union[Dict[str, RuleVersions], UnsetType] = unset, **kwargs + ): + """ + Response object containing the version history of a rule. + + :param count: The number of rule versions. + :type count: int, optional + + :param data: The ``RuleVersionHistory`` ``data``. + :type data: {str: (RuleVersions,)}, optional + """ + if count is not unset: + kwargs["count"] = count + if data is not unset: + kwargs["data"] = data + super().__init__(kwargs) diff --git a/src/datadog_api_client/v2/model/rule_version_update.py b/src/datadog_api_client/v2/model/rule_version_update.py new file mode 100644 index 0000000000..015e90b7a6 --- /dev/null +++ b/src/datadog_api_client/v2/model/rule_version_update.py @@ -0,0 +1,62 @@ +# Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019-Present Datadog, Inc. +from __future__ import annotations + +from typing import Union, TYPE_CHECKING + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, + unset, + UnsetType, +) + + +if TYPE_CHECKING: + from datadog_api_client.v2.model.rule_version_update_type import RuleVersionUpdateType + + +class RuleVersionUpdate(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.rule_version_update_type import RuleVersionUpdateType + + return { + "change": (str,), + "field": (str,), + "type": (RuleVersionUpdateType,), + } + + attribute_map = { + "change": "change", + "field": "field", + "type": "type", + } + + def __init__( + self_, + change: Union[str, UnsetType] = unset, + field: Union[str, UnsetType] = unset, + type: Union[RuleVersionUpdateType, UnsetType] = unset, + **kwargs, + ): + """ + A change in a rule version. + + :param change: The new value of the field. + :type change: str, optional + + :param field: The field that was changed. + :type field: str, optional + + :param type: The type of change. + :type type: RuleVersionUpdateType, optional + """ + if change is not unset: + kwargs["change"] = change + if field is not unset: + kwargs["field"] = field + if type is not unset: + kwargs["type"] = type + super().__init__(kwargs) diff --git a/src/datadog_api_client/v2/model/rule_version_update_type.py b/src/datadog_api_client/v2/model/rule_version_update_type.py new file mode 100644 index 0000000000..7d49189052 --- /dev/null +++ b/src/datadog_api_client/v2/model/rule_version_update_type.py @@ -0,0 +1,41 @@ +# Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019-Present Datadog, Inc. +from __future__ import annotations + + +from datadog_api_client.model_utils import ( + ModelSimple, + cached_property, +) + +from typing import ClassVar + + +class RuleVersionUpdateType(ModelSimple): + """ + The type of change. + + :param value: Must be one of ["create", "update", "delete"]. + :type value: str + """ + + allowed_values = { + "create", + "update", + "delete", + } + CREATE: ClassVar["RuleVersionUpdateType"] + UPDATE: ClassVar["RuleVersionUpdateType"] + DELETE: ClassVar["RuleVersionUpdateType"] + + @cached_property + def openapi_types(_): + return { + "value": (str,), + } + + +RuleVersionUpdateType.CREATE = RuleVersionUpdateType("create") +RuleVersionUpdateType.UPDATE = RuleVersionUpdateType("update") +RuleVersionUpdateType.DELETE = RuleVersionUpdateType("delete") diff --git a/src/datadog_api_client/v2/model/rule_versions.py b/src/datadog_api_client/v2/model/rule_versions.py new file mode 100644 index 0000000000..98cb8d0cc4 --- /dev/null +++ b/src/datadog_api_client/v2/model/rule_versions.py @@ -0,0 +1,67 @@ +# Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019-Present Datadog, Inc. +from __future__ import annotations + +from typing import List, Union, TYPE_CHECKING + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, + unset, + UnsetType, +) + + +if TYPE_CHECKING: + from datadog_api_client.v2.model.rule_version_update import RuleVersionUpdate + from datadog_api_client.v2.model.security_monitoring_rule_response import SecurityMonitoringRuleResponse + from datadog_api_client.v2.model.security_monitoring_standard_rule_response import ( + SecurityMonitoringStandardRuleResponse, + ) + from datadog_api_client.v2.model.security_monitoring_signal_rule_response import ( + SecurityMonitoringSignalRuleResponse, + ) + + +class RuleVersions(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.rule_version_update import RuleVersionUpdate + from datadog_api_client.v2.model.security_monitoring_rule_response import SecurityMonitoringRuleResponse + + return { + "changes": ([RuleVersionUpdate],), + "rule": (SecurityMonitoringRuleResponse,), + } + + attribute_map = { + "changes": "changes", + "rule": "rule", + } + + def __init__( + self_, + changes: Union[List[RuleVersionUpdate], UnsetType] = unset, + rule: Union[ + SecurityMonitoringRuleResponse, + SecurityMonitoringStandardRuleResponse, + SecurityMonitoringSignalRuleResponse, + UnsetType, + ] = unset, + **kwargs, + ): + """ + A rule version with a list of updates. + + :param changes: A list of changes. + :type changes: [RuleVersionUpdate], optional + + :param rule: Create a new rule. + :type rule: SecurityMonitoringRuleResponse, optional + """ + if changes is not unset: + kwargs["changes"] = changes + if rule is not unset: + kwargs["rule"] = rule + super().__init__(kwargs) diff --git a/src/datadog_api_client/v2/models/__init__.py b/src/datadog_api_client/v2/models/__init__.py index 7cef51d8e5..618b4d2073 100644 --- a/src/datadog_api_client/v2/models/__init__.py +++ b/src/datadog_api_client/v2/models/__init__.py @@ -933,6 +933,9 @@ from datadog_api_client.v2.model.get_finding_response import GetFindingResponse from datadog_api_client.v2.model.get_interfaces_data import GetInterfacesData from datadog_api_client.v2.model.get_interfaces_response import GetInterfacesResponse +from datadog_api_client.v2.model.get_rule_version_history_data import GetRuleVersionHistoryData +from datadog_api_client.v2.model.get_rule_version_history_data_type import GetRuleVersionHistoryDataType +from datadog_api_client.v2.model.get_rule_version_history_response import GetRuleVersionHistoryResponse from datadog_api_client.v2.model.get_sbom_response import GetSBOMResponse from datadog_api_client.v2.model.get_team_memberships_sort import GetTeamMembershipsSort from datadog_api_client.v2.model.get_workflow_response import GetWorkflowResponse @@ -1791,6 +1794,10 @@ from datadog_api_client.v2.model.rule_type import RuleType from datadog_api_client.v2.model.rule_types_items import RuleTypesItems from datadog_api_client.v2.model.rule_user import RuleUser +from datadog_api_client.v2.model.rule_version_history import RuleVersionHistory +from datadog_api_client.v2.model.rule_version_update import RuleVersionUpdate +from datadog_api_client.v2.model.rule_version_update_type import RuleVersionUpdateType +from datadog_api_client.v2.model.rule_versions import RuleVersions from datadog_api_client.v2.model.rum_metric_compute import RumMetricCompute from datadog_api_client.v2.model.rum_metric_compute_aggregation_type import RumMetricComputeAggregationType from datadog_api_client.v2.model.rum_metric_create_attributes import RumMetricCreateAttributes @@ -3231,6 +3238,9 @@ "GetFindingResponse", "GetInterfacesData", "GetInterfacesResponse", + "GetRuleVersionHistoryData", + "GetRuleVersionHistoryDataType", + "GetRuleVersionHistoryResponse", "GetSBOMResponse", "GetTeamMembershipsSort", "GetWorkflowResponse", @@ -3965,6 +3975,10 @@ "RuleType", "RuleTypesItems", "RuleUser", + "RuleVersionHistory", + "RuleVersionUpdate", + "RuleVersionUpdateType", + "RuleVersions", "RumMetricCompute", "RumMetricComputeAggregationType", "RumMetricCreateAttributes", diff --git a/tests/v2/cassettes/test_scenarios/test_get_rule_version_history_returns_ok_response.frozen b/tests/v2/cassettes/test_scenarios/test_get_rule_version_history_returns_ok_response.frozen new file mode 100644 index 0000000000..0ac7f76bc9 --- /dev/null +++ b/tests/v2/cassettes/test_scenarios/test_get_rule_version_history_returns_ok_response.frozen @@ -0,0 +1 @@ +2025-02-04T22:39:17.325Z \ No newline at end of file diff --git a/tests/v2/cassettes/test_scenarios/test_get_rule_version_history_returns_ok_response.yaml b/tests/v2/cassettes/test_scenarios/test_get_rule_version_history_returns_ok_response.yaml new file mode 100644 index 0000000000..49fce019b1 --- /dev/null +++ b/tests/v2/cassettes/test_scenarios/test_get_rule_version_history_returns_ok_response.yaml @@ -0,0 +1,53 @@ +interactions: +- request: + body: '{"cases":[{"condition":"a > 0","name":"","notifications":[],"status":"info"}],"filters":[],"isEnabled":true,"message":"Test + rule","name":"Test-Get_rule_version_history_returns_OK_response-1738708757","options":{"evaluationWindow":900,"keepAlive":3600,"maxSignalDuration":86400},"queries":[{"aggregation":"count","distinctFields":[],"groupByFields":[],"metrics":[],"query":"@test:true"}],"tags":[],"type":"log_detection"}' + headers: + accept: + - application/json + content-type: + - application/json + method: POST + uri: https://api.datadoghq.com/api/v2/security_monitoring/rules + response: + body: + string: '{"name":"Test-Get_rule_version_history_returns_OK_response-1738708757","createdAt":1738708757817,"isDefault":false,"isPartner":false,"isEnabled":true,"isBeta":false,"isDeleted":false,"isDeprecated":false,"queries":[{"query":"@test:true","groupByFields":[],"hasOptionalGroupByFields":false,"distinctFields":[],"aggregation":"count","name":""}],"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":"gvq-qqd-jc7","blocking":false,"metadata":{"entities":null,"sources":null},"creator":{"handle":"","name":""},"updater":{"handle":"","name":""}}' + headers: + content-type: + - application/json + status: + code: 200 + message: OK +- request: + body: null + headers: + accept: + - application/json + method: GET + uri: https://api.datadoghq.com/api/v2/security_monitoring/rules/gvq-qqd-jc7/version_history + response: + body: + string: '{"data":{"id":"gvq-qqd-jc7","type":"GetRuleVersionHistoryResponse","attributes":{"count":1,"data":{"1":{"rule":{"name":"Test-Get_rule_version_history_returns_OK_response-1738708757","createdAt":1738708757817,"isDefault":false,"isPartner":false,"isEnabled":true,"isBeta":false,"isDeleted":false,"isDeprecated":false,"queries":[{"query":"@test:true","groupByFields":[],"hasOptionalGroupByFields":false,"distinctFields":[],"aggregation":"count","name":""}],"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":"gvq-qqd-jc7","blocking":false,"metadata":{"entities":null,"sources":null},"creator":{"handle":"","name":""},"updater":{"handle":"","name":""}},"changes":[]}}}}}' + headers: + content-type: + - application/vnd.api+json + status: + code: 200 + message: OK +- request: + body: null + headers: + accept: + - '*/*' + method: DELETE + uri: https://api.datadoghq.com/api/v2/security_monitoring/rules/gvq-qqd-jc7 + response: + body: + string: '' + headers: {} + status: + code: 204 + message: No Content +version: 1 diff --git a/tests/v2/features/security_monitoring.feature b/tests/v2/features/security_monitoring.feature index ec4c3d3f39..ac0898d23a 100644 --- a/tests/v2/features/security_monitoring.feature +++ b/tests/v2/features/security_monitoring.feature @@ -599,6 +599,30 @@ Feature: Security Monitoring And the response "name" is equal to "{{ unique }}" And the response "id" has the same value as "security_rule.id" + @generated @skip @team:DataDog/k9-cloud-security-platform + Scenario: Get a rule's version history returns "Bad Request" response + Given operation "GetRuleVersionHistory" enabled + And new "GetRuleVersionHistory" request + And request contains "rule_id" parameter from "REPLACE.ME" + When the request is sent + Then the response status is 400 Bad Request + + @generated @skip @team:DataDog/k9-cloud-security-platform + Scenario: Get a rule's version history returns "Not Found" response + Given operation "GetRuleVersionHistory" enabled + And new "GetRuleVersionHistory" request + And request contains "rule_id" parameter from "REPLACE.ME" + When the request is sent + Then the response status is 404 Not Found + + @generated @skip @team:DataDog/k9-cloud-security-platform + Scenario: Get a rule's version history returns "OK" response + Given operation "GetRuleVersionHistory" enabled + And new "GetRuleVersionHistory" request + And request contains "rule_id" parameter from "REPLACE.ME" + When the request is sent + Then the response status is 200 OK + @generated @skip @team:DataDog/k9-cloud-security-platform Scenario: Get a security filter returns "Not Found" response Given new "GetSecurityFilter" request @@ -708,6 +732,19 @@ Feature: Security Monitoring When the request is sent Then the response status is 200 Notification rule details. + @skip-go @skip-java @skip-ruby @team:DataDog/k9-cloud-security-platform + Scenario: Get rule version history returns "OK" response + Given operation "GetRuleVersionHistory" enabled + And new "GetRuleVersionHistory" 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 + And the response "data.id" has the same value as "security_rule.id" + And the response "data.type" is equal to "GetRuleVersionHistoryResponse" + 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/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/tests/v2/features/undo.json b/tests/v2/features/undo.json index 288ca835fe..fa6d0273dd 100644 --- a/tests/v2/features/undo.json +++ b/tests/v2/features/undo.json @@ -2362,6 +2362,12 @@ "type": "idempotent" } }, + "GetRuleVersionHistory": { + "tag": "Security Monitoring", + "undo": { + "type": "safe" + } + }, "ListSecurityMonitoringSignals": { "tag": "Security Monitoring", "undo": {