From 98b2f1bfdcba26c25a6bdd1f908222d6f67c2772 Mon Sep 17 00:00:00 2001 From: "ci.datadog-api-spec" Date: Thu, 9 Jul 2026 19:04:59 +0000 Subject: [PATCH 1/2] Regenerate client from commit 2a28cbe of spec repo --- .generator/schemas/v1/openapi.yaml | 121 +++++++++++++++-- docs/datadog_api_client.v1.model.rst | 51 ++++++-- .../dashboards/CreateDashboard_2652180930.py | 16 +-- .../dashboards/CreateDashboard_2815497946.py | 63 +++++++++ .../model/topology_map_widget_definition.py | 100 +++++--------- ...logy_map_widget_definition_data_streams.py | 122 ++++++++++++++++++ ...ology_map_widget_definition_service_map.py | 122 ++++++++++++++++++ .../v1/model/topology_query.py | 68 ---------- .../v1/model/topology_query_data_streams.py | 80 ++++++++++++ ...opology_query_data_streams_data_source.py} | 13 +- .../v1/model/topology_query_service_map.py | 78 +++++++++++ .../topology_query_service_map_data_source.py | 35 +++++ .../v1/model/topology_request_data_streams.py | 56 ++++++++ ...est.py => topology_request_service_map.py} | 16 +-- src/datadog_api_client/v1/models/__init__.py | 24 +++- ...th_topology_map_data_streams_widget.frozen | 1 + ...with_topology_map_data_streams_widget.yaml | 37 ++++++ tests/v1/features/dashboards.feature | 13 ++ .../topology_map_widget_data_streams.json | 34 +++++ 19 files changed, 860 insertions(+), 190 deletions(-) create mode 100644 examples/v1/dashboards/CreateDashboard_2815497946.py create mode 100644 src/datadog_api_client/v1/model/topology_map_widget_definition_data_streams.py create mode 100644 src/datadog_api_client/v1/model/topology_map_widget_definition_service_map.py delete mode 100644 src/datadog_api_client/v1/model/topology_query.py create mode 100644 src/datadog_api_client/v1/model/topology_query_data_streams.py rename src/datadog_api_client/v1/model/{topology_query_data_source.py => topology_query_data_streams_data_source.py} (57%) create mode 100644 src/datadog_api_client/v1/model/topology_query_service_map.py create mode 100644 src/datadog_api_client/v1/model/topology_query_service_map_data_source.py create mode 100644 src/datadog_api_client/v1/model/topology_request_data_streams.py rename src/datadog_api_client/v1/model/{topology_request.py => topology_request_service_map.py} (69%) create mode 100644 tests/v1/cassettes/test_scenarios/test_create_a_new_dashboard_with_topology_map_data_streams_widget.frozen create mode 100644 tests/v1/cassettes/test_scenarios/test_create_a_new_dashboard_with_topology_map_data_streams_widget.yaml create mode 100644 tests/v1/features/dashboards_json_payload/topology_map_widget_data_streams.json diff --git a/.generator/schemas/v1/openapi.yaml b/.generator/schemas/v1/openapi.yaml index 455b80b93a..1c8fca287a 100644 --- a/.generator/schemas/v1/openapi.yaml +++ b/.generator/schemas/v1/openapi.yaml @@ -21724,6 +21724,46 @@ components: type: object TopologyMapWidgetDefinition: description: This widget displays a topology of nodes and edges for different data sources. It replaces the service map widget. + oneOf: + - $ref: "#/components/schemas/TopologyMapWidgetDefinitionDataStreams" + - $ref: "#/components/schemas/TopologyMapWidgetDefinitionServiceMap" + TopologyMapWidgetDefinitionDataStreams: + additionalProperties: false + description: Topology map widget backed by the data streams data source. + properties: + custom_links: + description: List of custom links. + items: + $ref: "#/components/schemas/WidgetCustomLink" + type: array + description: + description: The description of the widget. + type: string + requests: + description: One Topology request. + items: + $ref: "#/components/schemas/TopologyRequestDataStreams" + minItems: 1 + type: array + time: + $ref: "#/components/schemas/WidgetTime" + title: + description: Title of your widget. + type: string + title_align: + $ref: "#/components/schemas/WidgetTextAlign" + title_size: + description: Size of the title. + type: string + type: + $ref: "#/components/schemas/TopologyMapWidgetDefinitionType" + required: + - type + - requests + type: object + TopologyMapWidgetDefinitionServiceMap: + additionalProperties: false + description: Topology map widget backed by the service map data source. properties: custom_links: description: List of custom links. @@ -21734,11 +21774,13 @@ components: description: The description of the widget. type: string requests: - description: One or more Topology requests. + description: One Topology request. items: - $ref: "#/components/schemas/TopologyRequest" + $ref: "#/components/schemas/TopologyRequestServiceMap" minItems: 1 type: array + time: + $ref: "#/components/schemas/WidgetTime" title: description: Title of your widget. type: string @@ -21762,38 +21804,89 @@ components: type: string x-enum-varnames: - TOPOLOGY_MAP - TopologyQuery: - description: Query to service-based topology data sources like the service map or data streams. + TopologyQueryDataStreams: + additionalProperties: false + description: Query to the data streams topology data source. properties: data_source: - $ref: "#/components/schemas/TopologyQueryDataSource" + $ref: "#/components/schemas/TopologyQueryDataStreamsDataSource" filters: description: Your environment and primary tag (or * if enabled for your account). example: ["env:prod", "az:us-east"] items: - description: Environment or primary tag, generally in a key:value format + description: Environment or primary tag, generally in a key:value format. type: string minItems: 1 type: array + query_string: + description: A search string for filtering services. When set, this replaces the `service` field. + example: "service:myservice" + type: string service: - description: Name of the service - example: myService + description: (deprecated) Name of the service. Leave this empty and use query_string instead. + example: myservice type: string + required: + - data_source + - filters + - service type: object - TopologyQueryDataSource: - description: Name of the data source + TopologyQueryDataStreamsDataSource: + description: Name of the data source. enum: - data_streams - - service_map + example: data_streams type: string x-enum-varnames: - DATA_STREAMS + TopologyQueryServiceMap: + additionalProperties: false + description: Query to the service map topology data source. + properties: + data_source: + $ref: "#/components/schemas/TopologyQueryServiceMapDataSource" + filters: + description: Your environment and primary tag (or * if enabled for your account). + example: ["env:prod", "az:us-east"] + items: + description: Environment or primary tag, generally in a key:value format + type: string + minItems: 1 + type: array + query_string: + description: A search string for filtering services. When set, this replaces the `service` field. + example: "service:myservice" + type: string + service: + description: (deprecated) Name of the service. Leave this empty and use query_string instead. + example: myservice + type: string + required: + - data_source + - filters + - service + type: object + TopologyQueryServiceMapDataSource: + description: Name of the data source. + enum: + - service_map + example: service_map + type: string + x-enum-varnames: - SERVICE_MAP - TopologyRequest: - description: Request that will return nodes and edges to be used by topology map. + TopologyRequestDataStreams: + description: Request that returns nodes and edges from the data streams data source. + properties: + query: + $ref: "#/components/schemas/TopologyQueryDataStreams" + request_type: + $ref: "#/components/schemas/TopologyRequestType" + type: object + TopologyRequestServiceMap: + description: Request that returns nodes and edges from the service map data source. properties: query: - $ref: "#/components/schemas/TopologyQuery" + $ref: "#/components/schemas/TopologyQueryServiceMap" request_type: $ref: "#/components/schemas/TopologyRequestType" type: object diff --git a/docs/datadog_api_client.v1.model.rst b/docs/datadog_api_client.v1.model.rst index 048116b98c..2875379e62 100644 --- a/docs/datadog_api_client.v1.model.rst +++ b/docs/datadog_api_client.v1.model.rst @@ -6899,6 +6899,20 @@ datadog\_api\_client.v1.model.topology\_map\_widget\_definition module :members: :show-inheritance: +datadog\_api\_client.v1.model.topology\_map\_widget\_definition\_data\_streams module +------------------------------------------------------------------------------------- + +.. automodule:: datadog_api_client.v1.model.topology_map_widget_definition_data_streams + :members: + :show-inheritance: + +datadog\_api\_client.v1.model.topology\_map\_widget\_definition\_service\_map module +------------------------------------------------------------------------------------ + +.. automodule:: datadog_api_client.v1.model.topology_map_widget_definition_service_map + :members: + :show-inheritance: + datadog\_api\_client.v1.model.topology\_map\_widget\_definition\_type module ---------------------------------------------------------------------------- @@ -6906,24 +6920,45 @@ datadog\_api\_client.v1.model.topology\_map\_widget\_definition\_type module :members: :show-inheritance: -datadog\_api\_client.v1.model.topology\_query module ----------------------------------------------------- +datadog\_api\_client.v1.model.topology\_query\_data\_streams module +------------------------------------------------------------------- -.. automodule:: datadog_api_client.v1.model.topology_query +.. automodule:: datadog_api_client.v1.model.topology_query_data_streams :members: :show-inheritance: -datadog\_api\_client.v1.model.topology\_query\_data\_source module +datadog\_api\_client.v1.model.topology\_query\_data\_streams\_data\_source module +--------------------------------------------------------------------------------- + +.. automodule:: datadog_api_client.v1.model.topology_query_data_streams_data_source + :members: + :show-inheritance: + +datadog\_api\_client.v1.model.topology\_query\_service\_map module ------------------------------------------------------------------ -.. automodule:: datadog_api_client.v1.model.topology_query_data_source +.. automodule:: datadog_api_client.v1.model.topology_query_service_map :members: :show-inheritance: -datadog\_api\_client.v1.model.topology\_request module ------------------------------------------------------- +datadog\_api\_client.v1.model.topology\_query\_service\_map\_data\_source module +-------------------------------------------------------------------------------- + +.. automodule:: datadog_api_client.v1.model.topology_query_service_map_data_source + :members: + :show-inheritance: + +datadog\_api\_client.v1.model.topology\_request\_data\_streams module +--------------------------------------------------------------------- + +.. automodule:: datadog_api_client.v1.model.topology_request_data_streams + :members: + :show-inheritance: + +datadog\_api\_client.v1.model.topology\_request\_service\_map module +-------------------------------------------------------------------- -.. automodule:: datadog_api_client.v1.model.topology_request +.. automodule:: datadog_api_client.v1.model.topology_request_service_map :members: :show-inheritance: diff --git a/examples/v1/dashboards/CreateDashboard_2652180930.py b/examples/v1/dashboards/CreateDashboard_2652180930.py index 36789f5d2d..3d017c634d 100644 --- a/examples/v1/dashboards/CreateDashboard_2652180930.py +++ b/examples/v1/dashboards/CreateDashboard_2652180930.py @@ -6,11 +6,11 @@ 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_service_map import TopologyMapWidgetDefinitionServiceMap 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_request import TopologyRequest +from datadog_api_client.v1.model.topology_query_service_map import TopologyQueryServiceMap +from datadog_api_client.v1.model.topology_query_service_map_data_source import TopologyQueryServiceMapDataSource +from datadog_api_client.v1.model.topology_request_service_map import TopologyRequestServiceMap 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 @@ -27,16 +27,16 @@ width=47, height=15, ), - definition=TopologyMapWidgetDefinition( + definition=TopologyMapWidgetDefinitionServiceMap( title="", title_size="16", title_align=WidgetTextAlign.LEFT, type=TopologyMapWidgetDefinitionType.TOPOLOGY_MAP, requests=[ - TopologyRequest( + TopologyRequestServiceMap( request_type=TopologyRequestType.TOPOLOGY, - query=TopologyQuery( - data_source=TopologyQueryDataSource.SERVICE_MAP, + query=TopologyQueryServiceMap( + data_source=TopologyQueryServiceMapDataSource.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..7f700d15d9 --- /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_data_streams import ( + TopologyMapWidgetDefinitionDataStreams, +) +from datadog_api_client.v1.model.topology_map_widget_definition_type import TopologyMapWidgetDefinitionType +from datadog_api_client.v1.model.topology_query_data_streams import TopologyQueryDataStreams +from datadog_api_client.v1.model.topology_query_data_streams_data_source import TopologyQueryDataStreamsDataSource +from datadog_api_client.v1.model.topology_request_data_streams import TopologyRequestDataStreams +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=TopologyMapWidgetDefinitionDataStreams( + title="", + title_size="16", + title_align=WidgetTextAlign.LEFT, + type=TopologyMapWidgetDefinitionType.TOPOLOGY_MAP, + requests=[ + TopologyRequestDataStreams( + request_type=TopologyRequestType.TOPOLOGY, + query=TopologyQueryDataStreams( + data_source=TopologyQueryDataStreamsDataSource.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 7d74d12447..e3ea5adc68 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 @@ -3,68 +3,15 @@ # 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.widget_custom_link import WidgetCustomLink - from datadog_api_client.v1.model.topology_request import TopologyRequest - from datadog_api_client.v1.model.widget_text_align import WidgetTextAlign - from datadog_api_client.v1.model.topology_map_widget_definition_type import TopologyMapWidgetDefinitionType - - -class TopologyMapWidgetDefinition(ModelNormal): - validations = { - "requests": { - "min_items": 1, - }, - } - - @cached_property - def openapi_types(_): - from datadog_api_client.v1.model.widget_custom_link import WidgetCustomLink - from datadog_api_client.v1.model.topology_request import TopologyRequest - from datadog_api_client.v1.model.widget_text_align import WidgetTextAlign - from datadog_api_client.v1.model.topology_map_widget_definition_type import TopologyMapWidgetDefinitionType - - return { - "custom_links": ([WidgetCustomLink],), - "description": (str,), - "requests": ([TopologyRequest],), - "title": (str,), - "title_align": (WidgetTextAlign,), - "title_size": (str,), - "type": (TopologyMapWidgetDefinitionType,), - } - - attribute_map = { - "custom_links": "custom_links", - "description": "description", - "requests": "requests", - "title": "title", - "title_align": "title_align", - "title_size": "title_size", - "type": "type", - } - - def __init__( - self_, - requests: List[TopologyRequest], - type: TopologyMapWidgetDefinitionType, - custom_links: Union[List[WidgetCustomLink], UnsetType] = unset, - description: Union[str, UnsetType] = unset, - title: Union[str, UnsetType] = unset, - title_align: Union[WidgetTextAlign, UnsetType] = unset, - title_size: Union[str, UnsetType] = unset, - **kwargs, - ): +class TopologyMapWidgetDefinition(ModelComposed): + def __init__(self, **kwargs): """ This widget displays a topology of nodes and edges for different data sources. It replaces the service map widget. @@ -74,8 +21,11 @@ def __init__( :param description: The description of the widget. :type description: str, optional - :param requests: One or more Topology requests. - :type requests: [TopologyRequest] + :param requests: One Topology request. + :type requests: [TopologyRequestDataStreams] + + :param time: Time setting for the widget. + :type time: WidgetTime, optional :param title: Title of your widget. :type title: str, optional @@ -89,17 +39,27 @@ def __init__( :param type: Type of the topology map widget. :type type: TopologyMapWidgetDefinitionType """ - if custom_links is not unset: - kwargs["custom_links"] = custom_links - if description is not unset: - kwargs["description"] = description - if title is not unset: - kwargs["title"] = title - if title_align is not unset: - kwargs["title_align"] = title_align - if title_size is not unset: - kwargs["title_size"] = title_size super().__init__(kwargs) - self_.requests = requests - self_.type = type + @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_map_widget_definition_data_streams import ( + TopologyMapWidgetDefinitionDataStreams, + ) + from datadog_api_client.v1.model.topology_map_widget_definition_service_map import ( + TopologyMapWidgetDefinitionServiceMap, + ) + + return { + "oneOf": [ + TopologyMapWidgetDefinitionDataStreams, + TopologyMapWidgetDefinitionServiceMap, + ], + } diff --git a/src/datadog_api_client/v1/model/topology_map_widget_definition_data_streams.py b/src/datadog_api_client/v1/model/topology_map_widget_definition_data_streams.py new file mode 100644 index 0000000000..26b649bae2 --- /dev/null +++ b/src/datadog_api_client/v1/model/topology_map_widget_definition_data_streams.py @@ -0,0 +1,122 @@ +# 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.widget_custom_link import WidgetCustomLink + from datadog_api_client.v1.model.topology_request_data_streams import TopologyRequestDataStreams + from datadog_api_client.v1.model.widget_time import WidgetTime + from datadog_api_client.v1.model.widget_text_align import WidgetTextAlign + from datadog_api_client.v1.model.topology_map_widget_definition_type import TopologyMapWidgetDefinitionType + from datadog_api_client.v1.model.widget_legacy_live_span import WidgetLegacyLiveSpan + from datadog_api_client.v1.model.widget_new_live_span import WidgetNewLiveSpan + from datadog_api_client.v1.model.widget_new_fixed_span import WidgetNewFixedSpan + + +class TopologyMapWidgetDefinitionDataStreams(ModelNormal): + validations = { + "requests": { + "min_items": 1, + }, + } + + @cached_property + def additional_properties_type(_): + return None + + @cached_property + def openapi_types(_): + from datadog_api_client.v1.model.widget_custom_link import WidgetCustomLink + from datadog_api_client.v1.model.topology_request_data_streams import TopologyRequestDataStreams + from datadog_api_client.v1.model.widget_time import WidgetTime + from datadog_api_client.v1.model.widget_text_align import WidgetTextAlign + from datadog_api_client.v1.model.topology_map_widget_definition_type import TopologyMapWidgetDefinitionType + + return { + "custom_links": ([WidgetCustomLink],), + "description": (str,), + "requests": ([TopologyRequestDataStreams],), + "time": (WidgetTime,), + "title": (str,), + "title_align": (WidgetTextAlign,), + "title_size": (str,), + "type": (TopologyMapWidgetDefinitionType,), + } + + attribute_map = { + "custom_links": "custom_links", + "description": "description", + "requests": "requests", + "time": "time", + "title": "title", + "title_align": "title_align", + "title_size": "title_size", + "type": "type", + } + + def __init__( + self_, + requests: List[TopologyRequestDataStreams], + type: TopologyMapWidgetDefinitionType, + custom_links: Union[List[WidgetCustomLink], UnsetType] = unset, + description: Union[str, UnsetType] = unset, + time: Union[WidgetTime, WidgetLegacyLiveSpan, WidgetNewLiveSpan, WidgetNewFixedSpan, UnsetType] = unset, + title: Union[str, UnsetType] = unset, + title_align: Union[WidgetTextAlign, UnsetType] = unset, + title_size: Union[str, UnsetType] = unset, + **kwargs, + ): + """ + Topology map widget backed by the data streams data source. + + :param custom_links: List of custom links. + :type custom_links: [WidgetCustomLink], optional + + :param description: The description of the widget. + :type description: str, optional + + :param requests: One Topology request. + :type requests: [TopologyRequestDataStreams] + + :param time: Time setting for the widget. + :type time: WidgetTime, optional + + :param title: Title of your widget. + :type title: str, optional + + :param title_align: How to align the text on the widget. + :type title_align: WidgetTextAlign, optional + + :param title_size: Size of the title. + :type title_size: str, optional + + :param type: Type of the topology map widget. + :type type: TopologyMapWidgetDefinitionType + """ + if custom_links is not unset: + kwargs["custom_links"] = custom_links + if description is not unset: + kwargs["description"] = description + if time is not unset: + kwargs["time"] = time + if title is not unset: + kwargs["title"] = title + if title_align is not unset: + kwargs["title_align"] = title_align + if title_size is not unset: + kwargs["title_size"] = title_size + super().__init__(kwargs) + + self_.requests = requests + self_.type = type diff --git a/src/datadog_api_client/v1/model/topology_map_widget_definition_service_map.py b/src/datadog_api_client/v1/model/topology_map_widget_definition_service_map.py new file mode 100644 index 0000000000..87599de60c --- /dev/null +++ b/src/datadog_api_client/v1/model/topology_map_widget_definition_service_map.py @@ -0,0 +1,122 @@ +# 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.widget_custom_link import WidgetCustomLink + from datadog_api_client.v1.model.topology_request_service_map import TopologyRequestServiceMap + from datadog_api_client.v1.model.widget_time import WidgetTime + from datadog_api_client.v1.model.widget_text_align import WidgetTextAlign + from datadog_api_client.v1.model.topology_map_widget_definition_type import TopologyMapWidgetDefinitionType + from datadog_api_client.v1.model.widget_legacy_live_span import WidgetLegacyLiveSpan + from datadog_api_client.v1.model.widget_new_live_span import WidgetNewLiveSpan + from datadog_api_client.v1.model.widget_new_fixed_span import WidgetNewFixedSpan + + +class TopologyMapWidgetDefinitionServiceMap(ModelNormal): + validations = { + "requests": { + "min_items": 1, + }, + } + + @cached_property + def additional_properties_type(_): + return None + + @cached_property + def openapi_types(_): + from datadog_api_client.v1.model.widget_custom_link import WidgetCustomLink + from datadog_api_client.v1.model.topology_request_service_map import TopologyRequestServiceMap + from datadog_api_client.v1.model.widget_time import WidgetTime + from datadog_api_client.v1.model.widget_text_align import WidgetTextAlign + from datadog_api_client.v1.model.topology_map_widget_definition_type import TopologyMapWidgetDefinitionType + + return { + "custom_links": ([WidgetCustomLink],), + "description": (str,), + "requests": ([TopologyRequestServiceMap],), + "time": (WidgetTime,), + "title": (str,), + "title_align": (WidgetTextAlign,), + "title_size": (str,), + "type": (TopologyMapWidgetDefinitionType,), + } + + attribute_map = { + "custom_links": "custom_links", + "description": "description", + "requests": "requests", + "time": "time", + "title": "title", + "title_align": "title_align", + "title_size": "title_size", + "type": "type", + } + + def __init__( + self_, + requests: List[TopologyRequestServiceMap], + type: TopologyMapWidgetDefinitionType, + custom_links: Union[List[WidgetCustomLink], UnsetType] = unset, + description: Union[str, UnsetType] = unset, + time: Union[WidgetTime, WidgetLegacyLiveSpan, WidgetNewLiveSpan, WidgetNewFixedSpan, UnsetType] = unset, + title: Union[str, UnsetType] = unset, + title_align: Union[WidgetTextAlign, UnsetType] = unset, + title_size: Union[str, UnsetType] = unset, + **kwargs, + ): + """ + Topology map widget backed by the service map data source. + + :param custom_links: List of custom links. + :type custom_links: [WidgetCustomLink], optional + + :param description: The description of the widget. + :type description: str, optional + + :param requests: One Topology request. + :type requests: [TopologyRequestServiceMap] + + :param time: Time setting for the widget. + :type time: WidgetTime, optional + + :param title: Title of your widget. + :type title: str, optional + + :param title_align: How to align the text on the widget. + :type title_align: WidgetTextAlign, optional + + :param title_size: Size of the title. + :type title_size: str, optional + + :param type: Type of the topology map widget. + :type type: TopologyMapWidgetDefinitionType + """ + if custom_links is not unset: + kwargs["custom_links"] = custom_links + if description is not unset: + kwargs["description"] = description + if time is not unset: + kwargs["time"] = time + if title is not unset: + kwargs["title"] = title + if title_align is not unset: + kwargs["title_align"] = title_align + if title_size is not unset: + kwargs["title_size"] = title_size + super().__init__(kwargs) + + self_.requests = requests + self_.type = type diff --git a/src/datadog_api_client/v1/model/topology_query.py b/src/datadog_api_client/v1/model/topology_query.py deleted file mode 100644 index ca3798a86b..0000000000 --- a/src/datadog_api_client/v1/model/topology_query.py +++ /dev/null @@ -1,68 +0,0 @@ -# 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_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, - ): - """ - 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: TopologyQueryDataSource, optional - - :param filters: Your environment and primary tag (or * if enabled for your account). - :type filters: [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) diff --git a/src/datadog_api_client/v1/model/topology_query_data_streams.py b/src/datadog_api_client/v1/model/topology_query_data_streams.py new file mode 100644 index 0000000000..88c367572a --- /dev/null +++ b/src/datadog_api_client/v1/model/topology_query_data_streams.py @@ -0,0 +1,80 @@ +# 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_data_source import TopologyQueryDataStreamsDataSource + + +class TopologyQueryDataStreams(ModelNormal): + validations = { + "filters": { + "min_items": 1, + }, + } + + @cached_property + def additional_properties_type(_): + return None + + @cached_property + def openapi_types(_): + from datadog_api_client.v1.model.topology_query_data_streams_data_source import ( + TopologyQueryDataStreamsDataSource, + ) + + return { + "data_source": (TopologyQueryDataStreamsDataSource,), + "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: TopologyQueryDataStreamsDataSource, + filters: List[str], + service: str, + query_string: Union[str, UnsetType] = unset, + **kwargs, + ): + """ + Query to the data streams topology data source. + + :param data_source: Name of the data source. + :type data_source: TopologyQueryDataStreamsDataSource + + :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. When set, this replaces the ``service`` field. + :type query_string: str, optional + + :param service: (deprecated) Name of the service. Leave this empty and use query_string instead. + :type service: str + """ + if query_string is not unset: + kwargs["query_string"] = query_string + super().__init__(kwargs) + + self_.data_source = data_source + self_.filters = filters + self_.service = service 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_data_source.py similarity index 57% 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_data_source.py index 2c238f625c..25e61f3775 100644 --- a/src/datadog_api_client/v1/model/topology_query_data_source.py +++ b/src/datadog_api_client/v1/model/topology_query_data_streams_data_source.py @@ -12,20 +12,18 @@ from typing import ClassVar -class TopologyQueryDataSource(ModelSimple): +class TopologyQueryDataStreamsDataSource(ModelSimple): """ - Name of the data source + Name of the data source. - :param value: Must be one of ["data_streams", "service_map"]. + :param value: If omitted defaults to "data_streams". Must be one of ["data_streams"]. :type value: str """ allowed_values = { "data_streams", - "service_map", } - DATA_STREAMS: ClassVar["TopologyQueryDataSource"] - SERVICE_MAP: ClassVar["TopologyQueryDataSource"] + DATA_STREAMS: ClassVar["TopologyQueryDataStreamsDataSource"] @cached_property def openapi_types(_): @@ -34,5 +32,4 @@ def openapi_types(_): } -TopologyQueryDataSource.DATA_STREAMS = TopologyQueryDataSource("data_streams") -TopologyQueryDataSource.SERVICE_MAP = TopologyQueryDataSource("service_map") +TopologyQueryDataStreamsDataSource.DATA_STREAMS = TopologyQueryDataStreamsDataSource("data_streams") diff --git a/src/datadog_api_client/v1/model/topology_query_service_map.py b/src/datadog_api_client/v1/model/topology_query_service_map.py new file mode 100644 index 0000000000..813cc31009 --- /dev/null +++ b/src/datadog_api_client/v1/model/topology_query_service_map.py @@ -0,0 +1,78 @@ +# 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_service_map_data_source import TopologyQueryServiceMapDataSource + + +class TopologyQueryServiceMap(ModelNormal): + validations = { + "filters": { + "min_items": 1, + }, + } + + @cached_property + def additional_properties_type(_): + return None + + @cached_property + def openapi_types(_): + from datadog_api_client.v1.model.topology_query_service_map_data_source import TopologyQueryServiceMapDataSource + + return { + "data_source": (TopologyQueryServiceMapDataSource,), + "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: TopologyQueryServiceMapDataSource, + filters: List[str], + service: str, + query_string: Union[str, UnsetType] = unset, + **kwargs, + ): + """ + Query to the service map topology data source. + + :param data_source: Name of the data source. + :type data_source: TopologyQueryServiceMapDataSource + + :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. When set, this replaces the ``service`` field. + :type query_string: str, optional + + :param service: (deprecated) Name of the service. Leave this empty and use query_string instead. + :type service: str + """ + if query_string is not unset: + kwargs["query_string"] = query_string + super().__init__(kwargs) + + self_.data_source = data_source + self_.filters = filters + self_.service = service diff --git a/src/datadog_api_client/v1/model/topology_query_service_map_data_source.py b/src/datadog_api_client/v1/model/topology_query_service_map_data_source.py new file mode 100644 index 0000000000..f98f5b6469 --- /dev/null +++ b/src/datadog_api_client/v1/model/topology_query_service_map_data_source.py @@ -0,0 +1,35 @@ +# 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 TopologyQueryServiceMapDataSource(ModelSimple): + """ + Name of the data source. + + :param value: If omitted defaults to "service_map". Must be one of ["service_map"]. + :type value: str + """ + + allowed_values = { + "service_map", + } + SERVICE_MAP: ClassVar["TopologyQueryServiceMapDataSource"] + + @cached_property + def openapi_types(_): + return { + "value": (str,), + } + + +TopologyQueryServiceMapDataSource.SERVICE_MAP = TopologyQueryServiceMapDataSource("service_map") diff --git a/src/datadog_api_client/v1/model/topology_request_data_streams.py b/src/datadog_api_client/v1/model/topology_request_data_streams.py new file mode 100644 index 0000000000..be88d476b3 --- /dev/null +++ b/src/datadog_api_client/v1/model/topology_request_data_streams.py @@ -0,0 +1,56 @@ +# 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.v1.model.topology_query_data_streams import TopologyQueryDataStreams + from datadog_api_client.v1.model.topology_request_type import TopologyRequestType + + +class TopologyRequestDataStreams(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v1.model.topology_query_data_streams import TopologyQueryDataStreams + from datadog_api_client.v1.model.topology_request_type import TopologyRequestType + + return { + "query": (TopologyQueryDataStreams,), + "request_type": (TopologyRequestType,), + } + + attribute_map = { + "query": "query", + "request_type": "request_type", + } + + def __init__( + self_, + query: Union[TopologyQueryDataStreams, UnsetType] = unset, + request_type: Union[TopologyRequestType, UnsetType] = unset, + **kwargs, + ): + """ + Request that returns nodes and edges from the data streams data source. + + :param query: Query to the data streams topology data source. + :type query: TopologyQueryDataStreams, optional + + :param request_type: Widget request type. + :type request_type: TopologyRequestType, optional + """ + if query is not unset: + kwargs["query"] = query + if request_type is not unset: + kwargs["request_type"] = request_type + super().__init__(kwargs) diff --git a/src/datadog_api_client/v1/model/topology_request.py b/src/datadog_api_client/v1/model/topology_request_service_map.py similarity index 69% rename from src/datadog_api_client/v1/model/topology_request.py rename to src/datadog_api_client/v1/model/topology_request_service_map.py index 50abd1589d..3216f9d09a 100644 --- a/src/datadog_api_client/v1/model/topology_request.py +++ b/src/datadog_api_client/v1/model/topology_request_service_map.py @@ -14,18 +14,18 @@ if TYPE_CHECKING: - from datadog_api_client.v1.model.topology_query import TopologyQuery + from datadog_api_client.v1.model.topology_query_service_map import TopologyQueryServiceMap from datadog_api_client.v1.model.topology_request_type import TopologyRequestType -class TopologyRequest(ModelNormal): +class TopologyRequestServiceMap(ModelNormal): @cached_property def openapi_types(_): - from datadog_api_client.v1.model.topology_query import TopologyQuery + from datadog_api_client.v1.model.topology_query_service_map import TopologyQueryServiceMap from datadog_api_client.v1.model.topology_request_type import TopologyRequestType return { - "query": (TopologyQuery,), + "query": (TopologyQueryServiceMap,), "request_type": (TopologyRequestType,), } @@ -36,15 +36,15 @@ def openapi_types(_): def __init__( self_, - query: Union[TopologyQuery, UnsetType] = unset, + query: Union[TopologyQueryServiceMap, UnsetType] = unset, request_type: Union[TopologyRequestType, UnsetType] = unset, **kwargs, ): """ - Request that will return nodes and edges to be used by topology map. + Request that returns nodes and edges from the service map data source. - :param query: Query to service-based topology data sources like the service map or data streams. - :type query: TopologyQuery, optional + :param query: Query to the service map topology data source. + :type query: TopologyQueryServiceMap, optional :param request_type: Widget request type. :type request_type: TopologyRequestType, optional diff --git a/src/datadog_api_client/v1/models/__init__.py b/src/datadog_api_client/v1/models/__init__.py index 8f103b8feb..8daf2afaf2 100644 --- a/src/datadog_api_client/v1/models/__init__.py +++ b/src/datadog_api_client/v1/models/__init__.py @@ -1236,10 +1236,17 @@ from datadog_api_client.v1.model.toplist_widget_stacked_type import ToplistWidgetStackedType from datadog_api_client.v1.model.toplist_widget_style import ToplistWidgetStyle from datadog_api_client.v1.model.topology_map_widget_definition import TopologyMapWidgetDefinition +from datadog_api_client.v1.model.topology_map_widget_definition_data_streams import ( + TopologyMapWidgetDefinitionDataStreams, +) +from datadog_api_client.v1.model.topology_map_widget_definition_service_map import TopologyMapWidgetDefinitionServiceMap 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_request import TopologyRequest +from datadog_api_client.v1.model.topology_query_data_streams import TopologyQueryDataStreams +from datadog_api_client.v1.model.topology_query_data_streams_data_source import TopologyQueryDataStreamsDataSource +from datadog_api_client.v1.model.topology_query_service_map import TopologyQueryServiceMap +from datadog_api_client.v1.model.topology_query_service_map_data_source import TopologyQueryServiceMapDataSource +from datadog_api_client.v1.model.topology_request_data_streams import TopologyRequestDataStreams +from datadog_api_client.v1.model.topology_request_service_map import TopologyRequestServiceMap from datadog_api_client.v1.model.topology_request_type import TopologyRequestType from datadog_api_client.v1.model.tree_map_color_by import TreeMapColorBy from datadog_api_client.v1.model.tree_map_group_by import TreeMapGroupBy @@ -2420,10 +2427,15 @@ "ToplistWidgetStackedType", "ToplistWidgetStyle", "TopologyMapWidgetDefinition", + "TopologyMapWidgetDefinitionDataStreams", + "TopologyMapWidgetDefinitionServiceMap", "TopologyMapWidgetDefinitionType", - "TopologyQuery", - "TopologyQueryDataSource", - "TopologyRequest", + "TopologyQueryDataStreams", + "TopologyQueryDataStreamsDataSource", + "TopologyQueryServiceMap", + "TopologyQueryServiceMapDataSource", + "TopologyRequestDataStreams", + "TopologyRequestServiceMap", "TopologyRequestType", "TreeMapColorBy", "TreeMapGroupBy", 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 28e57ec5e2..984a718679 100644 --- a/tests/v1/features/dashboards.feature +++ b/tests/v1/features/dashboards.feature @@ -1128,6 +1128,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": [] +} From a1483a77d2af29e2e047098862d5b17cb7c0bba0 Mon Sep 17 00:00:00 2001 From: Adam Hooper Date: Fri, 10 Jul 2026 15:23:56 -0400 Subject: [PATCH 2/2] Fix oneOf deserialization for composed models with a list branch Two related deserialization bugs surfaced when parsing the topology_map and geomap dashboard widgets: - ModelNormal.set_attribute only propagated _unparsed from list elements that were UnparsedObject instances, missing nested OpenApiModel instances that were themselves _unparsed. A topology_map request whose query carried a mismatched data_source enum could ambiguously satisfy both oneOf variants without being flagged. - allows_single_value_input skipped list oneOf branches, returning False for a ModelComposed such as FormulaAndFunctionEventQueryGroupByConfig (oneOf of a group-by list or a flat fields object). deserialize_model then splatted a list input into positional args, crashing ModelComposed.__init__; the TypeError was swallowed during matching and masked the failure once _unparsed propagation was fixed. Propagate _unparsed from nested models in lists, and treat a list oneOf branch as allowing single-value input so list inputs route through get_oneof_instance. Applied to both the generated model_utils.py and the generator template. --- .generator/src/generator/templates/model_utils.j2 | 6 ++++-- src/datadog_api_client/model_utils.py | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.generator/src/generator/templates/model_utils.j2 b/.generator/src/generator/templates/model_utils.j2 index b0d701eaab..ea3a1f4770 100644 --- a/.generator/src/generator/templates/model_utils.j2 +++ b/.generator/src/generator/templates/model_utils.j2 @@ -83,7 +83,9 @@ def allows_single_value_input(cls): elif issubclass(cls, ModelComposed): if not cls._composed_schemas["oneOf"]: return False - return any(allows_single_value_input(c) for c in cls._composed_schemas["oneOf"] if not isinstance(c, list)) + return any( + isinstance(c, list) or allows_single_value_input(c) for c in cls._composed_schemas["oneOf"] + ) return False @@ -169,7 +171,7 @@ class OpenApiModel: ) if isinstance(value, list): for x in value: - if isinstance(x, UnparsedObject): + if isinstance(x, UnparsedObject) or (isinstance(x, OpenApiModel) and x._unparsed): self._unparsed = True if name in self.validations: check_validations(self.validations[name], name, value, self._configuration) diff --git a/src/datadog_api_client/model_utils.py b/src/datadog_api_client/model_utils.py index 9f508e1f57..2e10532ec1 100644 --- a/src/datadog_api_client/model_utils.py +++ b/src/datadog_api_client/model_utils.py @@ -84,7 +84,7 @@ def allows_single_value_input(cls): elif issubclass(cls, ModelComposed): if not cls._composed_schemas["oneOf"]: return False - return any(allows_single_value_input(c) for c in cls._composed_schemas["oneOf"] if not isinstance(c, list)) + return any(isinstance(c, list) or allows_single_value_input(c) for c in cls._composed_schemas["oneOf"]) return False @@ -181,7 +181,7 @@ def set_attribute(self, name, value): ) if isinstance(value, list): for x in value: - if isinstance(x, UnparsedObject): + if isinstance(x, UnparsedObject) or (isinstance(x, OpenApiModel) and x._unparsed): self._unparsed = True if name in self.validations: check_validations(self.validations[name], name, value, self._configuration)