diff --git a/.generator/schemas/v1/openapi.yaml b/.generator/schemas/v1/openapi.yaml index 6eb50c8c03..c48ba0ad97 100644 --- a/.generator/schemas/v1/openapi.yaml +++ b/.generator/schemas/v1/openapi.yaml @@ -18843,7 +18843,7 @@ components: $ref: "#/components/schemas/WidgetCustomLink" type: array requests: - description: One or more Topology requests. + description: One Topology request. items: $ref: "#/components/schemas/TopologyRequest" minItems: 1 @@ -18872,10 +18872,14 @@ components: x-enum-varnames: - TOPOLOGY_MAP TopologyQuery: + description: A topology data source query. + oneOf: + - $ref: "#/components/schemas/TopologyQueryDataStreamsOrServiceMap" + TopologyQueryDataStreamsOrServiceMap: description: Query to service-based topology data sources like the service map or data streams. properties: data_source: - $ref: "#/components/schemas/TopologyQueryDataSource" + $ref: "#/components/schemas/TopologyQueryDataStreamsOrServiceMapDataSource" filters: description: Your environment and primary tag (or * if enabled for your account). example: ["env:prod", "az:us-east"] @@ -18884,16 +18888,24 @@ components: type: string minItems: 1 type: array + query_string: + description: A search string for filtering services, used in `data_streams` queries only. When set, this replaces the `service` field + example: "service:myservice" + type: string service: description: Name of the service - example: myService + example: myservice type: string + required: + - data_source + - filters type: object - TopologyQueryDataSource: + TopologyQueryDataStreamsOrServiceMapDataSource: description: Name of the data source enum: - data_streams - service_map + example: data_streams type: string x-enum-varnames: - DATA_STREAMS diff --git a/.generator/schemas/v2/openapi.yaml b/.generator/schemas/v2/openapi.yaml index 74e0375588..3f66721099 100644 --- a/.generator/schemas/v2/openapi.yaml +++ b/.generator/schemas/v2/openapi.yaml @@ -56896,7 +56896,7 @@ components: $ref: "#/components/schemas/SecurityMonitoringCriticalAsset" type: object SecurityMonitoringCriticalAssetSeverity: - description: Severity associated with this critical asset. Either an explicit severity can be set, or the severity can be increased or decreased, or the severity can be left unchanged (no-op). + description: Severity associated with this critical asset. Either an explicit severity can be set, or the severity can be increased or decreased. enum: - info - low @@ -56905,7 +56905,6 @@ components: - critical - increase - decrease - - no-op example: increase type: string x-enum-varnames: @@ -56916,7 +56915,6 @@ components: - CRITICAL - INCREASE - DECREASE - - NO_OP SecurityMonitoringCriticalAssetType: default: critical_assets description: The type of the resource. The value should always be `critical_assets`. diff --git a/docs/datadog_api_client.v1.model.rst b/docs/datadog_api_client.v1.model.rst index 5370f824d8..1a0f4600e1 100644 --- a/docs/datadog_api_client.v1.model.rst +++ b/docs/datadog_api_client.v1.model.rst @@ -5919,10 +5919,17 @@ datadog\_api\_client.v1.model.topology\_query module :members: :show-inheritance: -datadog\_api\_client.v1.model.topology\_query\_data\_source module ------------------------------------------------------------------- +datadog\_api\_client.v1.model.topology\_query\_data\_streams\_or\_service\_map module +------------------------------------------------------------------------------------- + +.. automodule:: datadog_api_client.v1.model.topology_query_data_streams_or_service_map + :members: + :show-inheritance: + +datadog\_api\_client.v1.model.topology\_query\_data\_streams\_or\_service\_map\_data\_source module +--------------------------------------------------------------------------------------------------- -.. automodule:: datadog_api_client.v1.model.topology_query_data_source +.. automodule:: datadog_api_client.v1.model.topology_query_data_streams_or_service_map_data_source :members: :show-inheritance: diff --git a/examples/v1/dashboards/CreateDashboard_2652180930.py b/examples/v1/dashboards/CreateDashboard_2652180930.py index 36789f5d2d..39d7b49d65 100644 --- a/examples/v1/dashboards/CreateDashboard_2652180930.py +++ b/examples/v1/dashboards/CreateDashboard_2652180930.py @@ -8,8 +8,10 @@ from datadog_api_client.v1.model.dashboard_layout_type import DashboardLayoutType from datadog_api_client.v1.model.topology_map_widget_definition import TopologyMapWidgetDefinition from datadog_api_client.v1.model.topology_map_widget_definition_type import TopologyMapWidgetDefinitionType -from datadog_api_client.v1.model.topology_query import TopologyQuery -from datadog_api_client.v1.model.topology_query_data_source import TopologyQueryDataSource +from datadog_api_client.v1.model.topology_query_data_streams_or_service_map import TopologyQueryDataStreamsOrServiceMap +from datadog_api_client.v1.model.topology_query_data_streams_or_service_map_data_source import ( + TopologyQueryDataStreamsOrServiceMapDataSource, +) from datadog_api_client.v1.model.topology_request import TopologyRequest from datadog_api_client.v1.model.topology_request_type import TopologyRequestType from datadog_api_client.v1.model.widget import Widget @@ -35,8 +37,8 @@ requests=[ TopologyRequest( request_type=TopologyRequestType.TOPOLOGY, - query=TopologyQuery( - data_source=TopologyQueryDataSource.SERVICE_MAP, + query=TopologyQueryDataStreamsOrServiceMap( + data_source=TopologyQueryDataStreamsOrServiceMapDataSource.SERVICE_MAP, service="", filters=[ "env:none", diff --git a/examples/v1/dashboards/CreateDashboard_2815497946.py b/examples/v1/dashboards/CreateDashboard_2815497946.py new file mode 100644 index 0000000000..0e9f1078d2 --- /dev/null +++ b/examples/v1/dashboards/CreateDashboard_2815497946.py @@ -0,0 +1,63 @@ +""" +Create a new dashboard with topology_map data_streams widget +""" + +from datadog_api_client import ApiClient, Configuration +from datadog_api_client.v1.api.dashboards_api import DashboardsApi +from datadog_api_client.v1.model.dashboard import Dashboard +from datadog_api_client.v1.model.dashboard_layout_type import DashboardLayoutType +from datadog_api_client.v1.model.topology_map_widget_definition import TopologyMapWidgetDefinition +from datadog_api_client.v1.model.topology_map_widget_definition_type import TopologyMapWidgetDefinitionType +from datadog_api_client.v1.model.topology_query_data_streams_or_service_map import TopologyQueryDataStreamsOrServiceMap +from datadog_api_client.v1.model.topology_query_data_streams_or_service_map_data_source import ( + TopologyQueryDataStreamsOrServiceMapDataSource, +) +from datadog_api_client.v1.model.topology_request import TopologyRequest +from datadog_api_client.v1.model.topology_request_type import TopologyRequestType +from datadog_api_client.v1.model.widget import Widget +from datadog_api_client.v1.model.widget_layout import WidgetLayout +from datadog_api_client.v1.model.widget_text_align import WidgetTextAlign + +body = Dashboard( + title="Example-Dashboard", + description="", + widgets=[ + Widget( + layout=WidgetLayout( + x=0, + y=0, + width=47, + height=15, + ), + definition=TopologyMapWidgetDefinition( + title="", + title_size="16", + title_align=WidgetTextAlign.LEFT, + type=TopologyMapWidgetDefinitionType.TOPOLOGY_MAP, + requests=[ + TopologyRequest( + request_type=TopologyRequestType.TOPOLOGY, + query=TopologyQueryDataStreamsOrServiceMap( + data_source=TopologyQueryDataStreamsOrServiceMapDataSource.DATA_STREAMS, + service="", + filters=[ + "env:prod", + ], + query_string="service:myservice", + ), + ), + ], + ), + ), + ], + template_variables=[], + layout_type=DashboardLayoutType.FREE, + notify_list=[], +) + +configuration = Configuration() +with ApiClient(configuration) as api_client: + api_instance = DashboardsApi(api_client) + response = api_instance.create_dashboard(body=body) + + print(response) diff --git a/src/datadog_api_client/v1/model/topology_map_widget_definition.py b/src/datadog_api_client/v1/model/topology_map_widget_definition.py index 26780ef441..30bec5e5ed 100644 --- a/src/datadog_api_client/v1/model/topology_map_widget_definition.py +++ b/src/datadog_api_client/v1/model/topology_map_widget_definition.py @@ -68,7 +68,7 @@ def __init__( :param custom_links: List of custom links. :type custom_links: [WidgetCustomLink], optional - :param requests: One or more Topology requests. + :param requests: One Topology request. :type requests: [TopologyRequest] :param title: Title of your widget. diff --git a/src/datadog_api_client/v1/model/topology_query.py b/src/datadog_api_client/v1/model/topology_query.py index ca3798a86b..35bc727a69 100644 --- a/src/datadog_api_client/v1/model/topology_query.py +++ b/src/datadog_api_client/v1/model/topology_query.py @@ -3,66 +3,47 @@ # Copyright 2019-Present Datadog, Inc. from __future__ import annotations -from typing import List, Union, TYPE_CHECKING from datadog_api_client.model_utils import ( - ModelNormal, + ModelComposed, cached_property, - unset, - UnsetType, ) -if TYPE_CHECKING: - from datadog_api_client.v1.model.topology_query_data_source import TopologyQueryDataSource - - -class TopologyQuery(ModelNormal): - validations = { - "filters": { - "min_items": 1, - }, - } - - @cached_property - def openapi_types(_): - from datadog_api_client.v1.model.topology_query_data_source import TopologyQueryDataSource - - return { - "data_source": (TopologyQueryDataSource,), - "filters": ([str],), - "service": (str,), - } - - attribute_map = { - "data_source": "data_source", - "filters": "filters", - "service": "service", - } - - def __init__( - self_, - data_source: Union[TopologyQueryDataSource, UnsetType] = unset, - filters: Union[List[str], UnsetType] = unset, - service: Union[str, UnsetType] = unset, - **kwargs, - ): +class TopologyQuery(ModelComposed): + def __init__(self, **kwargs): """ - Query to service-based topology data sources like the service map or data streams. + A topology data source query. :param data_source: Name of the data source - :type data_source: TopologyQueryDataSource, optional + :type data_source: TopologyQueryDataStreamsOrServiceMapDataSource :param filters: Your environment and primary tag (or * if enabled for your account). - :type filters: [str], optional + :type filters: [str] + + :param query_string: A search string for filtering services, used in `data_streams` queries only. When set, this replaces the `service` field + :type query_string: str, optional :param service: Name of the service :type service: str, optional """ - if data_source is not unset: - kwargs["data_source"] = data_source - if filters is not unset: - kwargs["filters"] = filters - if service is not unset: - kwargs["service"] = service super().__init__(kwargs) + + @cached_property + def _composed_schemas(_): + # we need this here to make our import statements work + # we must store _composed_schemas in here so the code is only run + # when we invoke this method. If we kept this at the class + # level we would get an error because the class level + # code would be run when this module is imported, and these composed + # classes don't exist yet because their module has not finished + # loading + from datadog_api_client.v1.model.topology_query_data_streams_or_service_map import ( + TopologyQueryDataStreamsOrServiceMap, + ) + + return { + "oneOf": [ + TopologyQueryDataStreamsOrServiceMap, + ], + } diff --git a/src/datadog_api_client/v1/model/topology_query_data_streams_or_service_map.py b/src/datadog_api_client/v1/model/topology_query_data_streams_or_service_map.py new file mode 100644 index 0000000000..1812ec5b51 --- /dev/null +++ b/src/datadog_api_client/v1/model/topology_query_data_streams_or_service_map.py @@ -0,0 +1,79 @@ +# 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.v1.model.topology_query_data_streams_or_service_map_data_source import ( + TopologyQueryDataStreamsOrServiceMapDataSource, + ) + + +class TopologyQueryDataStreamsOrServiceMap(ModelNormal): + validations = { + "filters": { + "min_items": 1, + }, + } + + @cached_property + def openapi_types(_): + from datadog_api_client.v1.model.topology_query_data_streams_or_service_map_data_source import ( + TopologyQueryDataStreamsOrServiceMapDataSource, + ) + + return { + "data_source": (TopologyQueryDataStreamsOrServiceMapDataSource,), + "filters": ([str],), + "query_string": (str,), + "service": (str,), + } + + attribute_map = { + "data_source": "data_source", + "filters": "filters", + "query_string": "query_string", + "service": "service", + } + + def __init__( + self_, + data_source: TopologyQueryDataStreamsOrServiceMapDataSource, + filters: List[str], + query_string: Union[str, UnsetType] = unset, + service: Union[str, UnsetType] = unset, + **kwargs, + ): + """ + Query to service-based topology data sources like the service map or data streams. + + :param data_source: Name of the data source + :type data_source: TopologyQueryDataStreamsOrServiceMapDataSource + + :param filters: Your environment and primary tag (or * if enabled for your account). + :type filters: [str] + + :param query_string: A search string for filtering services, used in ``data_streams`` queries only. When set, this replaces the ``service`` field + :type query_string: str, optional + + :param service: Name of the service + :type service: str, optional + """ + if query_string is not unset: + kwargs["query_string"] = query_string + if service is not unset: + kwargs["service"] = service + super().__init__(kwargs) + + self_.data_source = data_source + self_.filters = filters diff --git a/src/datadog_api_client/v1/model/topology_query_data_source.py b/src/datadog_api_client/v1/model/topology_query_data_streams_or_service_map_data_source.py similarity index 59% rename from src/datadog_api_client/v1/model/topology_query_data_source.py rename to src/datadog_api_client/v1/model/topology_query_data_streams_or_service_map_data_source.py index 2c238f625c..7982fd351a 100644 --- a/src/datadog_api_client/v1/model/topology_query_data_source.py +++ b/src/datadog_api_client/v1/model/topology_query_data_streams_or_service_map_data_source.py @@ -12,7 +12,7 @@ from typing import ClassVar -class TopologyQueryDataSource(ModelSimple): +class TopologyQueryDataStreamsOrServiceMapDataSource(ModelSimple): """ Name of the data source @@ -24,8 +24,8 @@ class TopologyQueryDataSource(ModelSimple): "data_streams", "service_map", } - DATA_STREAMS: ClassVar["TopologyQueryDataSource"] - SERVICE_MAP: ClassVar["TopologyQueryDataSource"] + DATA_STREAMS: ClassVar["TopologyQueryDataStreamsOrServiceMapDataSource"] + SERVICE_MAP: ClassVar["TopologyQueryDataStreamsOrServiceMapDataSource"] @cached_property def openapi_types(_): @@ -34,5 +34,9 @@ def openapi_types(_): } -TopologyQueryDataSource.DATA_STREAMS = TopologyQueryDataSource("data_streams") -TopologyQueryDataSource.SERVICE_MAP = TopologyQueryDataSource("service_map") +TopologyQueryDataStreamsOrServiceMapDataSource.DATA_STREAMS = TopologyQueryDataStreamsOrServiceMapDataSource( + "data_streams" +) +TopologyQueryDataStreamsOrServiceMapDataSource.SERVICE_MAP = TopologyQueryDataStreamsOrServiceMapDataSource( + "service_map" +) diff --git a/src/datadog_api_client/v1/model/topology_request.py b/src/datadog_api_client/v1/model/topology_request.py index 50abd1589d..b5cb8b2877 100644 --- a/src/datadog_api_client/v1/model/topology_request.py +++ b/src/datadog_api_client/v1/model/topology_request.py @@ -16,6 +16,9 @@ if TYPE_CHECKING: from datadog_api_client.v1.model.topology_query import TopologyQuery from datadog_api_client.v1.model.topology_request_type import TopologyRequestType + from datadog_api_client.v1.model.topology_query_data_streams_or_service_map import ( + TopologyQueryDataStreamsOrServiceMap, + ) class TopologyRequest(ModelNormal): @@ -36,14 +39,14 @@ def openapi_types(_): def __init__( self_, - query: Union[TopologyQuery, UnsetType] = unset, + query: Union[TopologyQuery, TopologyQueryDataStreamsOrServiceMap, UnsetType] = unset, request_type: Union[TopologyRequestType, UnsetType] = unset, **kwargs, ): """ Request that will return nodes and edges to be used by topology map. - :param query: Query to service-based topology data sources like the service map or data streams. + :param query: A topology data source query. :type query: TopologyQuery, optional :param request_type: Widget request type. diff --git a/src/datadog_api_client/v1/models/__init__.py b/src/datadog_api_client/v1/models/__init__.py index 9cc8c680a3..05c2a07b2b 100644 --- a/src/datadog_api_client/v1/models/__init__.py +++ b/src/datadog_api_client/v1/models/__init__.py @@ -1032,7 +1032,10 @@ from datadog_api_client.v1.model.topology_map_widget_definition import TopologyMapWidgetDefinition from datadog_api_client.v1.model.topology_map_widget_definition_type import TopologyMapWidgetDefinitionType from datadog_api_client.v1.model.topology_query import TopologyQuery -from datadog_api_client.v1.model.topology_query_data_source import TopologyQueryDataSource +from datadog_api_client.v1.model.topology_query_data_streams_or_service_map import TopologyQueryDataStreamsOrServiceMap +from datadog_api_client.v1.model.topology_query_data_streams_or_service_map_data_source import ( + TopologyQueryDataStreamsOrServiceMapDataSource, +) from datadog_api_client.v1.model.topology_request import TopologyRequest from datadog_api_client.v1.model.topology_request_type import TopologyRequestType from datadog_api_client.v1.model.tree_map_color_by import TreeMapColorBy @@ -2059,7 +2062,8 @@ "TopologyMapWidgetDefinition", "TopologyMapWidgetDefinitionType", "TopologyQuery", - "TopologyQueryDataSource", + "TopologyQueryDataStreamsOrServiceMap", + "TopologyQueryDataStreamsOrServiceMapDataSource", "TopologyRequest", "TopologyRequestType", "TreeMapColorBy", diff --git a/src/datadog_api_client/v2/model/security_monitoring_critical_asset_attributes.py b/src/datadog_api_client/v2/model/security_monitoring_critical_asset_attributes.py index e4ec05b065..a4d9811e6d 100644 --- a/src/datadog_api_client/v2/model/security_monitoring_critical_asset_attributes.py +++ b/src/datadog_api_client/v2/model/security_monitoring_critical_asset_attributes.py @@ -101,7 +101,7 @@ def __init__( :param rule_query: The rule query of the critical asset, with the same syntax as the search bar for detection rules. This determines which rules this critical asset will apply to. :type rule_query: str, optional - :param severity: Severity associated with this critical asset. Either an explicit severity can be set, or the severity can be increased or decreased, or the severity can be left unchanged (no-op). + :param severity: Severity associated with this critical asset. Either an explicit severity can be set, or the severity can be increased or decreased. :type severity: SecurityMonitoringCriticalAssetSeverity, optional :param tags: List of tags associated with the critical asset. diff --git a/src/datadog_api_client/v2/model/security_monitoring_critical_asset_create_attributes.py b/src/datadog_api_client/v2/model/security_monitoring_critical_asset_create_attributes.py index 05f38dd999..b07a136648 100644 --- a/src/datadog_api_client/v2/model/security_monitoring_critical_asset_create_attributes.py +++ b/src/datadog_api_client/v2/model/security_monitoring_critical_asset_create_attributes.py @@ -63,7 +63,7 @@ def __init__( :param rule_query: The rule query of the critical asset, with the same syntax as the search bar for detection rules. This determines which rules this critical asset will apply to. :type rule_query: str - :param severity: Severity associated with this critical asset. Either an explicit severity can be set, or the severity can be increased or decreased, or the severity can be left unchanged (no-op). + :param severity: Severity associated with this critical asset. Either an explicit severity can be set, or the severity can be increased or decreased. :type severity: SecurityMonitoringCriticalAssetSeverity :param tags: List of tags associated with the critical asset. diff --git a/src/datadog_api_client/v2/model/security_monitoring_critical_asset_severity.py b/src/datadog_api_client/v2/model/security_monitoring_critical_asset_severity.py index 7c54cfaabf..d6cd99efe5 100644 --- a/src/datadog_api_client/v2/model/security_monitoring_critical_asset_severity.py +++ b/src/datadog_api_client/v2/model/security_monitoring_critical_asset_severity.py @@ -14,9 +14,9 @@ class SecurityMonitoringCriticalAssetSeverity(ModelSimple): """ - Severity associated with this critical asset. Either an explicit severity can be set, or the severity can be increased or decreased, or the severity can be left unchanged (no-op). + Severity associated with this critical asset. Either an explicit severity can be set, or the severity can be increased or decreased. - :param value: Must be one of ["info", "low", "medium", "high", "critical", "increase", "decrease", "no-op"]. + :param value: Must be one of ["info", "low", "medium", "high", "critical", "increase", "decrease"]. :type value: str """ @@ -28,7 +28,6 @@ class SecurityMonitoringCriticalAssetSeverity(ModelSimple): "critical", "increase", "decrease", - "no-op", } INFO: ClassVar["SecurityMonitoringCriticalAssetSeverity"] LOW: ClassVar["SecurityMonitoringCriticalAssetSeverity"] @@ -37,7 +36,6 @@ class SecurityMonitoringCriticalAssetSeverity(ModelSimple): CRITICAL: ClassVar["SecurityMonitoringCriticalAssetSeverity"] INCREASE: ClassVar["SecurityMonitoringCriticalAssetSeverity"] DECREASE: ClassVar["SecurityMonitoringCriticalAssetSeverity"] - NO_OP: ClassVar["SecurityMonitoringCriticalAssetSeverity"] @cached_property def openapi_types(_): @@ -53,4 +51,3 @@ def openapi_types(_): SecurityMonitoringCriticalAssetSeverity.CRITICAL = SecurityMonitoringCriticalAssetSeverity("critical") SecurityMonitoringCriticalAssetSeverity.INCREASE = SecurityMonitoringCriticalAssetSeverity("increase") SecurityMonitoringCriticalAssetSeverity.DECREASE = SecurityMonitoringCriticalAssetSeverity("decrease") -SecurityMonitoringCriticalAssetSeverity.NO_OP = SecurityMonitoringCriticalAssetSeverity("no-op") diff --git a/src/datadog_api_client/v2/model/security_monitoring_critical_asset_update_attributes.py b/src/datadog_api_client/v2/model/security_monitoring_critical_asset_update_attributes.py index 0ee41511a1..3e977ad431 100644 --- a/src/datadog_api_client/v2/model/security_monitoring_critical_asset_update_attributes.py +++ b/src/datadog_api_client/v2/model/security_monitoring_critical_asset_update_attributes.py @@ -72,7 +72,7 @@ def __init__( :param rule_query: The rule query of the critical asset, with the same syntax as the search bar for detection rules. This determines which rules this critical asset will apply to. :type rule_query: str, optional - :param severity: Severity associated with this critical asset. Either an explicit severity can be set, or the severity can be increased or decreased, or the severity can be left unchanged (no-op). + :param severity: Severity associated with this critical asset. Either an explicit severity can be set, or the severity can be increased or decreased. :type severity: SecurityMonitoringCriticalAssetSeverity, optional :param tags: List of tags associated with the critical asset. diff --git a/tests/v1/cassettes/test_scenarios/test_create_a_new_dashboard_with_topology_map_data_streams_widget.frozen b/tests/v1/cassettes/test_scenarios/test_create_a_new_dashboard_with_topology_map_data_streams_widget.frozen new file mode 100644 index 0000000000..21a59912fa --- /dev/null +++ b/tests/v1/cassettes/test_scenarios/test_create_a_new_dashboard_with_topology_map_data_streams_widget.frozen @@ -0,0 +1 @@ +2026-03-20T18:16:51.929Z \ No newline at end of file diff --git a/tests/v1/cassettes/test_scenarios/test_create_a_new_dashboard_with_topology_map_data_streams_widget.yaml b/tests/v1/cassettes/test_scenarios/test_create_a_new_dashboard_with_topology_map_data_streams_widget.yaml new file mode 100644 index 0000000000..690a74f050 --- /dev/null +++ b/tests/v1/cassettes/test_scenarios/test_create_a_new_dashboard_with_topology_map_data_streams_widget.yaml @@ -0,0 +1,37 @@ +interactions: +- request: + body: '{"description":"","layout_type":"free","notify_list":[],"template_variables":[],"title":"Test-Create_a_new_dashboard_with_topology_map_data_streams_widget-1774030611","widgets":[{"definition":{"requests":[{"query":{"data_source":"data_streams","filters":["env:prod"],"query_string":"service:myservice","service":""},"request_type":"topology"}],"title":"","title_align":"left","title_size":"16","type":"topology_map"},"layout":{"height":15,"width":47,"x":0,"y":0}}]}' + headers: + accept: + - application/json + content-type: + - application/json + method: POST + uri: https://api.datadoghq.com/api/v1/dashboard + response: + body: + string: '{"id":"whr-253-7we","title":"Test-Create_a_new_dashboard_with_topology_map_data_streams_widget-1774030611","description":"","author_handle":"9919ec9b-ebc7-49ee-8dc8-03626e717cca","author_name":"CI + Account","layout_type":"free","url":"/dashboard/whr-253-7we/test-createanewdashboardwithtopologymapdatastreamswidget-1774030611","template_variables":[],"widgets":[{"definition":{"requests":[{"query":{"data_source":"data_streams","filters":["env:prod"],"query_string":"service:myservice","service":""},"request_type":"topology"}],"title":"","title_align":"left","title_size":"16","type":"topology_map"},"layout":{"height":15,"width":47,"x":0,"y":0},"id":1843670487553482}],"notify_list":[],"created_at":"2026-03-20T18:16:52.209473+00:00","modified_at":"2026-03-20T18:16:52.209473+00:00","restricted_roles":[]}' + headers: + content-type: + - application/json + status: + code: 200 + message: OK +- request: + body: null + headers: + accept: + - application/json + method: DELETE + uri: https://api.datadoghq.com/api/v1/dashboard/whr-253-7we + response: + body: + string: '{"deleted_dashboard_id":"whr-253-7we"}' + headers: + content-type: + - application/json + status: + code: 200 + message: OK +version: 1 diff --git a/tests/v1/features/dashboards.feature b/tests/v1/features/dashboards.feature index 0b753ac17b..fb95df356c 100644 --- a/tests/v1/features/dashboards.feature +++ b/tests/v1/features/dashboards.feature @@ -1028,6 +1028,19 @@ Feature: Dashboards And the response "widgets[0].definition.requests[0].sort.order_by[0].type" is equal to "formula" And the response "widgets[0].definition.requests[0].sort.order_by[0].index" is equal to 0 + @team:DataDog/dashboards-backend + Scenario: Create a new dashboard with topology_map data_streams widget + Given new "CreateDashboard" request + And body from file "dashboards_json_payload/topology_map_widget_data_streams.json" + When the request is sent + Then the response status is 200 OK + And the response "widgets[0].definition.type" is equal to "topology_map" + And the response "widgets[0].definition.requests[0].request_type" is equal to "topology" + And the response "widgets[0].definition.requests[0].query.data_source" is equal to "data_streams" + And the response "widgets[0].definition.requests[0].query.service" is equal to "" + And the response "widgets[0].definition.requests[0].query.filters" is equal to ["env:prod"] + And the response "widgets[0].definition.requests[0].query.query_string" is equal to "service:myservice" + @team:DataDog/dashboards-backend Scenario: Create a new dashboard with topology_map widget Given new "CreateDashboard" request diff --git a/tests/v1/features/dashboards_json_payload/topology_map_widget_data_streams.json b/tests/v1/features/dashboards_json_payload/topology_map_widget_data_streams.json new file mode 100644 index 0000000000..f454b974e6 --- /dev/null +++ b/tests/v1/features/dashboards_json_payload/topology_map_widget_data_streams.json @@ -0,0 +1,34 @@ +{ + "title": "{{ unique }}", + "description": "", + "widgets": [ + { + "layout": { + "x": 0, + "y": 0, + "width": 47, + "height": 15 + }, + "definition": { + "title": "", + "title_size": "16", + "title_align": "left", + "type": "topology_map", + "requests": [ + { + "request_type": "topology", + "query": { + "data_source": "data_streams", + "service": "", + "filters": ["env:prod"], + "query_string": "service:myservice" + } + } + ] + } + } + ], + "template_variables": [], + "layout_type": "free", + "notify_list": [] +}