From 031e28a2d7358f1dc28d1d429a6c49df9f6592dd Mon Sep 17 00:00:00 2001 From: "ci.datadog-api-spec" Date: Tue, 13 Oct 2026 08:00:33 +0000 Subject: [PATCH] Regenerate client from commit bb91e4f of spec repo --- .generator/schemas/v2/openapi.yaml | 478 +++++++++++- .../v2/on-call/CreateScheduleOverrides.py | 51 ++ examples/v2/on-call/DeleteScheduleOverride.py | 22 + examples/v2/on-call/ListScheduleOverrides.py | 24 + .../ListScheduleOverrides_1773803881.py | 21 + src/datadog_api_client/v2/api/on_call_api.py | 277 ++++++- .../create_override_request_attributes.py | 40 + .../v2/model/create_override_request_data.py | 65 ++ .../create_override_request_relationships.py | 54 ++ .../v2/model/create_overrides_request.py | 47 ++ .../v2/model/override_attributes.py | 57 ++ .../v2/model/override_create_response.py | 57 ++ .../v2/model/override_data.py | 73 ++ .../v2/model/override_data_type.py | 35 + .../v2/model/override_included.py | 44 ++ .../v2/model/override_relationships.py | 64 ++ .../model/override_relationships_schedule.py | 40 + .../override_relationships_schedule_data.py | 50 ++ ...erride_relationships_schedule_data_type.py | 35 + .../v2/model/override_relationships_user.py | 40 + .../model/override_relationships_user_data.py | 46 ++ .../override_relationships_user_data_type.py | 35 + src/datadog_api_client/v2/model/overrides.py | 57 ++ .../v2/model/schedule_user.py | 11 +- .../v2/model/schedule_user_attributes.py | 8 + .../v2/model/shift_included.py | 2 +- src/datadog_api_client/v2/models/__init__.py | 34 + .../test-runner-data/manifest.json | 21 + ...le-overrides-returns-created-response.json | 61 ++ ...-override-returns-no-content-response.json | 51 ++ ...chedule-overrides-returns-ok-response.json | 67 ++ .../test-server-data/v2/on-call.json | 735 +++++++++++++++++- tests/v2/features/given.json | 16 + tests/v2/features/on-call.feature | 93 +++ tests/v2/features/undo.json | 30 + 35 files changed, 2802 insertions(+), 39 deletions(-) create mode 100644 examples/v2/on-call/CreateScheduleOverrides.py create mode 100644 examples/v2/on-call/DeleteScheduleOverride.py create mode 100644 examples/v2/on-call/ListScheduleOverrides.py create mode 100644 examples/v2/on-call/ListScheduleOverrides_1773803881.py create mode 100644 src/datadog_api_client/v2/model/create_override_request_attributes.py create mode 100644 src/datadog_api_client/v2/model/create_override_request_data.py create mode 100644 src/datadog_api_client/v2/model/create_override_request_relationships.py create mode 100644 src/datadog_api_client/v2/model/create_overrides_request.py create mode 100644 src/datadog_api_client/v2/model/override_attributes.py create mode 100644 src/datadog_api_client/v2/model/override_create_response.py create mode 100644 src/datadog_api_client/v2/model/override_data.py create mode 100644 src/datadog_api_client/v2/model/override_data_type.py create mode 100644 src/datadog_api_client/v2/model/override_included.py create mode 100644 src/datadog_api_client/v2/model/override_relationships.py create mode 100644 src/datadog_api_client/v2/model/override_relationships_schedule.py create mode 100644 src/datadog_api_client/v2/model/override_relationships_schedule_data.py create mode 100644 src/datadog_api_client/v2/model/override_relationships_schedule_data_type.py create mode 100644 src/datadog_api_client/v2/model/override_relationships_user.py create mode 100644 src/datadog_api_client/v2/model/override_relationships_user_data.py create mode 100644 src/datadog_api_client/v2/model/override_relationships_user_data_type.py create mode 100644 src/datadog_api_client/v2/model/overrides.py create mode 100644 tests/generated-test/test-runner-data/v2/on-call/create-on-call-schedule-overrides-returns-created-response.json create mode 100644 tests/generated-test/test-runner-data/v2/on-call/delete-on-call-schedule-override-returns-no-content-response.json create mode 100644 tests/generated-test/test-runner-data/v2/on-call/list-on-call-schedule-overrides-returns-ok-response.json diff --git a/.generator/schemas/v2/openapi.yaml b/.generator/schemas/v2/openapi.yaml index 81ee332d55..9e5743014d 100644 --- a/.generator/schemas/v2/openapi.yaml +++ b/.generator/schemas/v2/openapi.yaml @@ -25915,6 +25915,57 @@ components: - type - attributes type: object + CreateOverrideRequestAttributes: + description: Attributes for creating an on-call schedule override. + properties: + end: + description: The end time of the override. + example: "2024-01-08T02:53:01.000000000Z" + format: date-time + type: string + start: + description: The start time of the override. + example: "2024-01-07T02:53:01.000000000Z" + format: date-time + type: string + required: + - start + - end + type: object + CreateOverrideRequestData: + description: Data for creating an on-call schedule override. + properties: + attributes: + $ref: "#/components/schemas/CreateOverrideRequestAttributes" + relationships: + $ref: "#/components/schemas/CreateOverrideRequestRelationships" + type: + $ref: "#/components/schemas/OverrideDataType" + required: + - type + - attributes + type: object + CreateOverrideRequestRelationships: + description: Relationships to set when creating an on-call schedule override. + properties: + overridden_user: + $ref: "#/components/schemas/OverrideRelationshipsUser" + user: + $ref: "#/components/schemas/OverrideRelationshipsUser" + type: object + CreateOverridesRequest: + description: Request to create one or more on-call schedule overrides. You can create up to 25 overrides in a single request. + properties: + data: + description: A list of on-call schedule overrides to create. + items: + $ref: "#/components/schemas/CreateOverrideRequestData" + maxItems: 25 + minItems: 1 + type: array + required: + - data + type: object CreatePageRequest: description: Full request to trigger an On-Call Page. example: @@ -92213,6 +92264,202 @@ components: - ARRAY_NUMBER - ARRAY_BOOLEAN - ARRAY_OBJECT + OverrideAttributes: + description: Attributes for an on-call schedule override. + properties: + end: + description: The end time of the override. + format: date-time + type: string + inactive: + description: Whether the override is inactive (for example, because its time range has ended). + type: boolean + start: + description: The start time of the override. + format: date-time + type: string + type: object + OverrideCreateResponse: + description: The on-call schedule overrides that were created, and any related included resources (such as users). + example: + data: + - attributes: + end: "2024-01-08T02:53:01.000000000Z" + inactive: false + start: "2024-01-07T02:53:01.000000000Z" + id: 00000000-0000-0000-0000-000000000000 + relationships: + schedule: + data: + id: 3653d3c6-0c75-11ea-ad28-fb5701eabc7d + type: schedules + user: + data: + id: 00000000-aba1-0000-0000-000000000000 + type: users + type: overrides + included: + - attributes: + email: jane.doe@example.com + name: "Jane Doe" + status: "" + id: 00000000-aba1-0000-0000-000000000000 + type: users + properties: + data: + description: The on-call schedule overrides that were created. + items: + $ref: "#/components/schemas/OverrideData" + type: array + included: + description: Related resources referenced in the overrides' relationships, such as users. + items: + $ref: "#/components/schemas/OverrideIncluded" + type: array + required: + - data + type: object + OverrideData: + description: Data for an on-call schedule override. + properties: + attributes: + $ref: "#/components/schemas/OverrideAttributes" + id: + description: The unique identifier of the override. + example: "00000000-0000-0000-0000-000000000000" + type: string + relationships: + $ref: "#/components/schemas/OverrideRelationships" + type: + $ref: "#/components/schemas/OverrideDataType" + required: + - type + - id + type: object + OverrideDataType: + default: overrides + description: "Indicates that the resource is of type 'overrides'." + enum: + - overrides + example: overrides + type: string + x-enum-varnames: + - OVERRIDES + OverrideIncluded: + description: Included data for on-call schedule override operations. + oneOf: + - $ref: "#/components/schemas/ScheduleUser" + OverrideRelationships: + description: Relationships for an on-call schedule override. + properties: + overridden_user: + $ref: "#/components/schemas/OverrideRelationshipsUser" + schedule: + $ref: "#/components/schemas/OverrideRelationshipsSchedule" + user: + $ref: "#/components/schemas/OverrideRelationshipsUser" + type: object + OverrideRelationshipsSchedule: + description: "Defines the relationship between an override and the schedule it belongs to." + properties: + data: + $ref: "#/components/schemas/OverrideRelationshipsScheduleData" + required: + - data + type: object + OverrideRelationshipsScheduleData: + description: "A reference to the schedule the override belongs to, containing the schedule's ID and resource type." + properties: + id: + description: "The unique identifier of the schedule." + example: "3653d3c6-0c75-11ea-ad28-fb5701eabc7d" + type: string + type: + $ref: "#/components/schemas/OverrideRelationshipsScheduleDataType" + required: + - type + - id + type: object + OverrideRelationshipsScheduleDataType: + default: schedules + description: "Indicates that the related resource is of type 'schedules'." + enum: + - schedules + example: schedules + type: string + x-enum-varnames: + - SCHEDULES + OverrideRelationshipsUser: + description: "Defines the relationship between an override and one of its associated users." + properties: + data: + $ref: "#/components/schemas/OverrideRelationshipsUserData" + nullable: true + required: + - data + type: object + OverrideRelationshipsUserData: + description: "A reference to a user, containing the user's ID and resource type." + properties: + id: + description: "The unique identifier of the user." + example: "00000000-0000-0000-0000-000000000000" + type: string + type: + $ref: "#/components/schemas/OverrideRelationshipsUserDataType" + required: + - type + - id + type: object + OverrideRelationshipsUserDataType: + default: users + description: "Indicates that the related resource is of type 'users'." + enum: + - users + example: users + type: string + x-enum-varnames: + - USERS + Overrides: + description: A list of on-call schedule overrides and any related included resources (such as users). + example: + data: + - attributes: + end: "2024-01-08T02:53:01.000000000Z" + inactive: false + start: "2024-01-07T02:53:01.000000000Z" + id: 00000000-0000-0000-0000-000000000000 + relationships: + schedule: + data: + id: 3653d3c6-0c75-11ea-ad28-fb5701eabc7d + type: schedules + user: + data: + id: 00000000-aba1-0000-0000-000000000000 + type: users + type: overrides + included: + - attributes: + email: jane.doe@example.com + name: "Jane Doe" + status: "" + id: 00000000-aba1-0000-0000-000000000000 + type: users + properties: + data: + description: A list of on-call schedule overrides. + items: + $ref: "#/components/schemas/OverrideData" + type: array + included: + description: Related resources referenced in the overrides' relationships, such as users. + items: + $ref: "#/components/schemas/OverrideIncluded" + type: array + required: + - data + type: object OverwriteAllocationsRequest: description: Request to overwrite targeting rules (allocations) for a feature flag in an environment. properties: @@ -109205,15 +109452,21 @@ components: $ref: "#/components/schemas/ScheduleUserAttributes" id: description: The unique user identifier. + example: "00000000-0000-0000-0000-000000000000" type: string type: $ref: "#/components/schemas/ScheduleUserType" required: - type + - id type: object ScheduleUserAttributes: description: Provides basic user information for a schedule, including a name and email address. properties: + color: + description: "The user's on-call color, as a hex code (for example, `#FF0000`). Included only when `user.color` is requested in the `include` parameter." + example: "#FF0000" + type: string email: description: The user's email address. example: "jane.doe@example.com" @@ -202887,7 +203140,7 @@ paths: schema: example: 3653d3c6-0c75-11ea-ad28-fb5701eabc7d type: string - - description: Retrieves the on-call user at the given timestamp in RFC3339 format (for example, `2025-05-07T02:53:01Z` or `2025-05-07T02:53:01+00:00`). When using timezone offsets with `+` or `-`, ensure proper URL encoding (`+` should be encoded as `%2B`). Defaults to the current time if omitted. + - description: Retrieves the on-call user at the given timestamp in RFC3339 format (for example, `2025-05-07T02:53:01Z` or `2025-05-07T02:53:01+00:00`). If you use a time zone offset with `+`, URL-encode the `+` as `%2B`. Defaults to the current time if omitted. in: query name: filter[at_ts] schema: @@ -202936,6 +203189,227 @@ paths: permissions: - on_call_read x-sunset: "2027-02-01" + /api/v2/on-call/schedules/{schedule_id}/overrides: + get: + description: Retrieve a list of overrides for the specified On-Call schedule within a given time range. + operationId: ListScheduleOverrides + parameters: + - description: The ID of the schedule. + in: path + name: schedule_id + required: true + schema: + example: 3653d3c6-0c75-11ea-ad28-fb5701eabc7d + type: string + - description: "Start of the time range to retrieve overrides for, in RFC3339 format (for example, `2025-05-07T02:53:01Z` or `2025-05-07T02:53:01+00:00`). If you use a time zone offset with `+`, URL-encode the `+` as `%2B`." + in: query + name: filter[start] + required: true + schema: + example: "2024-01-07T02:53:01Z" + format: date-time + type: string + - description: "End of the time range to retrieve overrides for, in RFC3339 format (for example, `2025-05-07T02:53:01Z` or `2025-05-07T02:53:01+00:00`). If you use a time zone offset with `+`, URL-encode the `+` as `%2B`. The time range cannot exceed 45 days." + in: query + name: filter[end] + required: true + schema: + example: "2024-01-14T02:53:01Z" + format: date-time + type: string + - description: "Comma-separated list of related resources to include in the response. Allowed values: `user`, `overridden_user`, `user.color`." + in: query + name: include + schema: + type: string + - description: Number of overrides to return per page. The maximum allowed value is 50. + in: query + name: "page[size]" + schema: + default: 10 + example: 10 + format: int64 + maximum: 50 + type: integer + - $ref: "#/components/parameters/PageNumber" + responses: + "200": + content: + application/json: + examples: + default: + value: + data: + - attributes: + end: "2024-01-08T02:53:01.000000000Z" + inactive: false + start: "2024-01-07T02:53:01.000000000Z" + id: 00000000-0000-0000-0000-000000000000 + relationships: + schedule: + data: + id: 3653d3c6-0c75-11ea-ad28-fb5701eabc7d + type: schedules + user: + data: + id: 00000000-aba1-0000-0000-000000000000 + type: users + type: overrides + schema: + $ref: "#/components/schemas/Overrides" + description: OK + "400": + $ref: "#/components/responses/BadRequestResponse" + "401": + $ref: "#/components/responses/UnauthorizedResponse" + "403": + $ref: "#/components/responses/ForbiddenResponse" + "404": + $ref: "#/components/responses/NotFoundResponse" + "429": + $ref: "#/components/responses/TooManyRequestsResponse" + security: + - apiKeyAuth: [] + appKeyAuth: [] + - AuthZ: [] + summary: List On-Call schedule overrides + tags: + - On-Call + x-pagination: + limitParam: page[size] + pageParam: page[number] + resultsPath: data + "x-permission": + operator: AND + permissions: + - on_call_read + post: + description: Create one or more overrides for the specified On-Call schedule. + operationId: CreateScheduleOverrides + parameters: + - description: The ID of the schedule. + in: path + name: schedule_id + required: true + schema: + example: 3653d3c6-0c75-11ea-ad28-fb5701eabc7d + type: string + - description: "Comma-separated list of included relationships to be returned. Allowed values: `user`, `overridden_user`, `user.color`." + in: query + name: include + schema: + type: string + requestBody: + content: + application/json: + examples: + default: + value: + data: + - attributes: + end: "2024-01-08T02:53:01.000000000Z" + start: "2024-01-07T02:53:01.000000000Z" + relationships: + user: + data: + id: 00000000-aba1-0000-0000-000000000000 + type: users + type: overrides + schema: + $ref: "#/components/schemas/CreateOverridesRequest" + required: true + responses: + "201": + content: + application/json: + examples: + default: + value: + data: + - attributes: + end: "2024-01-08T02:53:01.000000000Z" + inactive: false + start: "2024-01-07T02:53:01.000000000Z" + id: 00000000-0000-0000-0000-000000000000 + relationships: + schedule: + data: + id: 3653d3c6-0c75-11ea-ad28-fb5701eabc7d + type: schedules + user: + data: + id: 00000000-aba1-0000-0000-000000000000 + type: users + type: overrides + schema: + $ref: "#/components/schemas/OverrideCreateResponse" + description: Created + "400": + $ref: "#/components/responses/BadRequestResponse" + "401": + $ref: "#/components/responses/UnauthorizedResponse" + "403": + $ref: "#/components/responses/ForbiddenResponse" + "404": + $ref: "#/components/responses/NotFoundResponse" + "429": + $ref: "#/components/responses/TooManyRequestsResponse" + security: + - apiKeyAuth: [] + appKeyAuth: [] + - AuthZ: [] + summary: Create On-Call schedule overrides + tags: + - On-Call + "x-permission": + operator: OR + permissions: + - on_call_respond + - on_call_write + /api/v2/on-call/schedules/{schedule_id}/overrides/{override_id}: + delete: + description: Delete an override from the specified On-Call schedule. + operationId: DeleteScheduleOverride + parameters: + - description: The ID of the schedule. + in: path + name: schedule_id + required: true + schema: + example: 3653d3c6-0c75-11ea-ad28-fb5701eabc7d + type: string + - description: The ID of the override. + in: path + name: override_id + required: true + schema: + example: 00000000-0000-0000-0000-000000000000 + type: string + responses: + "204": + description: No Content + "400": + $ref: "#/components/responses/BadRequestResponse" + "401": + $ref: "#/components/responses/UnauthorizedResponse" + "403": + $ref: "#/components/responses/ForbiddenResponse" + "404": + $ref: "#/components/responses/NotFoundResponse" + "429": + $ref: "#/components/responses/TooManyRequestsResponse" + security: + - apiKeyAuth: [] + appKeyAuth: [] + - AuthZ: [] + summary: Delete On-Call schedule override + tags: + - On-Call + "x-permission": + operator: OR + permissions: + - on_call_respond + - on_call_write /api/v2/on-call/schedules/{schedule_id}/responders: get: description: "Retrieves the on-call responders for the specified schedule, grouped by position (previous, current, next), at a given time. Supports schedules with multiple concurrent on-call responders at a position, by returning a list of shifts per position." @@ -202959,7 +203433,7 @@ paths: schema: example: previous,current,next type: string - - description: "Retrieves the on-call responders at the given timestamp in RFC3339 format (for example, `2025-05-07T02:53:01Z` or `2025-05-07T02:53:01+00:00`). When using timezone offsets with `+` or `-`, ensure proper URL encoding (`+` should be encoded as `%2B`). Defaults to the current time if omitted." + - description: "Retrieves the on-call responders at the given timestamp in RFC3339 format (for example, `2025-05-07T02:53:01Z` or `2025-05-07T02:53:01+00:00`). If you use a time zone offset with `+`, URL-encode the `+` as `%2B`. Defaults to the current time if omitted." in: query name: filter[at_ts] schema: diff --git a/examples/v2/on-call/CreateScheduleOverrides.py b/examples/v2/on-call/CreateScheduleOverrides.py new file mode 100644 index 0000000000..8f331acce1 --- /dev/null +++ b/examples/v2/on-call/CreateScheduleOverrides.py @@ -0,0 +1,51 @@ +""" +Create On-Call schedule overrides returns "Created" response +""" + +from datetime import datetime +from dateutil.relativedelta import relativedelta +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.create_override_request_attributes import CreateOverrideRequestAttributes +from datadog_api_client.v2.model.create_override_request_data import CreateOverrideRequestData +from datadog_api_client.v2.model.create_override_request_relationships import CreateOverrideRequestRelationships +from datadog_api_client.v2.model.create_overrides_request import CreateOverridesRequest +from datadog_api_client.v2.model.override_data_type import OverrideDataType +from datadog_api_client.v2.model.override_relationships_user import OverrideRelationshipsUser +from datadog_api_client.v2.model.override_relationships_user_data import OverrideRelationshipsUserData +from datadog_api_client.v2.model.override_relationships_user_data_type import OverrideRelationshipsUserDataType + +# there is a valid "schedule" in the system +SCHEDULE_DATA_ID = environ["SCHEDULE_DATA_ID"] + +# there is a valid "user" in the system +USER_DATA_ID = environ["USER_DATA_ID"] + +body = CreateOverridesRequest( + data=[ + CreateOverrideRequestData( + attributes=CreateOverrideRequestAttributes( + end=(datetime.now() + relativedelta(days=1)), + start=datetime.now(), + ), + relationships=CreateOverrideRequestRelationships( + user=OverrideRelationshipsUser( + data=OverrideRelationshipsUserData( + id=USER_DATA_ID, + type=OverrideRelationshipsUserDataType.USERS, + ), + ), + ), + type=OverrideDataType.OVERRIDES, + ), + ], +) + +configuration = Configuration() +configuration.access_token = environ["DD_BEARER_TOKEN"] +with ApiClient(configuration) as api_client: + api_instance = OnCallApi(api_client) + response = api_instance.create_schedule_overrides(schedule_id=SCHEDULE_DATA_ID, body=body) + + print(response) diff --git a/examples/v2/on-call/DeleteScheduleOverride.py b/examples/v2/on-call/DeleteScheduleOverride.py new file mode 100644 index 0000000000..20c903c268 --- /dev/null +++ b/examples/v2/on-call/DeleteScheduleOverride.py @@ -0,0 +1,22 @@ +""" +Delete On-Call schedule override returns "No Content" response +""" + +from os import environ +from datadog_api_client import ApiClient, Configuration +from datadog_api_client.v2.api.on_call_api import OnCallApi + +# there is a valid "schedule" in the system +SCHEDULE_DATA_ID = environ["SCHEDULE_DATA_ID"] + +# there is a valid "override" in the system +OVERRIDE_DATA_0_ID = environ["OVERRIDE_DATA_0_ID"] + +configuration = Configuration() +configuration.access_token = environ["DD_BEARER_TOKEN"] +with ApiClient(configuration) as api_client: + api_instance = OnCallApi(api_client) + api_instance.delete_schedule_override( + schedule_id=SCHEDULE_DATA_ID, + override_id=OVERRIDE_DATA_0_ID, + ) diff --git a/examples/v2/on-call/ListScheduleOverrides.py b/examples/v2/on-call/ListScheduleOverrides.py new file mode 100644 index 0000000000..31fb7e50cd --- /dev/null +++ b/examples/v2/on-call/ListScheduleOverrides.py @@ -0,0 +1,24 @@ +""" +List On-Call schedule overrides returns "OK" response +""" + +from datetime import datetime +from dateutil.relativedelta import relativedelta +from os import environ +from datadog_api_client import ApiClient, Configuration +from datadog_api_client.v2.api.on_call_api import OnCallApi + +# there is a valid "schedule" in the system +SCHEDULE_DATA_ID = environ["SCHEDULE_DATA_ID"] + +configuration = Configuration() +configuration.access_token = environ["DD_BEARER_TOKEN"] +with ApiClient(configuration) as api_client: + api_instance = OnCallApi(api_client) + response = api_instance.list_schedule_overrides( + schedule_id=SCHEDULE_DATA_ID, + filter_start=(datetime.now() + relativedelta(days=-1)), + filter_end=(datetime.now() + relativedelta(days=2)), + ) + + print(response) diff --git a/examples/v2/on-call/ListScheduleOverrides_1773803881.py b/examples/v2/on-call/ListScheduleOverrides_1773803881.py new file mode 100644 index 0000000000..bc414e5777 --- /dev/null +++ b/examples/v2/on-call/ListScheduleOverrides_1773803881.py @@ -0,0 +1,21 @@ +""" +List On-Call schedule overrides returns "OK" response with pagination +""" + +from os import environ +from datadog_api_client import ApiClient, Configuration +from datadog_api_client.v2.api.on_call_api import OnCallApi +from datetime import datetime +from dateutil.tz import tzutc + +configuration = Configuration() +configuration.access_token = environ["DD_BEARER_TOKEN"] +with ApiClient(configuration) as api_client: + api_instance = OnCallApi(api_client) + items = api_instance.list_schedule_overrides_with_pagination( + schedule_id="3653d3c6-0c75-11ea-ad28-fb5701eabc7d", + filter_start=datetime(2024, 1, 7, 2, 53, 1, tzinfo=tzutc()), + filter_end=datetime(2024, 1, 14, 2, 53, 1, tzinfo=tzutc()), + ) + for item in items: + print(item) diff --git a/src/datadog_api_client/v2/api/on_call_api.py b/src/datadog_api_client/v2/api/on_call_api.py index dbc9d52ff1..096b99d30b 100644 --- a/src/datadog_api_client/v2/api/on_call_api.py +++ b/src/datadog_api_client/v2/api/on_call_api.py @@ -10,6 +10,7 @@ from datadog_api_client.api_client import ApiClient, Endpoint as _Endpoint from datadog_api_client.configuration import Configuration from datadog_api_client.model_utils import ( + datetime, set_attribute_from_path, get_attribute_from_path, UnsetType, @@ -24,6 +25,10 @@ from datadog_api_client.v2.model.schedule_create_request import ScheduleCreateRequest from datadog_api_client.v2.model.schedule_update_request import ScheduleUpdateRequest from datadog_api_client.v2.model.shift import Shift +from datadog_api_client.v2.model.overrides import Overrides +from datadog_api_client.v2.model.override_data import OverrideData +from datadog_api_client.v2.model.override_create_response import OverrideCreateResponse +from datadog_api_client.v2.model.create_overrides_request import CreateOverridesRequest from datadog_api_client.v2.model.schedule_on_call_responders import ScheduleOnCallResponders from datadog_api_client.v2.model.team_on_call_responders import TeamOnCallResponders from datadog_api_client.v2.model.team_routing_rules import TeamRoutingRules @@ -98,6 +103,37 @@ def __init__(self, api_client=None): api_client=api_client, ) + self._create_schedule_overrides_endpoint = _Endpoint( + settings={ + "response_type": (OverrideCreateResponse,), + "auth": ["apiKeyAuth", "appKeyAuth", "AuthZ"], + "endpoint_path": "/api/v2/on-call/schedules/{schedule_id}/overrides", + "operation_id": "create_schedule_overrides", + "http_method": "POST", + "version": "v2", + }, + params_map={ + "schedule_id": { + "required": True, + "openapi_types": (str,), + "attribute": "schedule_id", + "location": "path", + }, + "include": { + "openapi_types": (str,), + "attribute": "include", + "location": "query", + }, + "body": { + "required": True, + "openapi_types": (CreateOverridesRequest,), + "location": "body", + }, + }, + headers_map={"accept": ["application/json"], "content_type": ["application/json"]}, + api_client=api_client, + ) + self._create_user_notification_channel_endpoint = _Endpoint( settings={ "response_type": (NotificationChannel,), @@ -196,6 +232,35 @@ def __init__(self, api_client=None): api_client=api_client, ) + self._delete_schedule_override_endpoint = _Endpoint( + settings={ + "response_type": None, + "auth": ["apiKeyAuth", "appKeyAuth", "AuthZ"], + "endpoint_path": "/api/v2/on-call/schedules/{schedule_id}/overrides/{override_id}", + "operation_id": "delete_schedule_override", + "http_method": "DELETE", + "version": "v2", + }, + params_map={ + "schedule_id": { + "required": True, + "openapi_types": (str,), + "attribute": "schedule_id", + "location": "path", + }, + "override_id": { + "required": True, + "openapi_types": (str,), + "attribute": "override_id", + "location": "path", + }, + }, + headers_map={ + "accept": ["*/*"], + }, + api_client=api_client, + ) + self._delete_user_notification_channel_endpoint = _Endpoint( settings={ "response_type": None, @@ -537,6 +602,59 @@ def __init__(self, api_client=None): api_client=api_client, ) + self._list_schedule_overrides_endpoint = _Endpoint( + settings={ + "response_type": (Overrides,), + "auth": ["apiKeyAuth", "appKeyAuth", "AuthZ"], + "endpoint_path": "/api/v2/on-call/schedules/{schedule_id}/overrides", + "operation_id": "list_schedule_overrides", + "http_method": "GET", + "version": "v2", + }, + params_map={ + "schedule_id": { + "required": True, + "openapi_types": (str,), + "attribute": "schedule_id", + "location": "path", + }, + "filter_start": { + "required": True, + "openapi_types": (datetime,), + "attribute": "filter[start]", + "location": "query", + }, + "filter_end": { + "required": True, + "openapi_types": (datetime,), + "attribute": "filter[end]", + "location": "query", + }, + "include": { + "openapi_types": (str,), + "attribute": "include", + "location": "query", + }, + "page_size": { + "validation": { + "inclusive_maximum": 50, + }, + "openapi_types": (int,), + "attribute": "page[size]", + "location": "query", + }, + "page_number": { + "openapi_types": (int,), + "attribute": "page[number]", + "location": "query", + }, + }, + headers_map={ + "accept": ["application/json"], + }, + api_client=api_client, + ) + self._list_user_notification_channels_endpoint = _Endpoint( settings={ "response_type": (ListNotificationChannelsResponse,), @@ -764,6 +882,34 @@ def create_on_call_schedule( return self._create_on_call_schedule_endpoint.call_with_http_info(**kwargs) + def create_schedule_overrides( + self, + schedule_id: str, + body: CreateOverridesRequest, + *, + include: Union[str, UnsetType] = unset, + ) -> OverrideCreateResponse: + """Create On-Call schedule overrides. + + Create one or more overrides for the specified On-Call schedule. + + :param schedule_id: The ID of the schedule. + :type schedule_id: str + :type body: CreateOverridesRequest + :param include: Comma-separated list of included relationships to be returned. Allowed values: ``user`` , ``overridden_user`` , ``user.color``. + :type include: str, optional + :rtype: OverrideCreateResponse + """ + kwargs: Dict[str, Any] = {} + kwargs["schedule_id"] = schedule_id + + if include is not unset: + kwargs["include"] = include + + kwargs["body"] = body + + return self._create_schedule_overrides_endpoint.call_with_http_info(**kwargs) + def create_user_notification_channel( self, user_id: str, @@ -840,6 +986,28 @@ def delete_on_call_schedule( return self._delete_on_call_schedule_endpoint.call_with_http_info(**kwargs) + def delete_schedule_override( + self, + schedule_id: str, + override_id: str, + ) -> None: + """Delete On-Call schedule override. + + Delete an override from the specified On-Call schedule. + + :param schedule_id: The ID of the schedule. + :type schedule_id: str + :param override_id: The ID of the override. + :type override_id: str + :rtype: None + """ + kwargs: Dict[str, Any] = {} + kwargs["schedule_id"] = schedule_id + + kwargs["override_id"] = override_id + + return self._delete_schedule_override_endpoint.call_with_http_info(**kwargs) + def delete_user_notification_channel( self, user_id: str, @@ -974,7 +1142,7 @@ def get_schedule_on_call_responders( :type include: str, optional :param filter_position: Comma-separated list of positions to retrieve. Allowed values: ``previous`` , ``current`` , ``next``. Defaults to ``current`` if omitted. :type filter_position: str, optional - :param filter_at_ts: Retrieves the on-call responders at the given timestamp in RFC3339 format (for example, ``2025-05-07T02:53:01Z`` or ``2025-05-07T02:53:01+00:00`` ). When using timezone offsets with ``+`` or ``-`` , ensure proper URL encoding ( ``+`` should be encoded as ``%2B`` ). Defaults to the current time if omitted. + :param filter_at_ts: Retrieves the on-call responders at the given timestamp in RFC3339 format (for example, ``2025-05-07T02:53:01Z`` or ``2025-05-07T02:53:01+00:00`` ). If you use a time zone offset with ``+`` , URL-encode the ``+`` as ``%2B``. Defaults to the current time if omitted. :type filter_at_ts: str, optional :rtype: ScheduleOnCallResponders """ @@ -1007,7 +1175,7 @@ def get_schedule_on_call_user( :type schedule_id: str :param include: Specifies related resources to include in the response as a comma-separated list. Allowed value: ``user``. :type include: str, optional - :param filter_at_ts: Retrieves the on-call user at the given timestamp in RFC3339 format (for example, ``2025-05-07T02:53:01Z`` or ``2025-05-07T02:53:01+00:00`` ). When using timezone offsets with ``+`` or ``-`` , ensure proper URL encoding ( ``+`` should be encoded as ``%2B`` ). Defaults to the current time if omitted. + :param filter_at_ts: Retrieves the on-call user at the given timestamp in RFC3339 format (for example, ``2025-05-07T02:53:01Z`` or ``2025-05-07T02:53:01+00:00`` ). If you use a time zone offset with ``+`` , URL-encode the ``+`` as ``%2B``. Defaults to the current time if omitted. :type filter_at_ts: str, optional :rtype: Shift """ @@ -1185,6 +1353,111 @@ def list_on_call_schedules_with_pagination( } return endpoint.call_with_http_info_paginated(pagination) + def list_schedule_overrides( + self, + schedule_id: str, + filter_start: datetime, + filter_end: datetime, + *, + include: Union[str, UnsetType] = unset, + page_size: Union[int, UnsetType] = unset, + page_number: Union[int, UnsetType] = unset, + ) -> Overrides: + """List On-Call schedule overrides. + + Retrieve a list of overrides for the specified On-Call schedule within a given time range. + + :param schedule_id: The ID of the schedule. + :type schedule_id: str + :param filter_start: Start of the time range to retrieve overrides for, in RFC3339 format (for example, ``2025-05-07T02:53:01Z`` or ``2025-05-07T02:53:01+00:00`` ). If you use a time zone offset with ``+`` , URL-encode the ``+`` as ``%2B``. + :type filter_start: datetime + :param filter_end: End of the time range to retrieve overrides for, in RFC3339 format (for example, ``2025-05-07T02:53:01Z`` or ``2025-05-07T02:53:01+00:00`` ). If you use a time zone offset with ``+`` , URL-encode the ``+`` as ``%2B``. The time range cannot exceed 45 days. + :type filter_end: datetime + :param include: Comma-separated list of related resources to include in the response. Allowed values: ``user`` , ``overridden_user`` , ``user.color``. + :type include: str, optional + :param page_size: Number of overrides to return per page. The maximum allowed value is 50. + :type page_size: int, optional + :param page_number: Specific page number to return. + :type page_number: int, optional + :rtype: Overrides + """ + kwargs: Dict[str, Any] = {} + kwargs["schedule_id"] = schedule_id + + kwargs["filter_start"] = filter_start + + kwargs["filter_end"] = filter_end + + if include is not unset: + kwargs["include"] = include + + if page_size is not unset: + kwargs["page_size"] = page_size + + if page_number is not unset: + kwargs["page_number"] = page_number + + return self._list_schedule_overrides_endpoint.call_with_http_info(**kwargs) + + def list_schedule_overrides_with_pagination( + self, + schedule_id: str, + filter_start: datetime, + filter_end: datetime, + *, + include: Union[str, UnsetType] = unset, + page_size: Union[int, UnsetType] = unset, + page_number: Union[int, UnsetType] = unset, + ) -> collections.abc.Iterable[OverrideData]: + """List On-Call schedule overrides. + + Provide a paginated version of :meth:`list_schedule_overrides`, returning all items. + + :param schedule_id: The ID of the schedule. + :type schedule_id: str + :param filter_start: Start of the time range to retrieve overrides for, in RFC3339 format (for example, ``2025-05-07T02:53:01Z`` or ``2025-05-07T02:53:01+00:00`` ). If you use a time zone offset with ``+`` , URL-encode the ``+`` as ``%2B``. + :type filter_start: datetime + :param filter_end: End of the time range to retrieve overrides for, in RFC3339 format (for example, ``2025-05-07T02:53:01Z`` or ``2025-05-07T02:53:01+00:00`` ). If you use a time zone offset with ``+`` , URL-encode the ``+`` as ``%2B``. The time range cannot exceed 45 days. + :type filter_end: datetime + :param include: Comma-separated list of related resources to include in the response. Allowed values: ``user`` , ``overridden_user`` , ``user.color``. + :type include: str, optional + :param page_size: Number of overrides to return per page. The maximum allowed value is 50. + :type page_size: int, optional + :param page_number: Specific page number to return. + :type page_number: int, optional + + :return: A generator of paginated results. + :rtype: collections.abc.Iterable[OverrideData] + """ + kwargs: Dict[str, Any] = {} + kwargs["schedule_id"] = schedule_id + + kwargs["filter_start"] = filter_start + + kwargs["filter_end"] = filter_end + + if include is not unset: + kwargs["include"] = include + + if page_size is not unset: + kwargs["page_size"] = page_size + + if page_number is not unset: + kwargs["page_number"] = page_number + + local_page_size = get_attribute_from_path(kwargs, "page_size", 10) + endpoint = self._list_schedule_overrides_endpoint + set_attribute_from_path(kwargs, "page_size", local_page_size, endpoint.params_map) + pagination = { + "limit_value": local_page_size, + "results_path": "data", + "page_param": "page_number", + "page_start": 0, + "endpoint": endpoint, + "kwargs": kwargs, + } + return endpoint.call_with_http_info_paginated(pagination) + def list_user_notification_channels( self, user_id: str, diff --git a/src/datadog_api_client/v2/model/create_override_request_attributes.py b/src/datadog_api_client/v2/model/create_override_request_attributes.py new file mode 100644 index 0000000000..3342f3a1b0 --- /dev/null +++ b/src/datadog_api_client/v2/model/create_override_request_attributes.py @@ -0,0 +1,40 @@ +# 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 ( + ModelNormal, + cached_property, + datetime, +) + + +class CreateOverrideRequestAttributes(ModelNormal): + @cached_property + def openapi_types(_): + return { + "end": (datetime,), + "start": (datetime,), + } + + attribute_map = { + "end": "end", + "start": "start", + } + + def __init__(self_, end: datetime, start: datetime, **kwargs): + """ + Attributes for creating an on-call schedule override. + + :param end: The end time of the override. + :type end: datetime + + :param start: The start time of the override. + :type start: datetime + """ + super().__init__(kwargs) + + self_.end = end + self_.start = start diff --git a/src/datadog_api_client/v2/model/create_override_request_data.py b/src/datadog_api_client/v2/model/create_override_request_data.py new file mode 100644 index 0000000000..ed53aa1cce --- /dev/null +++ b/src/datadog_api_client/v2/model/create_override_request_data.py @@ -0,0 +1,65 @@ +# 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.create_override_request_attributes import CreateOverrideRequestAttributes + from datadog_api_client.v2.model.create_override_request_relationships import CreateOverrideRequestRelationships + from datadog_api_client.v2.model.override_data_type import OverrideDataType + + +class CreateOverrideRequestData(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.create_override_request_attributes import CreateOverrideRequestAttributes + from datadog_api_client.v2.model.create_override_request_relationships import CreateOverrideRequestRelationships + from datadog_api_client.v2.model.override_data_type import OverrideDataType + + return { + "attributes": (CreateOverrideRequestAttributes,), + "relationships": (CreateOverrideRequestRelationships,), + "type": (OverrideDataType,), + } + + attribute_map = { + "attributes": "attributes", + "relationships": "relationships", + "type": "type", + } + + def __init__( + self_, + attributes: CreateOverrideRequestAttributes, + type: OverrideDataType, + relationships: Union[CreateOverrideRequestRelationships, UnsetType] = unset, + **kwargs, + ): + """ + Data for creating an on-call schedule override. + + :param attributes: Attributes for creating an on-call schedule override. + :type attributes: CreateOverrideRequestAttributes + + :param relationships: Relationships to set when creating an on-call schedule override. + :type relationships: CreateOverrideRequestRelationships, optional + + :param type: Indicates that the resource is of type 'overrides'. + :type type: OverrideDataType + """ + if relationships is not unset: + kwargs["relationships"] = relationships + super().__init__(kwargs) + + self_.attributes = attributes + self_.type = type diff --git a/src/datadog_api_client/v2/model/create_override_request_relationships.py b/src/datadog_api_client/v2/model/create_override_request_relationships.py new file mode 100644 index 0000000000..b531483820 --- /dev/null +++ b/src/datadog_api_client/v2/model/create_override_request_relationships.py @@ -0,0 +1,54 @@ +# 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.override_relationships_user import OverrideRelationshipsUser + + +class CreateOverrideRequestRelationships(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.override_relationships_user import OverrideRelationshipsUser + + return { + "overridden_user": (OverrideRelationshipsUser,), + "user": (OverrideRelationshipsUser,), + } + + attribute_map = { + "overridden_user": "overridden_user", + "user": "user", + } + + def __init__( + self_, + overridden_user: Union[OverrideRelationshipsUser, UnsetType] = unset, + user: Union[OverrideRelationshipsUser, UnsetType] = unset, + **kwargs, + ): + """ + Relationships to set when creating an on-call schedule override. + + :param overridden_user: Defines the relationship between an override and one of its associated users. + :type overridden_user: OverrideRelationshipsUser, optional + + :param user: Defines the relationship between an override and one of its associated users. + :type user: OverrideRelationshipsUser, optional + """ + if overridden_user is not unset: + kwargs["overridden_user"] = overridden_user + if user is not unset: + kwargs["user"] = user + super().__init__(kwargs) diff --git a/src/datadog_api_client/v2/model/create_overrides_request.py b/src/datadog_api_client/v2/model/create_overrides_request.py new file mode 100644 index 0000000000..49c35c4dd8 --- /dev/null +++ b/src/datadog_api_client/v2/model/create_overrides_request.py @@ -0,0 +1,47 @@ +# 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, TYPE_CHECKING + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, +) + + +if TYPE_CHECKING: + from datadog_api_client.v2.model.create_override_request_data import CreateOverrideRequestData + + +class CreateOverridesRequest(ModelNormal): + validations = { + "data": { + "max_items": 25, + "min_items": 1, + }, + } + + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.create_override_request_data import CreateOverrideRequestData + + return { + "data": ([CreateOverrideRequestData],), + } + + attribute_map = { + "data": "data", + } + + def __init__(self_, data: List[CreateOverrideRequestData], **kwargs): + """ + Request to create one or more on-call schedule overrides. You can create up to 25 overrides in a single request. + + :param data: A list of on-call schedule overrides to create. + :type data: [CreateOverrideRequestData] + """ + super().__init__(kwargs) + + self_.data = data diff --git a/src/datadog_api_client/v2/model/override_attributes.py b/src/datadog_api_client/v2/model/override_attributes.py new file mode 100644 index 0000000000..5214a7a3e6 --- /dev/null +++ b/src/datadog_api_client/v2/model/override_attributes.py @@ -0,0 +1,57 @@ +# Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019-Present Datadog, Inc. +from __future__ import annotations + +from typing import Union + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, + datetime, + unset, + UnsetType, +) + + +class OverrideAttributes(ModelNormal): + @cached_property + def openapi_types(_): + return { + "end": (datetime,), + "inactive": (bool,), + "start": (datetime,), + } + + attribute_map = { + "end": "end", + "inactive": "inactive", + "start": "start", + } + + def __init__( + self_, + end: Union[datetime, UnsetType] = unset, + inactive: Union[bool, UnsetType] = unset, + start: Union[datetime, UnsetType] = unset, + **kwargs, + ): + """ + Attributes for an on-call schedule override. + + :param end: The end time of the override. + :type end: datetime, optional + + :param inactive: Whether the override is inactive (for example, because its time range has ended). + :type inactive: bool, optional + + :param start: The start time of the override. + :type start: datetime, optional + """ + if end is not unset: + kwargs["end"] = end + if inactive is not unset: + kwargs["inactive"] = inactive + if start is not unset: + kwargs["start"] = start + super().__init__(kwargs) diff --git a/src/datadog_api_client/v2/model/override_create_response.py b/src/datadog_api_client/v2/model/override_create_response.py new file mode 100644 index 0000000000..c1140fefed --- /dev/null +++ b/src/datadog_api_client/v2/model/override_create_response.py @@ -0,0 +1,57 @@ +# Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019-Present Datadog, Inc. +from __future__ import annotations + +from typing import 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.override_data import OverrideData + from datadog_api_client.v2.model.override_included import OverrideIncluded + from datadog_api_client.v2.model.schedule_user import ScheduleUser + + +class OverrideCreateResponse(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.override_data import OverrideData + from datadog_api_client.v2.model.override_included import OverrideIncluded + + return { + "data": ([OverrideData],), + "included": ([OverrideIncluded],), + } + + attribute_map = { + "data": "data", + "included": "included", + } + + def __init__( + self_, + data: List[OverrideData], + included: Union[List[Union[OverrideIncluded, ScheduleUser]], UnsetType] = unset, + **kwargs, + ): + """ + The on-call schedule overrides that were created, and any related included resources (such as users). + + :param data: The on-call schedule overrides that were created. + :type data: [OverrideData] + + :param included: Related resources referenced in the overrides' relationships, such as users. + :type included: [OverrideIncluded], optional + """ + if included is not unset: + kwargs["included"] = included + super().__init__(kwargs) + + self_.data = data diff --git a/src/datadog_api_client/v2/model/override_data.py b/src/datadog_api_client/v2/model/override_data.py new file mode 100644 index 0000000000..749436a838 --- /dev/null +++ b/src/datadog_api_client/v2/model/override_data.py @@ -0,0 +1,73 @@ +# 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.override_attributes import OverrideAttributes + from datadog_api_client.v2.model.override_relationships import OverrideRelationships + from datadog_api_client.v2.model.override_data_type import OverrideDataType + + +class OverrideData(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.override_attributes import OverrideAttributes + from datadog_api_client.v2.model.override_relationships import OverrideRelationships + from datadog_api_client.v2.model.override_data_type import OverrideDataType + + return { + "attributes": (OverrideAttributes,), + "id": (str,), + "relationships": (OverrideRelationships,), + "type": (OverrideDataType,), + } + + attribute_map = { + "attributes": "attributes", + "id": "id", + "relationships": "relationships", + "type": "type", + } + + def __init__( + self_, + id: str, + type: OverrideDataType, + attributes: Union[OverrideAttributes, UnsetType] = unset, + relationships: Union[OverrideRelationships, UnsetType] = unset, + **kwargs, + ): + """ + Data for an on-call schedule override. + + :param attributes: Attributes for an on-call schedule override. + :type attributes: OverrideAttributes, optional + + :param id: The unique identifier of the override. + :type id: str + + :param relationships: Relationships for an on-call schedule override. + :type relationships: OverrideRelationships, optional + + :param type: Indicates that the resource is of type 'overrides'. + :type type: OverrideDataType + """ + if attributes is not unset: + kwargs["attributes"] = attributes + if relationships is not unset: + kwargs["relationships"] = relationships + super().__init__(kwargs) + + self_.id = id + self_.type = type diff --git a/src/datadog_api_client/v2/model/override_data_type.py b/src/datadog_api_client/v2/model/override_data_type.py new file mode 100644 index 0000000000..6517b50a30 --- /dev/null +++ b/src/datadog_api_client/v2/model/override_data_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 OverrideDataType(ModelSimple): + """ + Indicates that the resource is of type 'overrides'. + + :param value: If omitted defaults to "overrides". Must be one of ["overrides"]. + :type value: str + """ + + allowed_values = { + "overrides", + } + OVERRIDES: ClassVar["OverrideDataType"] + + @cached_property + def openapi_types(_): + return { + "value": (str,), + } + + +OverrideDataType.OVERRIDES = OverrideDataType("overrides") diff --git a/src/datadog_api_client/v2/model/override_included.py b/src/datadog_api_client/v2/model/override_included.py new file mode 100644 index 0000000000..f5396f3c7e --- /dev/null +++ b/src/datadog_api_client/v2/model/override_included.py @@ -0,0 +1,44 @@ +# 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 ( + ModelComposed, + cached_property, +) + + +class OverrideIncluded(ModelComposed): + def __init__(self, **kwargs): + """ + Included data for on-call schedule override operations. + + :param attributes: Provides basic user information for a schedule, including a name and email address. + :type attributes: ScheduleUserAttributes, optional + + :param id: The unique user identifier. + :type id: str + + :param type: Users resource type. + :type type: ScheduleUserType + """ + super().__init__(kwargs) + + @cached_property + def _composed_schemas(_): + # we need this here to make our import statements work + # we must store _composed_schemas in here so the code is only run + # when we invoke this method. If we kept this at the class + # level we would get an error because the class level + # code would be run when this module is imported, and these composed + # classes don't exist yet because their module has not finished + # loading + from datadog_api_client.v2.model.schedule_user import ScheduleUser + + return { + "oneOf": [ + ScheduleUser, + ], + } diff --git a/src/datadog_api_client/v2/model/override_relationships.py b/src/datadog_api_client/v2/model/override_relationships.py new file mode 100644 index 0000000000..e11d1403cd --- /dev/null +++ b/src/datadog_api_client/v2/model/override_relationships.py @@ -0,0 +1,64 @@ +# Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019-Present Datadog, Inc. +from __future__ import annotations + +from typing import Union, TYPE_CHECKING + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, + unset, + UnsetType, +) + + +if TYPE_CHECKING: + from datadog_api_client.v2.model.override_relationships_user import OverrideRelationshipsUser + from datadog_api_client.v2.model.override_relationships_schedule import OverrideRelationshipsSchedule + + +class OverrideRelationships(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.override_relationships_user import OverrideRelationshipsUser + from datadog_api_client.v2.model.override_relationships_schedule import OverrideRelationshipsSchedule + + return { + "overridden_user": (OverrideRelationshipsUser,), + "schedule": (OverrideRelationshipsSchedule,), + "user": (OverrideRelationshipsUser,), + } + + attribute_map = { + "overridden_user": "overridden_user", + "schedule": "schedule", + "user": "user", + } + + def __init__( + self_, + overridden_user: Union[OverrideRelationshipsUser, UnsetType] = unset, + schedule: Union[OverrideRelationshipsSchedule, UnsetType] = unset, + user: Union[OverrideRelationshipsUser, UnsetType] = unset, + **kwargs, + ): + """ + Relationships for an on-call schedule override. + + :param overridden_user: Defines the relationship between an override and one of its associated users. + :type overridden_user: OverrideRelationshipsUser, optional + + :param schedule: Defines the relationship between an override and the schedule it belongs to. + :type schedule: OverrideRelationshipsSchedule, optional + + :param user: Defines the relationship between an override and one of its associated users. + :type user: OverrideRelationshipsUser, optional + """ + if overridden_user is not unset: + kwargs["overridden_user"] = overridden_user + if schedule is not unset: + kwargs["schedule"] = schedule + if user is not unset: + kwargs["user"] = user + super().__init__(kwargs) diff --git a/src/datadog_api_client/v2/model/override_relationships_schedule.py b/src/datadog_api_client/v2/model/override_relationships_schedule.py new file mode 100644 index 0000000000..9295fe070e --- /dev/null +++ b/src/datadog_api_client/v2/model/override_relationships_schedule.py @@ -0,0 +1,40 @@ +# 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 TYPE_CHECKING + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, +) + + +if TYPE_CHECKING: + from datadog_api_client.v2.model.override_relationships_schedule_data import OverrideRelationshipsScheduleData + + +class OverrideRelationshipsSchedule(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.override_relationships_schedule_data import OverrideRelationshipsScheduleData + + return { + "data": (OverrideRelationshipsScheduleData,), + } + + attribute_map = { + "data": "data", + } + + def __init__(self_, data: OverrideRelationshipsScheduleData, **kwargs): + """ + Defines the relationship between an override and the schedule it belongs to. + + :param data: A reference to the schedule the override belongs to, containing the schedule's ID and resource type. + :type data: OverrideRelationshipsScheduleData + """ + super().__init__(kwargs) + + self_.data = data diff --git a/src/datadog_api_client/v2/model/override_relationships_schedule_data.py b/src/datadog_api_client/v2/model/override_relationships_schedule_data.py new file mode 100644 index 0000000000..a5d497f976 --- /dev/null +++ b/src/datadog_api_client/v2/model/override_relationships_schedule_data.py @@ -0,0 +1,50 @@ +# 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 TYPE_CHECKING + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, +) + + +if TYPE_CHECKING: + from datadog_api_client.v2.model.override_relationships_schedule_data_type import ( + OverrideRelationshipsScheduleDataType, + ) + + +class OverrideRelationshipsScheduleData(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.override_relationships_schedule_data_type import ( + OverrideRelationshipsScheduleDataType, + ) + + return { + "id": (str,), + "type": (OverrideRelationshipsScheduleDataType,), + } + + attribute_map = { + "id": "id", + "type": "type", + } + + def __init__(self_, id: str, type: OverrideRelationshipsScheduleDataType, **kwargs): + """ + A reference to the schedule the override belongs to, containing the schedule's ID and resource type. + + :param id: The unique identifier of the schedule. + :type id: str + + :param type: Indicates that the related resource is of type 'schedules'. + :type type: OverrideRelationshipsScheduleDataType + """ + super().__init__(kwargs) + + self_.id = id + self_.type = type diff --git a/src/datadog_api_client/v2/model/override_relationships_schedule_data_type.py b/src/datadog_api_client/v2/model/override_relationships_schedule_data_type.py new file mode 100644 index 0000000000..7230aac42b --- /dev/null +++ b/src/datadog_api_client/v2/model/override_relationships_schedule_data_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 OverrideRelationshipsScheduleDataType(ModelSimple): + """ + Indicates that the related resource is of type 'schedules'. + + :param value: If omitted defaults to "schedules". Must be one of ["schedules"]. + :type value: str + """ + + allowed_values = { + "schedules", + } + SCHEDULES: ClassVar["OverrideRelationshipsScheduleDataType"] + + @cached_property + def openapi_types(_): + return { + "value": (str,), + } + + +OverrideRelationshipsScheduleDataType.SCHEDULES = OverrideRelationshipsScheduleDataType("schedules") diff --git a/src/datadog_api_client/v2/model/override_relationships_user.py b/src/datadog_api_client/v2/model/override_relationships_user.py new file mode 100644 index 0000000000..25f987c9ab --- /dev/null +++ b/src/datadog_api_client/v2/model/override_relationships_user.py @@ -0,0 +1,40 @@ +# 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 TYPE_CHECKING + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, +) + + +if TYPE_CHECKING: + from datadog_api_client.v2.model.override_relationships_user_data import OverrideRelationshipsUserData + + +class OverrideRelationshipsUser(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.override_relationships_user_data import OverrideRelationshipsUserData + + return { + "data": (OverrideRelationshipsUserData,), + } + + attribute_map = { + "data": "data", + } + + def __init__(self_, data: OverrideRelationshipsUserData, **kwargs): + """ + Defines the relationship between an override and one of its associated users. + + :param data: A reference to a user, containing the user's ID and resource type. + :type data: OverrideRelationshipsUserData + """ + super().__init__(kwargs) + + self_.data = data diff --git a/src/datadog_api_client/v2/model/override_relationships_user_data.py b/src/datadog_api_client/v2/model/override_relationships_user_data.py new file mode 100644 index 0000000000..ad63f4a837 --- /dev/null +++ b/src/datadog_api_client/v2/model/override_relationships_user_data.py @@ -0,0 +1,46 @@ +# 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 TYPE_CHECKING + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, +) + + +if TYPE_CHECKING: + from datadog_api_client.v2.model.override_relationships_user_data_type import OverrideRelationshipsUserDataType + + +class OverrideRelationshipsUserData(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.override_relationships_user_data_type import OverrideRelationshipsUserDataType + + return { + "id": (str,), + "type": (OverrideRelationshipsUserDataType,), + } + + attribute_map = { + "id": "id", + "type": "type", + } + + def __init__(self_, id: str, type: OverrideRelationshipsUserDataType, **kwargs): + """ + A reference to a user, containing the user's ID and resource type. + + :param id: The unique identifier of the user. + :type id: str + + :param type: Indicates that the related resource is of type 'users'. + :type type: OverrideRelationshipsUserDataType + """ + super().__init__(kwargs) + + self_.id = id + self_.type = type diff --git a/src/datadog_api_client/v2/model/override_relationships_user_data_type.py b/src/datadog_api_client/v2/model/override_relationships_user_data_type.py new file mode 100644 index 0000000000..ba95543fd2 --- /dev/null +++ b/src/datadog_api_client/v2/model/override_relationships_user_data_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 OverrideRelationshipsUserDataType(ModelSimple): + """ + Indicates that the related resource is of type 'users'. + + :param value: If omitted defaults to "users". Must be one of ["users"]. + :type value: str + """ + + allowed_values = { + "users", + } + USERS: ClassVar["OverrideRelationshipsUserDataType"] + + @cached_property + def openapi_types(_): + return { + "value": (str,), + } + + +OverrideRelationshipsUserDataType.USERS = OverrideRelationshipsUserDataType("users") diff --git a/src/datadog_api_client/v2/model/overrides.py b/src/datadog_api_client/v2/model/overrides.py new file mode 100644 index 0000000000..5dbf970db0 --- /dev/null +++ b/src/datadog_api_client/v2/model/overrides.py @@ -0,0 +1,57 @@ +# Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019-Present Datadog, Inc. +from __future__ import annotations + +from typing import 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.override_data import OverrideData + from datadog_api_client.v2.model.override_included import OverrideIncluded + from datadog_api_client.v2.model.schedule_user import ScheduleUser + + +class Overrides(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.override_data import OverrideData + from datadog_api_client.v2.model.override_included import OverrideIncluded + + return { + "data": ([OverrideData],), + "included": ([OverrideIncluded],), + } + + attribute_map = { + "data": "data", + "included": "included", + } + + def __init__( + self_, + data: List[OverrideData], + included: Union[List[Union[OverrideIncluded, ScheduleUser]], UnsetType] = unset, + **kwargs, + ): + """ + A list of on-call schedule overrides and any related included resources (such as users). + + :param data: A list of on-call schedule overrides. + :type data: [OverrideData] + + :param included: Related resources referenced in the overrides' relationships, such as users. + :type included: [OverrideIncluded], optional + """ + if included is not unset: + kwargs["included"] = included + super().__init__(kwargs) + + self_.data = data diff --git a/src/datadog_api_client/v2/model/schedule_user.py b/src/datadog_api_client/v2/model/schedule_user.py index d1e2b1693b..49b681ff5a 100644 --- a/src/datadog_api_client/v2/model/schedule_user.py +++ b/src/datadog_api_client/v2/model/schedule_user.py @@ -37,11 +37,7 @@ def openapi_types(_): } def __init__( - self_, - type: ScheduleUserType, - attributes: Union[ScheduleUserAttributes, UnsetType] = unset, - id: Union[str, UnsetType] = unset, - **kwargs, + self_, id: str, type: ScheduleUserType, attributes: Union[ScheduleUserAttributes, UnsetType] = unset, **kwargs ): """ Represents a user object in the context of a schedule, including their ``id`` , type, and basic attributes. @@ -50,15 +46,14 @@ def __init__( :type attributes: ScheduleUserAttributes, optional :param id: The unique user identifier. - :type id: str, optional + :type id: str :param type: Users resource type. :type type: ScheduleUserType """ if attributes is not unset: kwargs["attributes"] = attributes - if id is not unset: - kwargs["id"] = id super().__init__(kwargs) + self_.id = id self_.type = type diff --git a/src/datadog_api_client/v2/model/schedule_user_attributes.py b/src/datadog_api_client/v2/model/schedule_user_attributes.py index 325ae12f9d..3271147075 100644 --- a/src/datadog_api_client/v2/model/schedule_user_attributes.py +++ b/src/datadog_api_client/v2/model/schedule_user_attributes.py @@ -23,12 +23,14 @@ def openapi_types(_): from datadog_api_client.v2.model.user_attributes_status import UserAttributesStatus return { + "color": (str,), "email": (str,), "name": (str,), "status": (UserAttributesStatus,), } attribute_map = { + "color": "color", "email": "email", "name": "name", "status": "status", @@ -36,6 +38,7 @@ def openapi_types(_): def __init__( self_, + color: Union[str, UnsetType] = unset, email: Union[str, UnsetType] = unset, name: Union[str, UnsetType] = unset, status: Union[UserAttributesStatus, UnsetType] = unset, @@ -44,6 +47,9 @@ def __init__( """ Provides basic user information for a schedule, including a name and email address. + :param color: The user's on-call color, as a hex code (for example, ``#FF0000`` ). Included only when ``user.color`` is requested in the ``include`` parameter. + :type color: str, optional + :param email: The user's email address. :type email: str, optional @@ -53,6 +59,8 @@ def __init__( :param status: The user's status. :type status: UserAttributesStatus, optional """ + if color is not unset: + kwargs["color"] = color if email is not unset: kwargs["email"] = email if name is not unset: diff --git a/src/datadog_api_client/v2/model/shift_included.py b/src/datadog_api_client/v2/model/shift_included.py index 3fc8992ced..1fcb6ddb04 100644 --- a/src/datadog_api_client/v2/model/shift_included.py +++ b/src/datadog_api_client/v2/model/shift_included.py @@ -19,7 +19,7 @@ def __init__(self, **kwargs): :type attributes: ScheduleUserAttributes, optional :param id: The unique user identifier. - :type id: str, optional + :type id: str :param type: Users resource type. :type type: ScheduleUserType diff --git a/src/datadog_api_client/v2/models/__init__.py b/src/datadog_api_client/v2/models/__init__.py index e532138f05..0cb9b37c50 100644 --- a/src/datadog_api_client/v2/models/__init__.py +++ b/src/datadog_api_client/v2/models/__init__.py @@ -1874,6 +1874,10 @@ from datadog_api_client.v2.model.create_or_update_widget_request import CreateOrUpdateWidgetRequest from datadog_api_client.v2.model.create_or_update_widget_request_attributes import CreateOrUpdateWidgetRequestAttributes from datadog_api_client.v2.model.create_or_update_widget_request_data import CreateOrUpdateWidgetRequestData +from datadog_api_client.v2.model.create_override_request_attributes import CreateOverrideRequestAttributes +from datadog_api_client.v2.model.create_override_request_data import CreateOverrideRequestData +from datadog_api_client.v2.model.create_override_request_relationships import CreateOverrideRequestRelationships +from datadog_api_client.v2.model.create_overrides_request import CreateOverridesRequest from datadog_api_client.v2.model.create_page_request import CreatePageRequest from datadog_api_client.v2.model.create_page_request_data import CreatePageRequestData from datadog_api_client.v2.model.create_page_request_data_attributes import CreatePageRequestDataAttributes @@ -8013,6 +8017,19 @@ from datadog_api_client.v2.model.output_schema import OutputSchema from datadog_api_client.v2.model.output_schema_parameters import OutputSchemaParameters from datadog_api_client.v2.model.output_schema_parameters_type import OutputSchemaParametersType +from datadog_api_client.v2.model.override_attributes import OverrideAttributes +from datadog_api_client.v2.model.override_create_response import OverrideCreateResponse +from datadog_api_client.v2.model.override_data import OverrideData +from datadog_api_client.v2.model.override_data_type import OverrideDataType +from datadog_api_client.v2.model.override_included import OverrideIncluded +from datadog_api_client.v2.model.override_relationships import OverrideRelationships +from datadog_api_client.v2.model.override_relationships_schedule import OverrideRelationshipsSchedule +from datadog_api_client.v2.model.override_relationships_schedule_data import OverrideRelationshipsScheduleData +from datadog_api_client.v2.model.override_relationships_schedule_data_type import OverrideRelationshipsScheduleDataType +from datadog_api_client.v2.model.override_relationships_user import OverrideRelationshipsUser +from datadog_api_client.v2.model.override_relationships_user_data import OverrideRelationshipsUserData +from datadog_api_client.v2.model.override_relationships_user_data_type import OverrideRelationshipsUserDataType +from datadog_api_client.v2.model.overrides import Overrides from datadog_api_client.v2.model.overwrite_allocations_request import OverwriteAllocationsRequest from datadog_api_client.v2.model.ownership_confidence_level import OwnershipConfidenceLevel from datadog_api_client.v2.model.ownership_evidence_attributes import OwnershipEvidenceAttributes @@ -14059,6 +14076,10 @@ "CreateOrUpdateWidgetRequest", "CreateOrUpdateWidgetRequestAttributes", "CreateOrUpdateWidgetRequestData", + "CreateOverrideRequestAttributes", + "CreateOverrideRequestData", + "CreateOverrideRequestRelationships", + "CreateOverridesRequest", "CreatePageRequest", "CreatePageRequestData", "CreatePageRequestDataAttributes", @@ -17970,6 +17991,19 @@ "OutputSchema", "OutputSchemaParameters", "OutputSchemaParametersType", + "OverrideAttributes", + "OverrideCreateResponse", + "OverrideData", + "OverrideDataType", + "OverrideIncluded", + "OverrideRelationships", + "OverrideRelationshipsSchedule", + "OverrideRelationshipsScheduleData", + "OverrideRelationshipsScheduleDataType", + "OverrideRelationshipsUser", + "OverrideRelationshipsUserData", + "OverrideRelationshipsUserDataType", + "Overrides", "OverwriteAllocationsRequest", "OwnershipConfidenceLevel", "OwnershipEvidenceAttributes", diff --git a/tests/generated-test/test-runner-data/manifest.json b/tests/generated-test/test-runner-data/manifest.json index 1502e31199..134a8663f1 100644 --- a/tests/generated-test/test-runner-data/manifest.json +++ b/tests/generated-test/test-runner-data/manifest.json @@ -8484,6 +8484,13 @@ "scenario": "Create On-Call escalation policy returns \"Created\" response", "version": "v2" }, + { + "feature": "On-Call", + "feature_file": "../../v2/features/on-call.feature", + "file": "v2/on-call/create-on-call-schedule-overrides-returns-created-response.json", + "scenario": "Create On-Call schedule overrides returns \"Created\" response", + "version": "v2" + }, { "feature": "On-Call", "feature_file": "../../v2/features/on-call.feature", @@ -8512,6 +8519,13 @@ "scenario": "Delete On-Call escalation policy returns \"No Content\" response", "version": "v2" }, + { + "feature": "On-Call", + "feature_file": "../../v2/features/on-call.feature", + "file": "v2/on-call/delete-on-call-schedule-override-returns-no-content-response.json", + "scenario": "Delete On-Call schedule override returns \"No Content\" response", + "version": "v2" + }, { "feature": "On-Call", "feature_file": "../../v2/features/on-call.feature", @@ -8596,6 +8610,13 @@ "scenario": "List On-Call notification rules for a user returns \"OK\" response", "version": "v2" }, + { + "feature": "On-Call", + "feature_file": "../../v2/features/on-call.feature", + "file": "v2/on-call/list-on-call-schedule-overrides-returns-ok-response.json", + "scenario": "List On-Call schedule overrides returns \"OK\" response", + "version": "v2" + }, { "feature": "On-Call", "feature_file": "../../v2/features/on-call.feature", diff --git a/tests/generated-test/test-runner-data/v2/on-call/create-on-call-schedule-overrides-returns-created-response.json b/tests/generated-test/test-runner-data/v2/on-call/create-on-call-schedule-overrides-returns-created-response.json new file mode 100644 index 0000000000..00923f27ea --- /dev/null +++ b/tests/generated-test/test-runner-data/v2/on-call/create-on-call-schedule-overrides-returns-created-response.json @@ -0,0 +1,61 @@ +{ + "api": "On-Call", + "expected_status": 201, + "feature": "On-Call", + "id": "v2/On-Call/Create On-Call schedule overrides returns \"Created\" response", + "operation_id": "CreateScheduleOverrides", + "request": { + "body": { + "schema": { + "format": null, + "ref": "CreateOverridesRequest", + "type": "object" + }, + "source": "inline", + "value": { + "data": [ + { + "attributes": { + "end": "{{ timeISO('now + 1d') }}", + "start": "{{ timeISO('now') }}" + }, + "relationships": { + "user": { + "data": { + "id": "{{ user.data.id }}", + "type": "users" + } + } + }, + "type": "overrides" + } + ] + } + }, + "content_type": "application/json", + "method": "POST", + "pagination": false, + "parameters": [ + { + "explode": null, + "in": "path", + "name": "schedule_id", + "required": true, + "schema": { + "format": null, + "ref": null, + "type": "string" + }, + "source": { + "path": "schedule.data.id", + "type": "fixture" + }, + "style": null + } + ], + "path": "/api/v2/on-call/schedules/{schedule_id}/overrides" + }, + "scenario": "Create On-Call schedule overrides returns \"Created\" response", + "schema_version": 1, + "version": "v2" +} diff --git a/tests/generated-test/test-runner-data/v2/on-call/delete-on-call-schedule-override-returns-no-content-response.json b/tests/generated-test/test-runner-data/v2/on-call/delete-on-call-schedule-override-returns-no-content-response.json new file mode 100644 index 0000000000..87f7d1c96c --- /dev/null +++ b/tests/generated-test/test-runner-data/v2/on-call/delete-on-call-schedule-override-returns-no-content-response.json @@ -0,0 +1,51 @@ +{ + "api": "On-Call", + "expected_status": 204, + "feature": "On-Call", + "id": "v2/On-Call/Delete On-Call schedule override returns \"No Content\" response", + "operation_id": "DeleteScheduleOverride", + "request": { + "body": null, + "content_type": null, + "method": "DELETE", + "pagination": false, + "parameters": [ + { + "explode": null, + "in": "path", + "name": "schedule_id", + "required": true, + "schema": { + "format": null, + "ref": null, + "type": "string" + }, + "source": { + "path": "schedule.data.id", + "type": "fixture" + }, + "style": null + }, + { + "explode": null, + "in": "path", + "name": "override_id", + "required": true, + "schema": { + "format": null, + "ref": null, + "type": "string" + }, + "source": { + "path": "override.data[0].id", + "type": "fixture" + }, + "style": null + } + ], + "path": "/api/v2/on-call/schedules/{schedule_id}/overrides/{override_id}" + }, + "scenario": "Delete On-Call schedule override returns \"No Content\" response", + "schema_version": 1, + "version": "v2" +} diff --git a/tests/generated-test/test-runner-data/v2/on-call/list-on-call-schedule-overrides-returns-ok-response.json b/tests/generated-test/test-runner-data/v2/on-call/list-on-call-schedule-overrides-returns-ok-response.json new file mode 100644 index 0000000000..2f84b7a984 --- /dev/null +++ b/tests/generated-test/test-runner-data/v2/on-call/list-on-call-schedule-overrides-returns-ok-response.json @@ -0,0 +1,67 @@ +{ + "api": "On-Call", + "expected_status": 200, + "feature": "On-Call", + "id": "v2/On-Call/List On-Call schedule overrides returns \"OK\" response", + "operation_id": "ListScheduleOverrides", + "request": { + "body": null, + "content_type": null, + "method": "GET", + "pagination": false, + "parameters": [ + { + "explode": null, + "in": "path", + "name": "schedule_id", + "required": true, + "schema": { + "format": null, + "ref": null, + "type": "string" + }, + "source": { + "path": "schedule.data.id", + "type": "fixture" + }, + "style": null + }, + { + "explode": null, + "in": "query", + "name": "filter[start]", + "required": true, + "schema": { + "format": "date-time", + "ref": null, + "type": "string" + }, + "source": { + "type": "literal", + "value": "{{ timeISO('now - 1d') }}" + }, + "style": null + }, + { + "explode": null, + "in": "query", + "name": "filter[end]", + "required": true, + "schema": { + "format": "date-time", + "ref": null, + "type": "string" + }, + "source": { + "type": "literal", + "value": "{{ timeISO('now + 2d') }}" + }, + "style": null + } + ], + "path": "/api/v2/on-call/schedules/{schedule_id}/overrides" + }, + "scenario": "List On-Call schedule overrides returns \"OK\" response", + "schema_version": 1, + "version": "v2" +} diff --git a/tests/generated-test/test-server-data/v2/on-call.json b/tests/generated-test/test-server-data/v2/on-call.json index 80c11d997e..3d6f3e098d 100644 --- a/tests/generated-test/test-server-data/v2/on-call.json +++ b/tests/generated-test/test-server-data/v2/on-call.json @@ -308,6 +308,216 @@ "scenario": "Create On-Call escalation policy returns \"Created\" response", "version": "v2" }, + { + "feature": "On-Call", + "frozen_at": "2026-10-06T08:42:47.443Z", + "interactions": [ + { + "request": { + "body": { + "type": "json", + "value": { + "data": { + "attributes": { + "email": "Test-Create_On_Call_schedule_overrides_returns_Created_response-1791276167@datadoghq.com", + "title": "user title" + }, + "type": "users" + } + } + }, + "content_type": "application/json", + "method": "POST", + "path": "/api/v2/users", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "{\"data\":{\"type\":\"users\",\"id\":\"27330e31-d3d9-4994-a41a-14691da1c8ab\",\"attributes\":{\"uuid\":\"27330e31-d3d9-4994-a41a-14691da1c8ab\",\"name\":null,\"handle\":\"test-create_on_call_schedule_overrides_returns_created_response-1791276167@datadoghq.com\",\"created_at\":\"2026-10-06T08:42:48.091337+00:00\",\"modified_at\":\"2026-10-06T08:42:48.091337+00:00\",\"email\":\"test-create_on_call_schedule_overrides_returns_created_response-1791276167@datadoghq.com\",\"icon\":\"https://secure.gravatar.com/avatar/eae271a7602fcbfc2e6d844cbed122c0?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\"}}}}}\n" + }, + "headers": { + "content-type": "application/json" + }, + "reason": "Created", + "status": 201 + } + }, + { + "request": { + "body": { + "type": "json", + "value": { + "data": { + "attributes": { + "layers": [ + { + "effective_date": "2026-09-26T08:42:47.443Z", + "end_date": "2026-10-16T08:42:47.443Z", + "interval": { + "days": 1 + }, + "members": [ + { + "user": { + "id": "27330e31-d3d9-4994-a41a-14691da1c8ab" + } + } + ], + "name": "Layer 1", + "restrictions": [ + { + "end_day": "friday", + "end_time": "17:00:00", + "start_day": "monday", + "start_time": "09:00:00" + } + ], + "rotation_start": "2026-10-01T08:42:47.443Z" + } + ], + "name": "Test-Create_On_Call_schedule_overrides_returns_Created_response-1791276167", + "time_zone": "America/New_York" + }, + "relationships": { + "teams": { + "data": [ + { + "id": "65aea9d0-941c-4607-bf8a-14fc0dac2820", + "type": "teams" + } + ] + } + }, + "type": "schedules" + } + } + }, + "content_type": "application/json", + "method": "POST", + "path": "/api/v2/on-call/schedules", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "{\"data\":{\"id\":\"4164292e-5479-4bba-8332-37458a9e25ab\",\"type\":\"schedules\",\"attributes\":{\"name\":\"Test-Create_On_Call_schedule_overrides_returns_Created_response-1791276167\",\"tags\":[],\"time_zone\":\"America/New_York\"},\"relationships\":{\"layers\":{\"data\":[{\"id\":\"90b867ea-bd5a-4926-86f0-51170247d1bb\",\"type\":\"layers\"}]},\"teams\":{\"data\":[{\"id\":\"65aea9d0-941c-4607-bf8a-14fc0dac2820\",\"type\":\"teams\"}]}}}}" + }, + "headers": { + "content-type": "application/vnd.api+json" + }, + "reason": "Created", + "status": 201 + } + }, + { + "request": { + "body": { + "type": "json", + "value": { + "data": [ + { + "attributes": { + "end": "2026-10-07T08:42:47.443Z", + "start": "2026-10-06T08:42:47.443Z" + }, + "relationships": { + "user": { + "data": { + "id": "27330e31-d3d9-4994-a41a-14691da1c8ab", + "type": "users" + } + } + }, + "type": "overrides" + } + ] + } + }, + "content_type": "application/json", + "method": "POST", + "path": "/api/v2/on-call/schedules/4164292e-5479-4bba-8332-37458a9e25ab/overrides", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "{\"data\":[{\"id\":\"60640257-ccce-4df6-8750-26cf92dd011b\",\"type\":\"overrides\",\"attributes\":{\"end\":\"2026-10-07T08:42:47.443Z\",\"inactive\":false,\"start\":\"2026-10-06T08:42:49.172035924Z\"},\"relationships\":{\"schedule\":{\"data\":{\"id\":\"4164292e-5479-4bba-8332-37458a9e25ab\",\"type\":\"schedules\"}},\"user\":{\"data\":{\"id\":\"27330e31-d3d9-4994-a41a-14691da1c8ab\",\"type\":\"users\"}}}}]}" + }, + "headers": { + "content-type": "application/vnd.api+json" + }, + "reason": "Created", + "status": 201 + } + }, + { + "request": { + "body": { + "type": "empty", + "value": null + }, + "content_type": "", + "method": "DELETE", + "path": "/api/v2/on-call/schedules/4164292e-5479-4bba-8332-37458a9e25ab/overrides/60640257-ccce-4df6-8750-26cf92dd011b", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "" + }, + "headers": {}, + "reason": "No Content", + "status": 204 + } + }, + { + "request": { + "body": { + "type": "empty", + "value": null + }, + "content_type": "", + "method": "DELETE", + "path": "/api/v2/on-call/schedules/4164292e-5479-4bba-8332-37458a9e25ab", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "" + }, + "headers": {}, + "reason": "No Content", + "status": 204 + } + }, + { + "request": { + "body": { + "type": "empty", + "value": null + }, + "content_type": "", + "method": "DELETE", + "path": "/api/v2/users/27330e31-d3d9-4994-a41a-14691da1c8ab", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "" + }, + "headers": {}, + "reason": "No Content", + "status": 204 + } + } + ], + "scenario": "Create On-Call schedule overrides returns \"Created\" response", + "version": "v2" + }, { "feature": "On-Call", "frozen_at": "2025-11-27T14:11:22.484Z", @@ -918,33 +1128,246 @@ "id": "a42481db-6918-45ef-a923-5548004f044a", "type": "teams" } - ] + ] + } + ] + }, + "relationships": { + "teams": { + "data": [ + { + "id": "a42481db-6918-45ef-a923-5548004f044a", + "type": "teams" + } + ] + } + }, + "type": "policies" + } + } + }, + "content_type": "application/json", + "method": "POST", + "path": "/api/v2/on-call/escalation-policies", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "{\"data\":{\"id\":\"c25d7cd6-d2bc-4d84-801b-3a09d62e29bc\",\"type\":\"policies\",\"attributes\":{\"name\":\"Test-Delete_On_Call_escalation_policy_returns_No_Content_response-1764252685\",\"resolve_page_on_policy_end\":true,\"retries\":2},\"relationships\":{\"steps\":{\"data\":[{\"id\":\"b445f325-7fca-44d5-a7e2-2a16e8bc2837\",\"type\":\"steps\"},{\"id\":\"b9c6527e-9c8d-4c93-92cf-100b5c180a1e\",\"type\":\"steps\"}]},\"teams\":{\"data\":[{\"id\":\"a42481db-6918-45ef-a923-5548004f044a\",\"type\":\"teams\"}]}}}}" + }, + "headers": { + "content-type": "application/vnd.api+json" + }, + "reason": "Created", + "status": 201 + } + }, + { + "request": { + "body": { + "type": "empty", + "value": null + }, + "content_type": "", + "method": "DELETE", + "path": "/api/v2/on-call/escalation-policies/c25d7cd6-d2bc-4d84-801b-3a09d62e29bc", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "" + }, + "headers": {}, + "reason": "No Content", + "status": 204 + } + }, + { + "request": { + "body": { + "type": "empty", + "value": null + }, + "content_type": "", + "method": "DELETE", + "path": "/api/v2/on-call/escalation-policies/c25d7cd6-d2bc-4d84-801b-3a09d62e29bc", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "{\"errors\":[{\"title\":\"Generic Error\",\"detail\":\"escalation_policy[c25d7cd6-d2bc-4d84-801b-3a09d62e29bc] not found\"}]}" + }, + "headers": { + "content-type": "application/vnd.api+json" + }, + "reason": "Not Found", + "status": 404 + } + }, + { + "request": { + "body": { + "type": "empty", + "value": null + }, + "content_type": "", + "method": "DELETE", + "path": "/api/v2/on-call/schedules/cf196f34-3ce0-4cff-a27e-ed5035db9442", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "" + }, + "headers": {}, + "reason": "No Content", + "status": 204 + } + }, + { + "request": { + "body": { + "type": "empty", + "value": null + }, + "content_type": "", + "method": "DELETE", + "path": "/api/v2/team/a42481db-6918-45ef-a923-5548004f044a", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "" + }, + "headers": {}, + "reason": "No Content", + "status": 204 + } + }, + { + "request": { + "body": { + "type": "empty", + "value": null + }, + "content_type": "", + "method": "DELETE", + "path": "/api/v2/users/f5e7c666-cb9a-11f0-ae87-2a5e5028fcef", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "" + }, + "headers": {}, + "reason": "No Content", + "status": 204 + } + } + ], + "scenario": "Delete On-Call escalation policy returns \"No Content\" response", + "version": "v2" + }, + { + "feature": "On-Call", + "frozen_at": "2026-10-06T08:49:55.200Z", + "interactions": [ + { + "request": { + "body": { + "type": "json", + "value": { + "data": { + "attributes": { + "email": "Test-Delete_On_Call_schedule_override_returns_No_Content_response-1791276595@datadoghq.com", + "title": "user title" + }, + "type": "users" + } + } + }, + "content_type": "application/json", + "method": "POST", + "path": "/api/v2/users", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "{\"data\":{\"type\":\"users\",\"id\":\"29374a96-b8c0-4d3a-b087-c5ccfb164565\",\"attributes\":{\"uuid\":\"29374a96-b8c0-4d3a-b087-c5ccfb164565\",\"name\":null,\"handle\":\"test-delete_on_call_schedule_override_returns_no_content_response-1791276595@datadoghq.com\",\"created_at\":\"2026-10-06T08:49:55.984951+00:00\",\"modified_at\":\"2026-10-06T08:49:55.984951+00:00\",\"email\":\"test-delete_on_call_schedule_override_returns_no_content_response-1791276595@datadoghq.com\",\"icon\":\"https://secure.gravatar.com/avatar/fc0de12aa0cc4a42039c8d50b2eef23a?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\"}}}}}\n" + }, + "headers": { + "content-type": "application/json" + }, + "reason": "Created", + "status": 201 + } + }, + { + "request": { + "body": { + "type": "json", + "value": { + "data": { + "attributes": { + "layers": [ + { + "effective_date": "2026-09-26T08:49:55.200Z", + "end_date": "2026-10-16T08:49:55.200Z", + "interval": { + "days": 1 + }, + "members": [ + { + "user": { + "id": "29374a96-b8c0-4d3a-b087-c5ccfb164565" + } + } + ], + "name": "Layer 1", + "restrictions": [ + { + "end_day": "friday", + "end_time": "17:00:00", + "start_day": "monday", + "start_time": "09:00:00" + } + ], + "rotation_start": "2026-10-01T08:49:55.200Z" } - ] + ], + "name": "Test-Delete_On_Call_schedule_override_returns_No_Content_response-1791276595", + "time_zone": "America/New_York" }, "relationships": { "teams": { "data": [ { - "id": "a42481db-6918-45ef-a923-5548004f044a", + "id": "65aea9d0-941c-4607-bf8a-14fc0dac2820", "type": "teams" } ] } }, - "type": "policies" + "type": "schedules" } } }, "content_type": "application/json", "method": "POST", - "path": "/api/v2/on-call/escalation-policies", + "path": "/api/v2/on-call/schedules", "query": [] }, "response": { "body": { "encoding": "text", - "value": "{\"data\":{\"id\":\"c25d7cd6-d2bc-4d84-801b-3a09d62e29bc\",\"type\":\"policies\",\"attributes\":{\"name\":\"Test-Delete_On_Call_escalation_policy_returns_No_Content_response-1764252685\",\"resolve_page_on_policy_end\":true,\"retries\":2},\"relationships\":{\"steps\":{\"data\":[{\"id\":\"b445f325-7fca-44d5-a7e2-2a16e8bc2837\",\"type\":\"steps\"},{\"id\":\"b9c6527e-9c8d-4c93-92cf-100b5c180a1e\",\"type\":\"steps\"}]},\"teams\":{\"data\":[{\"id\":\"a42481db-6918-45ef-a923-5548004f044a\",\"type\":\"teams\"}]}}}}" + "value": "{\"data\":{\"id\":\"17dfc152-2200-4514-9eca-718d30bd736f\",\"type\":\"schedules\",\"attributes\":{\"name\":\"Test-Delete_On_Call_schedule_override_returns_No_Content_response-1791276595\",\"tags\":[],\"time_zone\":\"America/New_York\"},\"relationships\":{\"layers\":{\"data\":[{\"id\":\"a02c99c5-9159-456d-a6ee-56ba954936e7\",\"type\":\"layers\"}]},\"teams\":{\"data\":[{\"id\":\"65aea9d0-941c-4607-bf8a-14fc0dac2820\",\"type\":\"teams\"}]}}}}" }, "headers": { "content-type": "application/vnd.api+json" @@ -956,22 +1379,42 @@ { "request": { "body": { - "type": "empty", - "value": null + "type": "json", + "value": { + "data": [ + { + "attributes": { + "end": "2026-10-07T08:49:55.200Z", + "start": "2026-10-06T08:49:55.200Z" + }, + "relationships": { + "user": { + "data": { + "id": "29374a96-b8c0-4d3a-b087-c5ccfb164565", + "type": "users" + } + } + }, + "type": "overrides" + } + ] + } }, - "content_type": "", - "method": "DELETE", - "path": "/api/v2/on-call/escalation-policies/c25d7cd6-d2bc-4d84-801b-3a09d62e29bc", + "content_type": "application/json", + "method": "POST", + "path": "/api/v2/on-call/schedules/17dfc152-2200-4514-9eca-718d30bd736f/overrides", "query": [] }, "response": { "body": { "encoding": "text", - "value": "" + "value": "{\"data\":[{\"id\":\"cb7930dc-cb88-424c-83fc-0225d15be537\",\"type\":\"overrides\",\"attributes\":{\"end\":\"2026-10-07T08:49:55.2Z\",\"inactive\":false,\"start\":\"2026-10-06T08:49:56.710364158Z\"},\"relationships\":{\"schedule\":{\"data\":{\"id\":\"17dfc152-2200-4514-9eca-718d30bd736f\",\"type\":\"schedules\"}},\"user\":{\"data\":{\"id\":\"29374a96-b8c0-4d3a-b087-c5ccfb164565\",\"type\":\"users\"}}}}]}" }, - "headers": {}, - "reason": "No Content", - "status": 204 + "headers": { + "content-type": "application/vnd.api+json" + }, + "reason": "Created", + "status": 201 } }, { @@ -982,19 +1425,17 @@ }, "content_type": "", "method": "DELETE", - "path": "/api/v2/on-call/escalation-policies/c25d7cd6-d2bc-4d84-801b-3a09d62e29bc", + "path": "/api/v2/on-call/schedules/17dfc152-2200-4514-9eca-718d30bd736f/overrides/cb7930dc-cb88-424c-83fc-0225d15be537", "query": [] }, "response": { "body": { "encoding": "text", - "value": "{\"errors\":[{\"title\":\"Generic Error\",\"detail\":\"escalation_policy[c25d7cd6-d2bc-4d84-801b-3a09d62e29bc] not found\"}]}" - }, - "headers": { - "content-type": "application/vnd.api+json" + "value": "" }, - "reason": "Not Found", - "status": 404 + "headers": {}, + "reason": "No Content", + "status": 204 } }, { @@ -1005,7 +1446,7 @@ }, "content_type": "", "method": "DELETE", - "path": "/api/v2/on-call/schedules/cf196f34-3ce0-4cff-a27e-ed5035db9442", + "path": "/api/v2/on-call/schedules/17dfc152-2200-4514-9eca-718d30bd736f/overrides/cb7930dc-cb88-424c-83fc-0225d15be537", "query": [] }, "response": { @@ -1026,7 +1467,7 @@ }, "content_type": "", "method": "DELETE", - "path": "/api/v2/team/a42481db-6918-45ef-a923-5548004f044a", + "path": "/api/v2/on-call/schedules/17dfc152-2200-4514-9eca-718d30bd736f", "query": [] }, "response": { @@ -1047,7 +1488,7 @@ }, "content_type": "", "method": "DELETE", - "path": "/api/v2/users/f5e7c666-cb9a-11f0-ae87-2a5e5028fcef", + "path": "/api/v2/users/29374a96-b8c0-4d3a-b087-c5ccfb164565", "query": [] }, "response": { @@ -1061,7 +1502,7 @@ } } ], - "scenario": "Delete On-Call escalation policy returns \"No Content\" response", + "scenario": "Delete On-Call schedule override returns \"No Content\" response", "version": "v2" }, { @@ -3314,6 +3755,248 @@ "scenario": "List On-Call notification rules for a user returns \"OK\" response", "version": "v2" }, + { + "feature": "On-Call", + "frozen_at": "2026-10-06T08:43:24.486Z", + "interactions": [ + { + "request": { + "body": { + "type": "json", + "value": { + "data": { + "attributes": { + "email": "Test-List_On_Call_schedule_overrides_returns_OK_response-1791276204@datadoghq.com", + "title": "user title" + }, + "type": "users" + } + } + }, + "content_type": "application/json", + "method": "POST", + "path": "/api/v2/users", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "{\"data\":{\"type\":\"users\",\"id\":\"35d9d4c3-4fa9-413b-a35c-c3c295c172db\",\"attributes\":{\"uuid\":\"35d9d4c3-4fa9-413b-a35c-c3c295c172db\",\"name\":null,\"handle\":\"test-list_on_call_schedule_overrides_returns_ok_response-1791276204@datadoghq.com\",\"created_at\":\"2026-10-06T08:43:25.005435+00:00\",\"modified_at\":\"2026-10-06T08:43:25.005435+00:00\",\"email\":\"test-list_on_call_schedule_overrides_returns_ok_response-1791276204@datadoghq.com\",\"icon\":\"https://secure.gravatar.com/avatar/8fe3e59240d413aa181a1ed1d005a734?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\"}}}}}\n" + }, + "headers": { + "content-type": "application/json" + }, + "reason": "Created", + "status": 201 + } + }, + { + "request": { + "body": { + "type": "json", + "value": { + "data": { + "attributes": { + "layers": [ + { + "effective_date": "2026-09-26T08:43:24.486Z", + "end_date": "2026-10-16T08:43:24.486Z", + "interval": { + "days": 1 + }, + "members": [ + { + "user": { + "id": "35d9d4c3-4fa9-413b-a35c-c3c295c172db" + } + } + ], + "name": "Layer 1", + "restrictions": [ + { + "end_day": "friday", + "end_time": "17:00:00", + "start_day": "monday", + "start_time": "09:00:00" + } + ], + "rotation_start": "2026-10-01T08:43:24.486Z" + } + ], + "name": "Test-List_On_Call_schedule_overrides_returns_OK_response-1791276204", + "time_zone": "America/New_York" + }, + "relationships": { + "teams": { + "data": [ + { + "id": "65aea9d0-941c-4607-bf8a-14fc0dac2820", + "type": "teams" + } + ] + } + }, + "type": "schedules" + } + } + }, + "content_type": "application/json", + "method": "POST", + "path": "/api/v2/on-call/schedules", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "{\"data\":{\"id\":\"4ae25b05-e83f-42ed-9e41-b43ebf934999\",\"type\":\"schedules\",\"attributes\":{\"name\":\"Test-List_On_Call_schedule_overrides_returns_OK_response-1791276204\",\"tags\":[],\"time_zone\":\"America/New_York\"},\"relationships\":{\"layers\":{\"data\":[{\"id\":\"485408e0-e4eb-452a-8731-3a834ef0ec6e\",\"type\":\"layers\"}]},\"teams\":{\"data\":[{\"id\":\"65aea9d0-941c-4607-bf8a-14fc0dac2820\",\"type\":\"teams\"}]}}}}" + }, + "headers": { + "content-type": "application/vnd.api+json" + }, + "reason": "Created", + "status": 201 + } + }, + { + "request": { + "body": { + "type": "json", + "value": { + "data": [ + { + "attributes": { + "end": "2026-10-07T08:43:24.486Z", + "start": "2026-10-06T08:43:24.486Z" + }, + "relationships": { + "user": { + "data": { + "id": "35d9d4c3-4fa9-413b-a35c-c3c295c172db", + "type": "users" + } + } + }, + "type": "overrides" + } + ] + } + }, + "content_type": "application/json", + "method": "POST", + "path": "/api/v2/on-call/schedules/4ae25b05-e83f-42ed-9e41-b43ebf934999/overrides", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "{\"data\":[{\"id\":\"374246e6-f1e4-4570-aa1b-ed0235966153\",\"type\":\"overrides\",\"attributes\":{\"end\":\"2026-10-07T08:43:24.486Z\",\"inactive\":false,\"start\":\"2026-10-06T08:43:26.48255523Z\"},\"relationships\":{\"schedule\":{\"data\":{\"id\":\"4ae25b05-e83f-42ed-9e41-b43ebf934999\",\"type\":\"schedules\"}},\"user\":{\"data\":{\"id\":\"35d9d4c3-4fa9-413b-a35c-c3c295c172db\",\"type\":\"users\"}}}}]}" + }, + "headers": { + "content-type": "application/vnd.api+json" + }, + "reason": "Created", + "status": 201 + } + }, + { + "request": { + "body": { + "type": "empty", + "value": null + }, + "content_type": "", + "method": "GET", + "path": "/api/v2/on-call/schedules/4ae25b05-e83f-42ed-9e41-b43ebf934999/overrides", + "query": [ + [ + "filter[end]", + "2026-10-08T08:43:24.486Z" + ], + [ + "filter[start]", + "2026-10-05T08:43:24.486Z" + ] + ] + }, + "response": { + "body": { + "encoding": "text", + "value": "{\"data\":[{\"id\":\"374246e6-f1e4-4570-aa1b-ed0235966153\",\"type\":\"overrides\",\"attributes\":{\"end\":\"2026-10-07T08:43:24.486Z\",\"inactive\":false,\"start\":\"2026-10-06T08:43:26.482555Z\"},\"relationships\":{\"schedule\":{\"data\":{\"id\":\"4ae25b05-e83f-42ed-9e41-b43ebf934999\",\"type\":\"schedules\"}},\"user\":{\"data\":{\"id\":\"35d9d4c3-4fa9-413b-a35c-c3c295c172db\",\"type\":\"users\"}}}}]}" + }, + "headers": { + "content-type": "application/vnd.api+json" + }, + "reason": "OK", + "status": 200 + } + }, + { + "request": { + "body": { + "type": "empty", + "value": null + }, + "content_type": "", + "method": "DELETE", + "path": "/api/v2/on-call/schedules/4ae25b05-e83f-42ed-9e41-b43ebf934999/overrides/374246e6-f1e4-4570-aa1b-ed0235966153", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "" + }, + "headers": {}, + "reason": "No Content", + "status": 204 + } + }, + { + "request": { + "body": { + "type": "empty", + "value": null + }, + "content_type": "", + "method": "DELETE", + "path": "/api/v2/on-call/schedules/4ae25b05-e83f-42ed-9e41-b43ebf934999", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "" + }, + "headers": {}, + "reason": "No Content", + "status": 204 + } + }, + { + "request": { + "body": { + "type": "empty", + "value": null + }, + "content_type": "", + "method": "DELETE", + "path": "/api/v2/users/35d9d4c3-4fa9-413b-a35c-c3c295c172db", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "" + }, + "headers": {}, + "reason": "No Content", + "status": 204 + } + } + ], + "scenario": "List On-Call schedule overrides returns \"OK\" response", + "version": "v2" + }, { "feature": "On-Call", "frozen_at": "2026-09-09T14:54:42.222Z", diff --git a/tests/v2/features/given.json b/tests/v2/features/given.json index 5ffa0551ac..6ba40370b1 100644 --- a/tests/v2/features/given.json +++ b/tests/v2/features/given.json @@ -1226,6 +1226,22 @@ "tag": "On-Call", "operationId": "CreateOnCallSchedule" }, + { + "parameters": [ + { + "name": "schedule_id", + "source": "schedule.data.id" + }, + { + "name": "body", + "value": "{\n \"data\": [\n {\n \"type\": \"overrides\",\n \"attributes\": {\n \"start\": \"{{ timeISO('now') }}\",\n \"end\": \"{{ timeISO('now + 1d') }}\"\n },\n \"relationships\": {\n \"user\": {\n \"data\": {\n \"id\": \"{{ user.data.id }}\",\n \"type\": \"users\"\n }\n }\n }\n }\n ]\n}" + } + ], + "step": "there is a valid \"override\" in the system", + "key": "override", + "tag": "On-Call", + "operationId": "CreateScheduleOverrides" + }, { "parameters": [ { diff --git a/tests/v2/features/on-call.feature b/tests/v2/features/on-call.feature index 682e7e8919..37d33074e5 100644 --- a/tests/v2/features/on-call.feature +++ b/tests/v2/features/on-call.feature @@ -27,6 +27,32 @@ Feature: On-Call When the request is sent Then the response status is 201 Created + @generated @skip @team:ddoghq/on-call + Scenario: Create On-Call schedule overrides returns "Bad Request" response + Given new "CreateScheduleOverrides" request + And request contains "schedule_id" parameter from "REPLACE.ME" + And body with value {"data": [{"attributes": {"end": "2024-01-08T02:53:01.000000000Z", "start": "2024-01-07T02:53:01.000000000Z"}, "relationships": {"overridden_user": {"data": {"id": "00000000-0000-0000-0000-000000000000", "type": "users"}}, "user": {"data": {"id": "00000000-0000-0000-0000-000000000000", "type": "users"}}}, "type": "overrides"}]} + When the request is sent + Then the response status is 400 Bad Request + + @team:ddoghq/on-call + Scenario: Create On-Call schedule overrides returns "Created" response + Given new "CreateScheduleOverrides" request + And there is a valid "user" in the system + And there is a valid "schedule" in the system + And request contains "schedule_id" parameter from "schedule.data.id" + And body with value {"data": [{"attributes": {"end": "{{ timeISO('now + 1d') }}", "start": "{{ timeISO('now') }}"}, "relationships": {"user": {"data": {"id": "{{ user.data.id }}", "type": "users"}}}, "type": "overrides"}]} + When the request is sent + Then the response status is 201 Created + + @generated @skip @team:ddoghq/on-call + Scenario: Create On-Call schedule overrides returns "Not Found" response + Given new "CreateScheduleOverrides" request + And request contains "schedule_id" parameter from "REPLACE.ME" + And body with value {"data": [{"attributes": {"end": "2024-01-08T02:53:01.000000000Z", "start": "2024-01-07T02:53:01.000000000Z"}, "relationships": {"overridden_user": {"data": {"id": "00000000-0000-0000-0000-000000000000", "type": "users"}}, "user": {"data": {"id": "00000000-0000-0000-0000-000000000000", "type": "users"}}}, "type": "overrides"}]} + When the request is sent + Then the response status is 404 Not Found + @generated @skip @team:ddoghq/on-call Scenario: Create On-Call schedule returns "Bad Request" response Given new "CreateOnCallSchedule" request @@ -114,6 +140,33 @@ Feature: On-Call When the request is sent Then the response status is 404 Not Found + @generated @skip @team:ddoghq/on-call + Scenario: Delete On-Call schedule override returns "Bad Request" response + Given new "DeleteScheduleOverride" request + And request contains "schedule_id" parameter from "REPLACE.ME" + And request contains "override_id" parameter from "REPLACE.ME" + When the request is sent + Then the response status is 400 Bad Request + + @team:ddoghq/on-call + Scenario: Delete On-Call schedule override returns "No Content" response + Given new "DeleteScheduleOverride" request + And there is a valid "user" in the system + And there is a valid "schedule" in the system + And there is a valid "override" in the system + And request contains "schedule_id" parameter from "schedule.data.id" + And request contains "override_id" parameter from "override.data[0].id" + When the request is sent + Then the response status is 204 No Content + + @generated @skip @team:ddoghq/on-call + Scenario: Delete On-Call schedule override returns "Not Found" response + Given new "DeleteScheduleOverride" request + And request contains "schedule_id" parameter from "REPLACE.ME" + And request contains "override_id" parameter from "REPLACE.ME" + When the request is sent + Then the response status is 404 Not Found + @team:ddoghq/on-call Scenario: Delete On-Call schedule returns "No Content" response Given new "DeleteOnCallSchedule" request @@ -416,6 +469,46 @@ Feature: On-Call And the response "data" has length 1 And the response "included" has length 1 + @generated @skip @team:ddoghq/on-call + Scenario: List On-Call schedule overrides returns "Bad Request" response + Given new "ListScheduleOverrides" request + And request contains "schedule_id" parameter from "REPLACE.ME" + And request contains "filter[start]" parameter from "REPLACE.ME" + And request contains "filter[end]" parameter from "REPLACE.ME" + When the request is sent + Then the response status is 400 Bad Request + + @generated @skip @team:ddoghq/on-call + Scenario: List On-Call schedule overrides returns "Not Found" response + Given new "ListScheduleOverrides" request + And request contains "schedule_id" parameter from "REPLACE.ME" + And request contains "filter[start]" parameter from "REPLACE.ME" + And request contains "filter[end]" parameter from "REPLACE.ME" + When the request is sent + Then the response status is 404 Not Found + + @team:ddoghq/on-call + Scenario: List On-Call schedule overrides returns "OK" response + Given new "ListScheduleOverrides" request + And there is a valid "user" in the system + And there is a valid "schedule" in the system + And there is a valid "override" in the system + And request contains "schedule_id" parameter from "schedule.data.id" + And request contains "filter[start]" parameter with value "{{ timeISO('now - 1d') }}" + And request contains "filter[end]" parameter with value "{{ timeISO('now + 2d') }}" + When the request is sent + Then the response status is 200 OK + And the response "data" has length 1 + + @generated @skip @team:ddoghq/on-call @with-pagination + Scenario: List On-Call schedule overrides returns "OK" response with pagination + Given new "ListScheduleOverrides" request + And request contains "schedule_id" parameter from "REPLACE.ME" + And request contains "filter[start]" parameter from "REPLACE.ME" + And request contains "filter[end]" parameter from "REPLACE.ME" + When the request with pagination is sent + Then the response status is 200 OK + @generated @skip @team:ddoghq/on-call Scenario: List On-Call schedules returns "Bad Request" response Given new "ListOnCallSchedules" request diff --git a/tests/v2/features/undo.json b/tests/v2/features/undo.json index 633391ec1a..5bbc5c1cd2 100644 --- a/tests/v2/features/undo.json +++ b/tests/v2/features/undo.json @@ -6709,6 +6709,36 @@ "type": "safe" } }, + "ListScheduleOverrides": { + "tag": "On-Call", + "undo": { + "type": "safe" + } + }, + "CreateScheduleOverrides": { + "tag": "On-Call", + "undo": { + "operationId": "DeleteScheduleOverride", + "parameters": [ + { + "name": "schedule_id", + "origin": "path", + "source": "schedule_id" + }, + { + "name": "override_id", + "source": "data[0].id" + } + ], + "type": "unsafe" + } + }, + "DeleteScheduleOverride": { + "tag": "On-Call", + "undo": { + "type": "idempotent" + } + }, "GetScheduleOnCallResponders": { "tag": "On-Call", "undo": {