diff --git a/.generator/schemas/v2/openapi.yaml b/.generator/schemas/v2/openapi.yaml index ac098a3c30..27ad049e17 100644 --- a/.generator/schemas/v2/openapi.yaml +++ b/.generator/schemas/v2/openapi.yaml @@ -65461,6 +65461,7 @@ components: - $ref: "#/components/schemas/SendSlackMessageAction" - $ref: "#/components/schemas/SendTeamsMessageAction" - $ref: "#/components/schemas/TriggerWorkflowAutomationAction" + - $ref: "#/components/schemas/RoutingRuleEscalationPolicyAction" RoutingRuleAttributes: description: Defines the configurable attributes of a routing rule, such as actions, query, time restriction, and urgency. properties: @@ -65478,6 +65479,52 @@ components: urgency: $ref: "#/components/schemas/Urgency" type: object + RoutingRuleEscalationPolicyAction: + description: "Triggers an escalation policy." + properties: + ack_timeout_minutes: + description: "The number of minutes before an acknowledged page is re-triggered." + example: 30 + format: int64 + type: integer + policy_id: + description: "The ID of the escalation policy to route to." + example: "00000000-0000-0000-0000-000000000000" + type: string + support_hours: + $ref: "#/components/schemas/RoutingRuleEscalationPolicyActionSupportHours" + type: + $ref: "#/components/schemas/RoutingRuleEscalationPolicyActionType" + urgency: + $ref: "#/components/schemas/Urgency" + required: + - type + - policy_id + type: object + RoutingRuleEscalationPolicyActionSupportHours: + description: "Support hours during which the escalation policy will be executed. Outside of these hours, the escalation policy will be on hold and triggered once the next support hours window starts. This is mutually exclusive with the top-level `time_restriction` field on the routing rule." + properties: + restrictions: + description: "The list of support hours time windows." + items: + $ref: "#/components/schemas/TimeRestriction" + type: array + time_zone: + description: "The time zone in which the support hours are expressed." + example: "" + type: string + required: + - time_zone + type: object + RoutingRuleEscalationPolicyActionType: + default: escalation_policy + description: "Indicates that the action pages an escalation policy. This action can be set once per routing rule item, and is mutually exclusive with the top-level `policy_id` field on the routing rule." + enum: + - escalation_policy + example: escalation_policy + type: string + x-enum-varnames: + - ESCALATION_POLICY RoutingRuleRelationships: description: Specifies relationships for a routing rule, linking to associated policy resources. properties: @@ -85180,7 +85227,7 @@ components: type: string type: object TimeRestrictions: - description: Holds time zone information and a list of time restrictions for a routing rule. + description: Time restrictions during which the routing rule is active. Outside of these hours, the rule does not match and routing continues to subsequent rules. This is mutually exclusive with the action-level `support_hours` field. properties: restrictions: description: Defines the list of time-based restrictions. diff --git a/docs/datadog_api_client.v2.model.rst b/docs/datadog_api_client.v2.model.rst index a178d7ce3d..e2cb0822f5 100644 --- a/docs/datadog_api_client.v2.model.rst +++ b/docs/datadog_api_client.v2.model.rst @@ -28452,6 +28452,27 @@ datadog\_api\_client.v2.model.routing\_rule\_attributes module :members: :show-inheritance: +datadog\_api\_client.v2.model.routing\_rule\_escalation\_policy\_action module +------------------------------------------------------------------------------ + +.. automodule:: datadog_api_client.v2.model.routing_rule_escalation_policy_action + :members: + :show-inheritance: + +datadog\_api\_client.v2.model.routing\_rule\_escalation\_policy\_action\_support\_hours module +---------------------------------------------------------------------------------------------- + +.. automodule:: datadog_api_client.v2.model.routing_rule_escalation_policy_action_support_hours + :members: + :show-inheritance: + +datadog\_api\_client.v2.model.routing\_rule\_escalation\_policy\_action\_type module +------------------------------------------------------------------------------------ + +.. automodule:: datadog_api_client.v2.model.routing_rule_escalation_policy_action_type + :members: + :show-inheritance: + datadog\_api\_client.v2.model.routing\_rule\_relationships module ----------------------------------------------------------------- diff --git a/examples/v2/on-call/SetOnCallTeamRoutingRules.py b/examples/v2/on-call/SetOnCallTeamRoutingRules.py index 55c0b0729d..cbaf88b433 100644 --- a/examples/v2/on-call/SetOnCallTeamRoutingRules.py +++ b/examples/v2/on-call/SetOnCallTeamRoutingRules.py @@ -5,8 +5,11 @@ from os import environ from datadog_api_client import ApiClient, Configuration from datadog_api_client.v2.api.on_call_api import OnCallApi -from datadog_api_client.v2.model.send_slack_message_action import SendSlackMessageAction -from datadog_api_client.v2.model.send_slack_message_action_type import SendSlackMessageActionType +from datadog_api_client.v2.model.routing_rule_escalation_policy_action import RoutingRuleEscalationPolicyAction +from datadog_api_client.v2.model.routing_rule_escalation_policy_action_support_hours import ( + RoutingRuleEscalationPolicyActionSupportHours, +) +from datadog_api_client.v2.model.routing_rule_escalation_policy_action_type import RoutingRuleEscalationPolicyActionType from datadog_api_client.v2.model.team_routing_rules_request import TeamRoutingRulesRequest from datadog_api_client.v2.model.team_routing_rules_request_data import TeamRoutingRulesRequestData from datadog_api_client.v2.model.team_routing_rules_request_data_attributes import TeamRoutingRulesRequestDataAttributes @@ -29,13 +32,13 @@ rules=[ TeamRoutingRulesRequestRule( actions=[ - SendSlackMessageAction( - channel="channel", - type=SendSlackMessageActionType.SEND_SLACK_MESSAGE, - workspace="workspace", + RoutingRuleEscalationPolicyAction( + type=RoutingRuleEscalationPolicyActionType.ESCALATION_POLICY, + policy_id=ESCALATION_POLICY_DATA_ID, + urgency=Urgency.LOW, ), ], - query="tags.service:test", + query="tags.service:time_restrictions", time_restriction=TimeRestrictions( time_zone="Europe/Paris", restrictions=[ @@ -54,11 +57,49 @@ ], ), ), + TeamRoutingRulesRequestRule( + actions=[ + RoutingRuleEscalationPolicyAction( + type=RoutingRuleEscalationPolicyActionType.ESCALATION_POLICY, + policy_id=ESCALATION_POLICY_DATA_ID, + urgency=Urgency.LOW, + ack_timeout_minutes=30, + support_hours=RoutingRuleEscalationPolicyActionSupportHours( + time_zone="Europe/Paris", + restrictions=[ + TimeRestriction( + end_day=Weekday.WEDNESDAY, + end_time="17:00:00", + start_day=Weekday.WEDNESDAY, + start_time="09:00:00", + ), + TimeRestriction( + end_day=Weekday.THURSDAY, + end_time="17:00:00", + start_day=Weekday.THURSDAY, + start_time="09:00:00", + ), + ], + ), + ), + ], + query="tags.service:support_hours_and_acknowledgment_timeout", + ), TeamRoutingRulesRequestRule( policy_id=ESCALATION_POLICY_DATA_ID, - query="", + query="tags.service:legacy_policy_definition", urgency=Urgency.LOW, ), + TeamRoutingRulesRequestRule( + actions=[ + RoutingRuleEscalationPolicyAction( + type=RoutingRuleEscalationPolicyActionType.ESCALATION_POLICY, + policy_id=ESCALATION_POLICY_DATA_ID, + urgency=Urgency.LOW, + ), + ], + query="", + ), ], ), id=DD_TEAM_DATA_ID, diff --git a/src/datadog_api_client/v2/model/routing_rule_action.py b/src/datadog_api_client/v2/model/routing_rule_action.py index 0aa3b0ab54..feaca7bdbc 100644 --- a/src/datadog_api_client/v2/model/routing_rule_action.py +++ b/src/datadog_api_client/v2/model/routing_rule_action.py @@ -32,6 +32,18 @@ def __init__(self, **kwargs): :param handle: The handle of the Workflow Automation to trigger. :type handle: str + + :param ack_timeout_minutes: The number of minutes before an acknowledged page is re-triggered. + :type ack_timeout_minutes: int, optional + + :param policy_id: The ID of the escalation policy to route to. + :type policy_id: str + + :param support_hours: Support hours during which the escalation policy will be executed. Outside of these hours, the escalation policy will be on hold and triggered once the next support hours window starts. This is mutually exclusive with the top-level `time_restriction` field on the routing rule. + :type support_hours: RoutingRuleEscalationPolicyActionSupportHours, optional + + :param urgency: Specifies the level of urgency for a routing rule (low, high, or dynamic). + :type urgency: Urgency, optional """ super().__init__(kwargs) @@ -47,11 +59,13 @@ def _composed_schemas(_): from datadog_api_client.v2.model.send_slack_message_action import SendSlackMessageAction from datadog_api_client.v2.model.send_teams_message_action import SendTeamsMessageAction from datadog_api_client.v2.model.trigger_workflow_automation_action import TriggerWorkflowAutomationAction + from datadog_api_client.v2.model.routing_rule_escalation_policy_action import RoutingRuleEscalationPolicyAction return { "oneOf": [ SendSlackMessageAction, SendTeamsMessageAction, TriggerWorkflowAutomationAction, + RoutingRuleEscalationPolicyAction, ], } diff --git a/src/datadog_api_client/v2/model/routing_rule_attributes.py b/src/datadog_api_client/v2/model/routing_rule_attributes.py index 6dcc03a6c4..08bd81013b 100644 --- a/src/datadog_api_client/v2/model/routing_rule_attributes.py +++ b/src/datadog_api_client/v2/model/routing_rule_attributes.py @@ -20,6 +20,7 @@ from datadog_api_client.v2.model.send_slack_message_action import SendSlackMessageAction from datadog_api_client.v2.model.send_teams_message_action import SendTeamsMessageAction from datadog_api_client.v2.model.trigger_workflow_automation_action import TriggerWorkflowAutomationAction + from datadog_api_client.v2.model.routing_rule_escalation_policy_action import RoutingRuleEscalationPolicyAction class RoutingRuleAttributes(ModelNormal): @@ -48,7 +49,11 @@ def __init__( actions: Union[ List[ Union[ - RoutingRuleAction, SendSlackMessageAction, SendTeamsMessageAction, TriggerWorkflowAutomationAction + RoutingRuleAction, + SendSlackMessageAction, + SendTeamsMessageAction, + TriggerWorkflowAutomationAction, + RoutingRuleEscalationPolicyAction, ] ], UnsetType, @@ -67,7 +72,7 @@ def __init__( :param query: Defines the query or condition that triggers this routing rule. :type query: str, optional - :param time_restriction: Holds time zone information and a list of time restrictions for a routing rule. + :param time_restriction: Time restrictions during which the routing rule is active. Outside of these hours, the rule does not match and routing continues to subsequent rules. This is mutually exclusive with the action-level ``support_hours`` field. :type time_restriction: TimeRestrictions, optional :param urgency: Specifies the level of urgency for a routing rule (low, high, or dynamic). diff --git a/src/datadog_api_client/v2/model/routing_rule_escalation_policy_action.py b/src/datadog_api_client/v2/model/routing_rule_escalation_policy_action.py new file mode 100644 index 0000000000..ddbe10934c --- /dev/null +++ b/src/datadog_api_client/v2/model/routing_rule_escalation_policy_action.py @@ -0,0 +1,89 @@ +# 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.routing_rule_escalation_policy_action_support_hours import ( + RoutingRuleEscalationPolicyActionSupportHours, + ) + from datadog_api_client.v2.model.routing_rule_escalation_policy_action_type import ( + RoutingRuleEscalationPolicyActionType, + ) + from datadog_api_client.v2.model.urgency import Urgency + + +class RoutingRuleEscalationPolicyAction(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.routing_rule_escalation_policy_action_support_hours import ( + RoutingRuleEscalationPolicyActionSupportHours, + ) + from datadog_api_client.v2.model.routing_rule_escalation_policy_action_type import ( + RoutingRuleEscalationPolicyActionType, + ) + from datadog_api_client.v2.model.urgency import Urgency + + return { + "ack_timeout_minutes": (int,), + "policy_id": (str,), + "support_hours": (RoutingRuleEscalationPolicyActionSupportHours,), + "type": (RoutingRuleEscalationPolicyActionType,), + "urgency": (Urgency,), + } + + attribute_map = { + "ack_timeout_minutes": "ack_timeout_minutes", + "policy_id": "policy_id", + "support_hours": "support_hours", + "type": "type", + "urgency": "urgency", + } + + def __init__( + self_, + policy_id: str, + type: RoutingRuleEscalationPolicyActionType, + ack_timeout_minutes: Union[int, UnsetType] = unset, + support_hours: Union[RoutingRuleEscalationPolicyActionSupportHours, UnsetType] = unset, + urgency: Union[Urgency, UnsetType] = unset, + **kwargs, + ): + """ + Triggers an escalation policy. + + :param ack_timeout_minutes: The number of minutes before an acknowledged page is re-triggered. + :type ack_timeout_minutes: int, optional + + :param policy_id: The ID of the escalation policy to route to. + :type policy_id: str + + :param support_hours: Support hours during which the escalation policy will be executed. Outside of these hours, the escalation policy will be on hold and triggered once the next support hours window starts. This is mutually exclusive with the top-level ``time_restriction`` field on the routing rule. + :type support_hours: RoutingRuleEscalationPolicyActionSupportHours, optional + + :param type: Indicates that the action pages an escalation policy. This action can be set once per routing rule item, and is mutually exclusive with the top-level ``policy_id`` field on the routing rule. + :type type: RoutingRuleEscalationPolicyActionType + + :param urgency: Specifies the level of urgency for a routing rule (low, high, or dynamic). + :type urgency: Urgency, optional + """ + if ack_timeout_minutes is not unset: + kwargs["ack_timeout_minutes"] = ack_timeout_minutes + if support_hours is not unset: + kwargs["support_hours"] = support_hours + if urgency is not unset: + kwargs["urgency"] = urgency + super().__init__(kwargs) + + self_.policy_id = policy_id + self_.type = type diff --git a/src/datadog_api_client/v2/model/routing_rule_escalation_policy_action_support_hours.py b/src/datadog_api_client/v2/model/routing_rule_escalation_policy_action_support_hours.py new file mode 100644 index 0000000000..726a443229 --- /dev/null +++ b/src/datadog_api_client/v2/model/routing_rule_escalation_policy_action_support_hours.py @@ -0,0 +1,49 @@ +# 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.time_restriction import TimeRestriction + + +class RoutingRuleEscalationPolicyActionSupportHours(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.time_restriction import TimeRestriction + + return { + "restrictions": ([TimeRestriction],), + "time_zone": (str,), + } + + attribute_map = { + "restrictions": "restrictions", + "time_zone": "time_zone", + } + + def __init__(self_, time_zone: str, restrictions: Union[List[TimeRestriction], UnsetType] = unset, **kwargs): + """ + Support hours during which the escalation policy will be executed. Outside of these hours, the escalation policy will be on hold and triggered once the next support hours window starts. This is mutually exclusive with the top-level ``time_restriction`` field on the routing rule. + + :param restrictions: The list of support hours time windows. + :type restrictions: [TimeRestriction], optional + + :param time_zone: The time zone in which the support hours are expressed. + :type time_zone: str + """ + if restrictions is not unset: + kwargs["restrictions"] = restrictions + super().__init__(kwargs) + + self_.time_zone = time_zone diff --git a/src/datadog_api_client/v2/model/routing_rule_escalation_policy_action_type.py b/src/datadog_api_client/v2/model/routing_rule_escalation_policy_action_type.py new file mode 100644 index 0000000000..d9fb978b54 --- /dev/null +++ b/src/datadog_api_client/v2/model/routing_rule_escalation_policy_action_type.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 RoutingRuleEscalationPolicyActionType(ModelSimple): + """ + Indicates that the action pages an escalation policy. This action can be set once per routing rule item, and is mutually exclusive with the top-level `policy_id` field on the routing rule. + + :param value: If omitted defaults to "escalation_policy". Must be one of ["escalation_policy"]. + :type value: str + """ + + allowed_values = { + "escalation_policy", + } + ESCALATION_POLICY: ClassVar["RoutingRuleEscalationPolicyActionType"] + + @cached_property + def openapi_types(_): + return { + "value": (str,), + } + + +RoutingRuleEscalationPolicyActionType.ESCALATION_POLICY = RoutingRuleEscalationPolicyActionType("escalation_policy") diff --git a/src/datadog_api_client/v2/model/team_routing_rules_request_rule.py b/src/datadog_api_client/v2/model/team_routing_rules_request_rule.py index 9ea2ec0ff4..ca5d9106a6 100644 --- a/src/datadog_api_client/v2/model/team_routing_rules_request_rule.py +++ b/src/datadog_api_client/v2/model/team_routing_rules_request_rule.py @@ -20,6 +20,7 @@ from datadog_api_client.v2.model.send_slack_message_action import SendSlackMessageAction from datadog_api_client.v2.model.send_teams_message_action import SendTeamsMessageAction from datadog_api_client.v2.model.trigger_workflow_automation_action import TriggerWorkflowAutomationAction + from datadog_api_client.v2.model.routing_rule_escalation_policy_action import RoutingRuleEscalationPolicyAction class TeamRoutingRulesRequestRule(ModelNormal): @@ -50,7 +51,11 @@ def __init__( actions: Union[ List[ Union[ - RoutingRuleAction, SendSlackMessageAction, SendTeamsMessageAction, TriggerWorkflowAutomationAction + RoutingRuleAction, + SendSlackMessageAction, + SendTeamsMessageAction, + TriggerWorkflowAutomationAction, + RoutingRuleEscalationPolicyAction, ] ], UnsetType, @@ -73,7 +78,7 @@ def __init__( :param query: Defines the query or condition that triggers this routing rule. :type query: str, optional - :param time_restriction: Holds time zone information and a list of time restrictions for a routing rule. + :param time_restriction: Time restrictions during which the routing rule is active. Outside of these hours, the rule does not match and routing continues to subsequent rules. This is mutually exclusive with the action-level ``support_hours`` field. :type time_restriction: TimeRestrictions, optional :param urgency: Specifies the level of urgency for a routing rule (low, high, or dynamic). diff --git a/src/datadog_api_client/v2/model/time_restrictions.py b/src/datadog_api_client/v2/model/time_restrictions.py index 4c9d8d8907..0fd627aaaa 100644 --- a/src/datadog_api_client/v2/model/time_restrictions.py +++ b/src/datadog_api_client/v2/model/time_restrictions.py @@ -32,7 +32,7 @@ def openapi_types(_): def __init__(self_, restrictions: List[TimeRestriction], time_zone: str, **kwargs): """ - Holds time zone information and a list of time restrictions for a routing rule. + Time restrictions during which the routing rule is active. Outside of these hours, the rule does not match and routing continues to subsequent rules. This is mutually exclusive with the action-level ``support_hours`` field. :param restrictions: Defines the list of time-based restrictions. :type restrictions: [TimeRestriction] diff --git a/src/datadog_api_client/v2/models/__init__.py b/src/datadog_api_client/v2/models/__init__.py index 9811009d73..2ec6194598 100644 --- a/src/datadog_api_client/v2/models/__init__.py +++ b/src/datadog_api_client/v2/models/__init__.py @@ -5761,6 +5761,11 @@ from datadog_api_client.v2.model.routing_rule import RoutingRule from datadog_api_client.v2.model.routing_rule_action import RoutingRuleAction from datadog_api_client.v2.model.routing_rule_attributes import RoutingRuleAttributes +from datadog_api_client.v2.model.routing_rule_escalation_policy_action import RoutingRuleEscalationPolicyAction +from datadog_api_client.v2.model.routing_rule_escalation_policy_action_support_hours import ( + RoutingRuleEscalationPolicyActionSupportHours, +) +from datadog_api_client.v2.model.routing_rule_escalation_policy_action_type import RoutingRuleEscalationPolicyActionType from datadog_api_client.v2.model.routing_rule_relationships import RoutingRuleRelationships from datadog_api_client.v2.model.routing_rule_relationships_policy import RoutingRuleRelationshipsPolicy from datadog_api_client.v2.model.routing_rule_relationships_policy_data import RoutingRuleRelationshipsPolicyData @@ -12084,6 +12089,9 @@ "RoutingRule", "RoutingRuleAction", "RoutingRuleAttributes", + "RoutingRuleEscalationPolicyAction", + "RoutingRuleEscalationPolicyActionSupportHours", + "RoutingRuleEscalationPolicyActionType", "RoutingRuleRelationships", "RoutingRuleRelationshipsPolicy", "RoutingRuleRelationshipsPolicyData", diff --git a/tests/v2/cassettes/test_scenarios/test_set_oncall_team_routing_rules_returns_ok_response.frozen b/tests/v2/cassettes/test_scenarios/test_set_oncall_team_routing_rules_returns_ok_response.frozen index 7a29240030..9eedde19e4 100644 --- a/tests/v2/cassettes/test_scenarios/test_set_oncall_team_routing_rules_returns_ok_response.frozen +++ b/tests/v2/cassettes/test_scenarios/test_set_oncall_team_routing_rules_returns_ok_response.frozen @@ -1 +1 @@ -2025-11-27T14:11:49.966Z \ No newline at end of file +2026-05-15T14:39:18.459Z \ No newline at end of file diff --git a/tests/v2/cassettes/test_scenarios/test_set_oncall_team_routing_rules_returns_ok_response.yaml b/tests/v2/cassettes/test_scenarios/test_set_oncall_team_routing_rules_returns_ok_response.yaml index 0c06835bb5..98aea91df9 100644 --- a/tests/v2/cassettes/test_scenarios/test_set_oncall_team_routing_rules_returns_ok_response.yaml +++ b/tests/v2/cassettes/test_scenarios/test_set_oncall_team_routing_rules_returns_ok_response.yaml @@ -1,6 +1,6 @@ interactions: - request: - body: '{"data":{"attributes":{"email":"Test-Set_On_Call_team_routing_rules_returns_OK_response-1764252709@datadoghq.com","title":"user + body: '{"data":{"attributes":{"email":"Test-Set_On_Call_team_routing_rules_returns_OK_response-1778855958@datadoghq.com","title":"user title"},"type":"users"}}' headers: accept: @@ -11,7 +11,7 @@ interactions: uri: https://api.datadoghq.com/api/v2/users response: body: - string: '{"data":{"type":"users","id":"0473ca92-cb9b-11f0-85f9-9a82ffe01443","attributes":{"name":null,"handle":"test-set_on_call_team_routing_rules_returns_ok_response-1764252709@datadoghq.com","created_at":"2025-11-27T14:11:50.355271+00:00","modified_at":"2025-11-27T14:11:50.355271+00:00","email":"test-set_on_call_team_routing_rules_returns_ok_response-1764252709@datadoghq.com","icon":"https://secure.gravatar.com/avatar/ad92f892fdf302962d879c0d02664d8e?s=48&d=retro","title":"user + string: '{"data":{"type":"users","id":"af4cfd73-8162-49c3-899a-101d0617d500","attributes":{"uuid":"af4cfd73-8162-49c3-899a-101d0617d500","name":null,"handle":"test-set_on_call_team_routing_rules_returns_ok_response-1778855958@datadoghq.com","created_at":"2026-05-15T14:39:20.154059+00:00","modified_at":"2026-05-15T14:39:20.154059+00:00","email":"test-set_on_call_team_routing_rules_returns_ok_response-1778855958@datadoghq.com","icon":"https://secure.gravatar.com/avatar/c530c1e2f9d5cddf9d34bed00a5e760b?s=48&d=retro","title":"user title","verified":false,"service_account":false,"disabled":false,"allowed_login_methods":[],"status":"Pending","last_login_time":null},"relationships":{"roles":{"data":[]},"org":{"data":{"type":"orgs","id":"4dee724d-00cc-11ea-a77b-570c9d03c6c5"}}}}} ' @@ -22,7 +22,7 @@ interactions: code: 201 message: Created - request: - body: '{"data":{"attributes":{"handle":"test-handle-a7692378c203a880","name":"test-name-a7692378c203a880"},"type":"team"}}' + body: '{"data":{"attributes":{"handle":"test-handle-fc62c73422bed141","name":"test-name-fc62c73422bed141"},"type":"team"}}' headers: accept: - application/json @@ -32,7 +32,7 @@ interactions: uri: https://api.datadoghq.com/api/v2/team response: body: - string: '{"data":{"id":"ba4fe917-0da4-4b40-96da-f9d7306d97d8","type":"team","attributes":{"avatar":null,"banner":14,"created_at":"2025-11-27T14:11:50.842947+00:00","description":null,"handle":"test-handle-a7692378c203a880","hidden_modules":[],"link_count":0,"modified_at":"2025-11-27T14:11:50.842947+00:00","name":"test-name-a7692378c203a880","summary":null,"user_count":0,"visible_modules":[]},"relationships":{"team_links":{"data":[],"links":{"related":"/api/v2/team/ba4fe917-0da4-4b40-96da-f9d7306d97d8/links"}},"user_team_permissions":{"links":{"related":"/api/v2/team/ba4fe917-0da4-4b40-96da-f9d7306d97d8/permission-settings"}}}}}' + string: '{"data":{"id":"5f48616e-52b1-4126-a255-0bd9f4820dc1","type":"team","attributes":{"avatar":null,"banner":11,"created_at":"2026-05-15T14:39:20.573129+00:00","description":null,"handle":"test-handle-fc62c73422bed141","hidden_modules":null,"is_managed":false,"link_count":0,"modified_at":"2026-05-15T14:39:20.573129+00:00","name":"test-name-fc62c73422bed141","summary":null,"user_count":0,"visible_modules":null},"relationships":{"team_links":{"data":[],"links":{"related":"/api/v2/team/5f48616e-52b1-4126-a255-0bd9f4820dc1/links"}},"user_team_permissions":{"data":null,"links":{"related":"/api/v2/team/5f48616e-52b1-4126-a255-0bd9f4820dc1/permission-settings"}}}}}' headers: content-type: - application/vnd.api+json @@ -40,8 +40,8 @@ interactions: code: 201 message: Created - request: - body: '{"data":{"attributes":{"layers":[{"effective_date":"2025-11-17T14:11:49.966Z","end_date":"2025-12-07T14:11:49.966Z","interval":{"days":1},"members":[{"user":{"id":"0473ca92-cb9b-11f0-85f9-9a82ffe01443"}}],"name":"Layer - 1","restrictions":[{"end_day":"friday","end_time":"17:00:00","start_day":"monday","start_time":"09:00:00"}],"rotation_start":"2025-11-22T14:11:49.966Z"}],"name":"Test-Set_On_Call_team_routing_rules_returns_OK_response-1764252709","time_zone":"America/New_York"},"relationships":{"teams":{"data":[{"id":"65aea9d0-941c-4607-bf8a-14fc0dac2820","type":"teams"}]}},"type":"schedules"}}' + body: '{"data":{"attributes":{"layers":[{"effective_date":"2026-05-05T14:39:18.459Z","end_date":"2026-05-25T14:39:18.459Z","interval":{"days":1},"members":[{"user":{"id":"af4cfd73-8162-49c3-899a-101d0617d500"}}],"name":"Layer + 1","restrictions":[{"end_day":"friday","end_time":"17:00:00","start_day":"monday","start_time":"09:00:00"}],"rotation_start":"2026-05-10T14:39:18.459Z"}],"name":"Test-Set_On_Call_team_routing_rules_returns_OK_response-1778855958","time_zone":"America/New_York"},"relationships":{"teams":{"data":[{"id":"65aea9d0-941c-4607-bf8a-14fc0dac2820","type":"teams"}]}},"type":"schedules"}}' headers: accept: - application/json @@ -51,7 +51,7 @@ interactions: uri: https://api.datadoghq.com/api/v2/on-call/schedules response: body: - string: '{"data":{"id":"1f9b0595-17a3-4d95-9b2e-edcea3b6e737","type":"schedules","attributes":{"name":"Test-Set_On_Call_team_routing_rules_returns_OK_response-1764252709","time_zone":"America/New_York"},"relationships":{"layers":{"data":[{"id":"0eecb6fe-83c6-48c9-9e0e-82379498f733","type":"layers"}]},"teams":{"data":[{"id":"65aea9d0-941c-4607-bf8a-14fc0dac2820","type":"teams"}]}}}}' + string: '{"data":{"id":"6417bbaa-a75e-474d-a45a-9af8e1a3907a","type":"schedules","attributes":{"name":"Test-Set_On_Call_team_routing_rules_returns_OK_response-1778855958","time_zone":"America/New_York"},"relationships":{"layers":{"data":[{"id":"d2139431-973b-42cc-a932-941aeff81783","type":"layers"}]},"teams":{"data":[{"id":"65aea9d0-941c-4607-bf8a-14fc0dac2820","type":"teams"}]}}}}' headers: content-type: - application/vnd.api+json @@ -59,7 +59,7 @@ interactions: code: 201 message: Created - request: - body: '{"data":{"attributes":{"name":"Test-Set_On_Call_team_routing_rules_returns_OK_response-1764252709","resolve_page_on_policy_end":true,"retries":2,"steps":[{"assignment":"default","escalate_after_seconds":3600,"targets":[{"id":"ba4fe917-0da4-4b40-96da-f9d7306d97d8","type":"teams"},{"id":"1f9b0595-17a3-4d95-9b2e-edcea3b6e737","type":"schedules"},{"config":{"schedule":{"position":"previous"}},"id":"1f9b0595-17a3-4d95-9b2e-edcea3b6e737","type":"schedules"},{"id":"0473ca92-cb9b-11f0-85f9-9a82ffe01443","type":"users"}]},{"assignment":"round-robin","escalate_after_seconds":3600,"targets":[{"id":"ba4fe917-0da4-4b40-96da-f9d7306d97d8","type":"teams"}]}]},"relationships":{"teams":{"data":[{"id":"ba4fe917-0da4-4b40-96da-f9d7306d97d8","type":"teams"}]}},"type":"policies"}}' + body: '{"data":{"attributes":{"name":"Test-Set_On_Call_team_routing_rules_returns_OK_response-1778855958","resolve_page_on_policy_end":true,"retries":2,"steps":[{"assignment":"default","escalate_after_seconds":3600,"targets":[{"id":"5f48616e-52b1-4126-a255-0bd9f4820dc1","type":"teams"},{"id":"6417bbaa-a75e-474d-a45a-9af8e1a3907a","type":"schedules"},{"config":{"schedule":{"position":"previous"}},"id":"6417bbaa-a75e-474d-a45a-9af8e1a3907a","type":"schedules"},{"id":"af4cfd73-8162-49c3-899a-101d0617d500","type":"users"}]},{"assignment":"round-robin","escalate_after_seconds":3600,"targets":[{"id":"5f48616e-52b1-4126-a255-0bd9f4820dc1","type":"teams"}]}]},"relationships":{"teams":{"data":[{"id":"5f48616e-52b1-4126-a255-0bd9f4820dc1","type":"teams"}]}},"type":"policies"}}' headers: accept: - application/json @@ -69,7 +69,7 @@ interactions: uri: https://api.datadoghq.com/api/v2/on-call/escalation-policies response: body: - string: '{"data":{"id":"66f0e922-2834-4d68-aa0b-98cc81fc2a9d","type":"policies","attributes":{"name":"Test-Set_On_Call_team_routing_rules_returns_OK_response-1764252709","resolve_page_on_policy_end":true,"retries":2},"relationships":{"steps":{"data":[{"id":"533f661e-6a1f-4327-8d3f-035add94cff8","type":"steps"},{"id":"b8948730-6aec-4a51-8662-cce4026b94dc","type":"steps"}]},"teams":{"data":[{"id":"ba4fe917-0da4-4b40-96da-f9d7306d97d8","type":"teams"}]}}}}' + string: '{"data":{"id":"3321cfa1-8420-4655-ac38-f51ea522834e","type":"policies","attributes":{"name":"Test-Set_On_Call_team_routing_rules_returns_OK_response-1778855958","resolve_page_on_policy_end":true,"retries":2,"tags":[]},"relationships":{"steps":{"data":[{"id":"cd41c9ed-3d97-469c-aa8a-9a36c0f45a82","type":"steps"},{"id":"102b0afe-da23-48ca-be15-699891fcbff7","type":"steps"}]},"teams":{"data":[{"id":"5f48616e-52b1-4126-a255-0bd9f4820dc1","type":"teams"}]}}}}' headers: content-type: - application/vnd.api+json @@ -77,17 +77,17 @@ interactions: code: 201 message: Created - request: - body: '{"data":{"attributes":{"rules":[{"actions":[{"channel":"channel","type":"send_slack_message","workspace":"workspace"}],"query":"tags.service:test","time_restriction":{"restrictions":[{"end_day":"monday","end_time":"17:00:00","start_day":"monday","start_time":"09:00:00"},{"end_day":"tuesday","end_time":"17:00:00","start_day":"tuesday","start_time":"09:00:00"}],"time_zone":"Europe/Paris"}},{"policy_id":"66f0e922-2834-4d68-aa0b-98cc81fc2a9d","query":"","urgency":"low"}]},"id":"ba4fe917-0da4-4b40-96da-f9d7306d97d8","type":"team_routing_rules"}}' + body: '{"data":{"attributes":{"rules":[{"actions":[{"policy_id":"3321cfa1-8420-4655-ac38-f51ea522834e","type":"escalation_policy","urgency":"low"}],"query":"tags.service:time_restrictions","time_restriction":{"restrictions":[{"end_day":"monday","end_time":"17:00:00","start_day":"monday","start_time":"09:00:00"},{"end_day":"tuesday","end_time":"17:00:00","start_day":"tuesday","start_time":"09:00:00"}],"time_zone":"Europe/Paris"}},{"actions":[{"ack_timeout_minutes":30,"policy_id":"3321cfa1-8420-4655-ac38-f51ea522834e","support_hours":{"restrictions":[{"end_day":"wednesday","end_time":"17:00:00","start_day":"wednesday","start_time":"09:00:00"},{"end_day":"thursday","end_time":"17:00:00","start_day":"thursday","start_time":"09:00:00"}],"time_zone":"Europe/Paris"},"type":"escalation_policy","urgency":"low"}],"query":"tags.service:support_hours_and_acknowledgment_timeout"},{"policy_id":"3321cfa1-8420-4655-ac38-f51ea522834e","query":"tags.service:legacy_policy_definition","urgency":"low"},{"actions":[{"policy_id":"3321cfa1-8420-4655-ac38-f51ea522834e","type":"escalation_policy","urgency":"low"}],"query":""}]},"id":"5f48616e-52b1-4126-a255-0bd9f4820dc1","type":"team_routing_rules"}}' headers: accept: - application/json content-type: - application/json method: PUT - uri: https://api.datadoghq.com/api/v2/on-call/teams/ba4fe917-0da4-4b40-96da-f9d7306d97d8/routing-rules?include=rules + uri: https://api.datadoghq.com/api/v2/on-call/teams/5f48616e-52b1-4126-a255-0bd9f4820dc1/routing-rules?include=rules response: body: - string: '{"data":{"id":"ba4fe917-0da4-4b40-96da-f9d7306d97d8","type":"team_routing_rules","relationships":{"rules":{"data":[{"id":"virtual-ba4fe917-0da4-4b40-96da-f9d7306d97d8-rule-0","type":"team_routing_rules"},{"id":"virtual-ba4fe917-0da4-4b40-96da-f9d7306d97d8-rule-1","type":"team_routing_rules"}]}}},"included":[{"id":"virtual-ba4fe917-0da4-4b40-96da-f9d7306d97d8-rule-0","type":"team_routing_rules","attributes":{"actions":[{"type":"send_slack_message","channel":"channel","workspace":"workspace"}],"query":"tags.service:test","time_restriction":{"time_zone":"Europe/Paris","restrictions":[{"start_time":"09:00:00","start_day":"monday","end_time":"17:00:00","end_day":"monday"},{"start_time":"09:00:00","start_day":"tuesday","end_time":"17:00:00","end_day":"tuesday"}]}},"relationships":{"policy":{"data":null}}},{"id":"virtual-ba4fe917-0da4-4b40-96da-f9d7306d97d8-rule-1","type":"team_routing_rules","attributes":{"actions":[],"query":"","urgency":"low"},"relationships":{"policy":{"data":{"id":"66f0e922-2834-4d68-aa0b-98cc81fc2a9d","type":"policies"}}}}]}' + string: '{"data":{"id":"5f48616e-52b1-4126-a255-0bd9f4820dc1","type":"team_routing_rules","relationships":{"rules":{"data":[{"id":"d4a7d064-0b02-4510-9412-24c95fdbef89","type":"team_routing_rules"},{"id":"a1a5fdd6-dd2b-4571-a86c-909a89a21490","type":"team_routing_rules"},{"id":"fdbe9494-e88c-4927-bb7e-407c0df33258","type":"team_routing_rules"},{"id":"8e059ecb-b492-4db6-accd-6eb69b4099b1","type":"team_routing_rules"}]}}},"included":[{"id":"d4a7d064-0b02-4510-9412-24c95fdbef89","type":"team_routing_rules","attributes":{"actions":[{"type":"escalation_policy","policy_id":"3321cfa1-8420-4655-ac38-f51ea522834e","urgency":"low"}],"query":"tags.service:time_restrictions","time_restriction":{"time_zone":"Europe/Paris","restrictions":[{"start_time":"09:00:00","start_day":"monday","end_time":"17:00:00","end_day":"monday"},{"start_time":"09:00:00","start_day":"tuesday","end_time":"17:00:00","end_day":"tuesday"}]},"urgency":"low"},"relationships":{"policy":{"data":{"id":"3321cfa1-8420-4655-ac38-f51ea522834e","type":"policies"}}}},{"id":"a1a5fdd6-dd2b-4571-a86c-909a89a21490","type":"team_routing_rules","attributes":{"actions":[{"type":"escalation_policy","policy_id":"3321cfa1-8420-4655-ac38-f51ea522834e","support_hours":{"time_zone":"Europe/Paris","restrictions":[{"start_time":"09:00:00","start_day":"wednesday","end_time":"17:00:00","end_day":"wednesday"},{"start_time":"09:00:00","start_day":"thursday","end_time":"17:00:00","end_day":"thursday"}]},"ack_timeout_minutes":30,"urgency":"low"}],"query":"tags.service:support_hours_and_acknowledgment_timeout","urgency":"low"},"relationships":{"policy":{"data":{"id":"3321cfa1-8420-4655-ac38-f51ea522834e","type":"policies"}}}},{"id":"fdbe9494-e88c-4927-bb7e-407c0df33258","type":"team_routing_rules","attributes":{"actions":[{"type":"escalation_policy","policy_id":"3321cfa1-8420-4655-ac38-f51ea522834e","urgency":"low"}],"query":"tags.service:legacy_policy_definition","urgency":"low"},"relationships":{"policy":{"data":{"id":"3321cfa1-8420-4655-ac38-f51ea522834e","type":"policies"}}}},{"id":"8e059ecb-b492-4db6-accd-6eb69b4099b1","type":"team_routing_rules","attributes":{"actions":[{"type":"escalation_policy","policy_id":"3321cfa1-8420-4655-ac38-f51ea522834e","urgency":"low"}],"query":"","urgency":"low"},"relationships":{"policy":{"data":{"id":"3321cfa1-8420-4655-ac38-f51ea522834e","type":"policies"}}}}]}' headers: content-type: - application/vnd.api+json @@ -95,17 +95,17 @@ interactions: code: 200 message: OK - request: - body: '{"data":{"attributes":{"rules":[]},"id":"ba4fe917-0da4-4b40-96da-f9d7306d97d8","type":"team_routing_rules"}}' + body: '{"data":{"attributes":{"rules":[]},"id":"5f48616e-52b1-4126-a255-0bd9f4820dc1","type":"team_routing_rules"}}' headers: accept: - application/json content-type: - application/json method: PUT - uri: https://api.datadoghq.com/api/v2/on-call/teams/ba4fe917-0da4-4b40-96da-f9d7306d97d8/routing-rules + uri: https://api.datadoghq.com/api/v2/on-call/teams/5f48616e-52b1-4126-a255-0bd9f4820dc1/routing-rules response: body: - string: '{"data":{"id":"ba4fe917-0da4-4b40-96da-f9d7306d97d8","type":"team_routing_rules","relationships":{"rules":{"data":[]}}}}' + string: '{"data":{"id":"5f48616e-52b1-4126-a255-0bd9f4820dc1","type":"team_routing_rules","relationships":{"rules":{"data":[]}}}}' headers: content-type: - application/vnd.api+json @@ -118,7 +118,7 @@ interactions: accept: - '*/*' method: DELETE - uri: https://api.datadoghq.com/api/v2/on-call/escalation-policies/66f0e922-2834-4d68-aa0b-98cc81fc2a9d + uri: https://api.datadoghq.com/api/v2/on-call/escalation-policies/3321cfa1-8420-4655-ac38-f51ea522834e response: body: string: '' @@ -132,7 +132,7 @@ interactions: accept: - '*/*' method: DELETE - uri: https://api.datadoghq.com/api/v2/on-call/schedules/1f9b0595-17a3-4d95-9b2e-edcea3b6e737 + uri: https://api.datadoghq.com/api/v2/on-call/schedules/6417bbaa-a75e-474d-a45a-9af8e1a3907a response: body: string: '' @@ -146,7 +146,7 @@ interactions: accept: - '*/*' method: DELETE - uri: https://api.datadoghq.com/api/v2/team/ba4fe917-0da4-4b40-96da-f9d7306d97d8 + uri: https://api.datadoghq.com/api/v2/team/5f48616e-52b1-4126-a255-0bd9f4820dc1 response: body: string: '' @@ -160,7 +160,7 @@ interactions: accept: - '*/*' method: DELETE - uri: https://api.datadoghq.com/api/v2/users/0473ca92-cb9b-11f0-85f9-9a82ffe01443 + uri: https://api.datadoghq.com/api/v2/users/af4cfd73-8162-49c3-899a-101d0617d500 response: body: string: '' diff --git a/tests/v2/features/on-call.feature b/tests/v2/features/on-call.feature index 0f4b2a0e34..a4ea9a7c4f 100644 --- a/tests/v2/features/on-call.feature +++ b/tests/v2/features/on-call.feature @@ -401,7 +401,7 @@ Feature: On-Call And there is a valid "schedule" in the system And there is a valid "escalation_policy" in the system And request contains "team_id" parameter from "dd_team.data.id" - And body with value {"data": {"attributes": {"rules": [{"actions": [{"channel": "channel", "type": "send_slack_message", "workspace": "workspace"}], "query": "tags.service:test", "time_restriction": {"time_zone": "Europe/Paris", "restrictions": [{"end_day": "monday", "end_time": "17:00:00", "start_day": "monday", "start_time": "09:00:00"}, {"end_day": "tuesday", "end_time": "17:00:00", "start_day": "tuesday", "start_time": "09:00:00"}]}}, {"policy_id": "{{ escalation_policy.data.id }}", "query": "", "urgency": "low"}]}, "id": "{{ dd_team.data.id }}", "type": "team_routing_rules"}} + And body with value {"data": {"attributes": {"rules": [{"actions": [{"type": "escalation_policy", "policy_id": "{{ escalation_policy.data.id }}", "urgency": "low"}], "query": "tags.service:time_restrictions", "time_restriction": {"time_zone": "Europe/Paris", "restrictions": [{"end_day": "monday", "end_time": "17:00:00", "start_day": "monday", "start_time": "09:00:00"}, {"end_day": "tuesday", "end_time": "17:00:00", "start_day": "tuesday", "start_time": "09:00:00"}]}}, {"actions": [{"type": "escalation_policy", "policy_id": "{{ escalation_policy.data.id }}", "urgency": "low", "ack_timeout_minutes": 30, "support_hours": {"time_zone": "Europe/Paris", "restrictions": [{"end_day": "wednesday", "end_time": "17:00:00", "start_day": "wednesday", "start_time": "09:00:00"}, {"end_day": "thursday", "end_time": "17:00:00", "start_day": "thursday", "start_time": "09:00:00"}]}}], "query": "tags.service:support_hours_and_acknowledgment_timeout"}, {"policy_id": "{{ escalation_policy.data.id }}", "query": "tags.service:legacy_policy_definition", "urgency": "low"}, {"actions": [{"type": "escalation_policy", "policy_id": "{{ escalation_policy.data.id }}", "urgency": "low"}], "query": ""}]}, "id": "{{ dd_team.data.id }}", "type": "team_routing_rules"}} And request contains "include" parameter with value "rules" When the request is sent Then the response status is 200 OK