diff --git a/.generator/schemas/v2/openapi.yaml b/.generator/schemas/v2/openapi.yaml index 27ad049e17c7..d20fd35a2ce0 100644 --- a/.generator/schemas/v2/openapi.yaml +++ b/.generator/schemas/v2/openapi.yaml @@ -4715,6 +4715,15 @@ components: - OPENURL - DOWNLOADFILE - SETSTATEVARIABLEVALUE + AppBuilderListTagsResponse: + description: The response for listing tags associated with apps. + properties: + data: + description: An array of tags. + items: + $ref: "#/components/schemas/TagData" + type: array + type: object AppDefinitionType: default: appDefinitions description: The app definition type. @@ -9162,6 +9171,161 @@ components: data: $ref: "#/components/schemas/BillingDimensionsMappingBody" type: object + BlueprintAttributes: + description: The attributes of a blueprint resource. + properties: + created_at: + description: The timestamp when the blueprint was created. + example: "" + format: date-time + type: string + definition: + $ref: "#/components/schemas/AppDefinitionType" + description: + description: A description of what the blueprint does. + example: "" + type: string + embedded_datastore_blueprints: + additionalProperties: {} + description: Embedded datastore blueprints. + type: object + embedded_native_actions: + description: Embedded native actions. + items: + $ref: "#/components/schemas/BlueprintNativeAction" + type: array + embedded_workflow_blueprints: + additionalProperties: {} + description: Embedded workflow blueprints. + type: object + integration_id: + description: The integration ID associated with the blueprint. + type: string + mocked_outputs: + additionalProperties: {} + description: Mocked outputs for testing the blueprint. + type: object + name: + description: The human-readable name of the blueprint. + example: AWS Service Manager + type: string + slug: + description: The unique slug identifier of the blueprint. + example: aws-service-manager + type: string + tags: + description: Tags associated with the blueprint. + items: + type: string + type: array + tile_background: + description: The background style of the blueprint tile. + type: string + tile_icon_action_fqn: + description: The fully qualified name of the action used as the tile icon. + type: string + updated_at: + description: The timestamp when the blueprint was last updated. + example: "" + format: date-time + type: string + required: + - slug + - name + - description + - definition + - created_at + - updated_at + type: object + BlueprintData: + description: A blueprint resource. + properties: + attributes: + $ref: "#/components/schemas/BlueprintAttributes" + id: + description: The ID of the blueprint. + example: 65bb1f25-52e1-4510-9f8d-22d1516ed693 + format: uuid + type: string + type: + $ref: "#/components/schemas/BlueprintDataType" + required: + - id + - type + - attributes + type: object + BlueprintDataType: + description: The resource type for a blueprint. + enum: + - blueprint + example: blueprint + type: string + x-enum-varnames: + - BLUEPRINT + BlueprintMetadataAttributes: + description: The attributes of a blueprint metadata resource. + properties: + created_at: + description: The timestamp when the blueprint was created. + example: "" + format: date-time + type: string + description: + description: A description of what the blueprint does. + example: "" + type: string + name: + description: The human-readable name of the blueprint. + example: AWS Service Manager + type: string + slug: + description: The unique slug identifier of the blueprint. + example: aws-service-manager + type: string + tags: + description: Tags associated with the blueprint. + items: + type: string + type: array + tile_background: + description: The background style of the blueprint tile. + type: string + tile_icon_action_fqn: + description: The fully qualified name of the action used as the tile icon. + type: string + updated_at: + description: The timestamp when the blueprint was last updated. + example: "" + format: date-time + type: string + required: + - slug + - name + - description + - created_at + - updated_at + type: object + BlueprintMetadataData: + description: A blueprint metadata resource. + properties: + attributes: + $ref: "#/components/schemas/BlueprintMetadataAttributes" + id: + description: The ID of the blueprint. + example: 65bb1f25-52e1-4510-9f8d-22d1516ed693 + format: uuid + type: string + type: + $ref: "#/components/schemas/BlueprintDataType" + required: + - id + - type + - attributes + type: object + BlueprintNativeAction: + additionalProperties: {} + description: An embedded native action in a blueprint. + type: object BranchCoverageSummaryRequest: description: Request object for getting code coverage summary for a branch. properties: @@ -33837,6 +34001,21 @@ components: type: string type: array type: object + GetBlueprintResponse: + description: The response for retrieving a single blueprint. + properties: + data: + $ref: "#/components/schemas/BlueprintData" + type: object + GetBlueprintsResponse: + description: The response for retrieving multiple blueprints. + properties: + data: + description: An array of blueprints. + items: + $ref: "#/components/schemas/BlueprintData" + type: array + type: object GetCustomFrameworkResponse: description: Response object to get a custom framework. properties: @@ -45444,6 +45623,15 @@ components: required: - data type: object + ListBlueprintsResponse: + description: The response for listing available blueprints. + properties: + data: + description: An array of blueprint metadata. + items: + $ref: "#/components/schemas/BlueprintMetadataData" + type: array + type: object ListCampaignsResponse: description: Response containing a list of campaigns. properties: @@ -82682,6 +82870,28 @@ components: - type - id type: object + TagData: + description: A tag resource associated with an app. + properties: + id: + description: The name of the tag. + example: production + type: string + type: + $ref: "#/components/schemas/TagDataType" + required: + - id + - type + type: object + TagDataType: + description: The resource type for a tag. + enum: + - tag + example: tag + minLength: 3 + type: string + x-enum-varnames: + - TAG TagsEventAttribute: description: Array of tags associated with your event. example: ["team:A"] @@ -95843,6 +96053,252 @@ paths: permissions: - apps_run - connections_read + "/api/v2/app-builder/blueprint/{blueprint_id}": + get: + description: Retrieve an app blueprint by its ID. + operationId: GetBlueprint + parameters: + - description: The ID of the blueprint to retrieve. + example: 65bb1f25-52e1-4510-9f8d-22d1516ed693 + in: path + name: blueprint_id + required: true + schema: + format: uuid + type: string + responses: + "200": + content: + application/json: + examples: + default: + value: + data: + attributes: + created_at: "2024-01-01T00:00:00Z" + definition: {} + description: Manage your AWS services from Datadog. + name: AWS Service Manager + slug: aws-service-manager + updated_at: "2024-01-01T00:00:00Z" + id: 65bb1f25-52e1-4510-9f8d-22d1516ed693 + type: blueprint + schema: + $ref: "#/components/schemas/GetBlueprintResponse" + description: OK + "403": + content: + application/json: + schema: + $ref: "#/components/schemas/JSONAPIErrorResponse" + description: Forbidden + "404": + content: + application/json: + schema: + $ref: "#/components/schemas/JSONAPIErrorResponse" + description: Not Found + "429": + $ref: "#/components/responses/TooManyRequestsResponse" + summary: Get Blueprint + tags: + - App Builder + "x-permission": + operator: OR + permissions: + - apps_run + - apps_write + - connections_read + - connections_write + /api/v2/app-builder/blueprints: + get: + description: List available app blueprints. + operationId: ListBlueprints + parameters: + - description: The number of blueprints to return per page. Defaults to 10. Maximum is 100. + in: query + name: limit + required: false + schema: + format: int64 + type: integer + - description: The page of results to return. Starts at 0. + in: query + name: page + required: false + schema: + format: int64 + type: integer + responses: + "200": + content: + application/json: + examples: + default: + value: + data: + - attributes: + created_at: "2024-01-01T00:00:00Z" + description: Manage your AWS services from Datadog. + name: AWS Service Manager + slug: aws-service-manager + updated_at: "2024-01-01T00:00:00Z" + id: 65bb1f25-52e1-4510-9f8d-22d1516ed693 + type: blueprint + schema: + $ref: "#/components/schemas/ListBlueprintsResponse" + description: OK + "403": + content: + application/json: + schema: + $ref: "#/components/schemas/JSONAPIErrorResponse" + description: Forbidden + "429": + $ref: "#/components/responses/TooManyRequestsResponse" + summary: List Blueprints + tags: + - App Builder + "x-permission": + operator: OR + permissions: + - apps_run + - apps_write + - connections_read + - connections_write + "/api/v2/app-builder/blueprints/integration-id/{integration_id}": + get: + description: List app blueprints associated with a specific integration ID. + operationId: GetBlueprintsByIntegrationId + parameters: + - description: The integration ID to filter blueprints by. + example: aws + in: path + name: integration_id + required: true + schema: + type: string + responses: + "200": + content: + application/json: + examples: + default: + value: + data: + - attributes: + created_at: "2024-01-01T00:00:00Z" + definition: {} + description: Manage your AWS services from Datadog. + integration_id: aws + name: AWS Service Manager + slug: aws-service-manager + updated_at: "2024-01-01T00:00:00Z" + id: 65bb1f25-52e1-4510-9f8d-22d1516ed693 + type: blueprint + schema: + $ref: "#/components/schemas/GetBlueprintsResponse" + description: OK + "403": + content: + application/json: + schema: + $ref: "#/components/schemas/JSONAPIErrorResponse" + description: Forbidden + "429": + $ref: "#/components/responses/TooManyRequestsResponse" + summary: Get Blueprints by Integration ID + tags: + - App Builder + "x-permission": + operator: OR + permissions: + - apps_run + - apps_write + - connections_read + - connections_write + "/api/v2/app-builder/blueprints/slugs/{slugs}": + get: + description: Retrieve app blueprints by their slugs. + operationId: GetBlueprintsBySlugs + parameters: + - description: A comma-separated list of blueprint slugs. + example: aws-service-manager + in: path + name: slugs + required: true + schema: + type: string + responses: + "200": + content: + application/json: + examples: + default: + value: + data: + - attributes: + created_at: "2024-01-01T00:00:00Z" + definition: {} + description: Manage your AWS services from Datadog. + name: AWS Service Manager + slug: aws-service-manager + updated_at: "2024-01-01T00:00:00Z" + id: 65bb1f25-52e1-4510-9f8d-22d1516ed693 + type: blueprint + schema: + $ref: "#/components/schemas/GetBlueprintsResponse" + description: OK + "403": + content: + application/json: + schema: + $ref: "#/components/schemas/JSONAPIErrorResponse" + description: Forbidden + "429": + $ref: "#/components/responses/TooManyRequestsResponse" + summary: Get Blueprints by Slugs + tags: + - App Builder + "x-permission": + operator: OR + permissions: + - apps_run + - apps_write + - connections_read + - connections_write + /api/v2/app-builder/tags: + get: + description: List all tags associated with the authenticated user's apps. + operationId: ListTags + responses: + "200": + content: + application/json: + examples: + default: + value: + data: + - id: production + type: tag + schema: + $ref: "#/components/schemas/AppBuilderListTagsResponse" + description: OK + "403": + content: + application/json: + schema: + $ref: "#/components/schemas/JSONAPIErrorResponse" + description: Forbidden + "429": + $ref: "#/components/responses/TooManyRequestsResponse" + summary: List Tags + tags: + - App Builder + "x-permission": + operator: OR + permissions: + - apps_run /api/v2/application_keys: get: description: List all application keys available for your org diff --git a/cassettes/v2/App-Builder_216136899/Get-Blueprint-returns-Not-Found-response_2983025375/frozen.json b/cassettes/v2/App-Builder_216136899/Get-Blueprint-returns-Not-Found-response_2983025375/frozen.json new file mode 100644 index 000000000000..545e0de23b83 --- /dev/null +++ b/cassettes/v2/App-Builder_216136899/Get-Blueprint-returns-Not-Found-response_2983025375/frozen.json @@ -0,0 +1 @@ +"2026-05-18T17:39:16.852Z" diff --git a/cassettes/v2/App-Builder_216136899/Get-Blueprint-returns-Not-Found-response_2983025375/recording.har b/cassettes/v2/App-Builder_216136899/Get-Blueprint-returns-Not-Found-response_2983025375/recording.har new file mode 100644 index 000000000000..150bdaf918c6 --- /dev/null +++ b/cassettes/v2/App-Builder_216136899/Get-Blueprint-returns-Not-Found-response_2983025375/recording.har @@ -0,0 +1,57 @@ +{ + "log": { + "_recordingName": "App Builder/Get Blueprint returns \"Not Found\" response", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.5" + }, + "entries": [ + { + "_id": "79b82b76e0bbb6c3c16ffc7ead4f10b4", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "_fromType": "array", + "name": "accept", + "value": "application/json" + } + ], + "headersSize": 551, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://api.datadoghq.com/api/v2/app-builder/blueprint/00000000-0000-0000-0000-000000000001" + }, + "response": { + "bodySize": 179, + "content": { + "mimeType": "application/vnd.api+json", + "size": 179, + "text": "{\"errors\":[{\"status\":\"404\",\"id\":\"75010b80-a44e-47bd-b903-e38f79efce20\",\"title\":\"blueprint not found\",\"detail\":\"blueprint with id 00000000-0000-0000-0000-000000000001 not found\"}]}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/vnd.api+json" + } + ], + "headersSize": 656, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 404, + "statusText": "Not Found" + }, + "startedDateTime": "2026-05-18T17:39:16.854Z", + "time": 692 + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/cassettes/v2/App-Builder_216136899/Get-Blueprints-by-Integration-ID-returns-OK-response_1358691727/frozen.json b/cassettes/v2/App-Builder_216136899/Get-Blueprints-by-Integration-ID-returns-OK-response_1358691727/frozen.json new file mode 100644 index 000000000000..b87a0f084ce4 --- /dev/null +++ b/cassettes/v2/App-Builder_216136899/Get-Blueprints-by-Integration-ID-returns-OK-response_1358691727/frozen.json @@ -0,0 +1 @@ +"2026-05-18T17:39:17.553Z" diff --git a/cassettes/v2/App-Builder_216136899/Get-Blueprints-by-Integration-ID-returns-OK-response_1358691727/recording.har b/cassettes/v2/App-Builder_216136899/Get-Blueprints-by-Integration-ID-returns-OK-response_1358691727/recording.har new file mode 100644 index 000000000000..eb1b4fadebe8 --- /dev/null +++ b/cassettes/v2/App-Builder_216136899/Get-Blueprints-by-Integration-ID-returns-OK-response_1358691727/recording.har @@ -0,0 +1,57 @@ +{ + "log": { + "_recordingName": "App Builder/Get Blueprints by Integration ID returns \"OK\" response", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.5" + }, + "entries": [ + { + "_id": "9e893e8506a54acb5d626f03f22f79a9", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "_fromType": "array", + "name": "accept", + "value": "application/json" + } + ], + "headersSize": 550, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://api.datadoghq.com/api/v2/app-builder/blueprints/integration-id/aws" + }, + "response": { + "bodySize": 11, + "content": { + "mimeType": "application/vnd.api+json", + "size": 11, + "text": "{\"data\":[]}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/vnd.api+json" + } + ], + "headersSize": 655, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-05-18T17:39:17.556Z", + "time": 514 + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/cassettes/v2/App-Builder_216136899/Get-Blueprints-by-Slugs-returns-OK-response_1473250004/frozen.json b/cassettes/v2/App-Builder_216136899/Get-Blueprints-by-Slugs-returns-OK-response_1473250004/frozen.json new file mode 100644 index 000000000000..6e8683f6fade --- /dev/null +++ b/cassettes/v2/App-Builder_216136899/Get-Blueprints-by-Slugs-returns-OK-response_1473250004/frozen.json @@ -0,0 +1 @@ +"2026-05-18T17:39:18.076Z" diff --git a/cassettes/v2/App-Builder_216136899/Get-Blueprints-by-Slugs-returns-OK-response_1473250004/recording.har b/cassettes/v2/App-Builder_216136899/Get-Blueprints-by-Slugs-returns-OK-response_1473250004/recording.har new file mode 100644 index 000000000000..34059dcee028 --- /dev/null +++ b/cassettes/v2/App-Builder_216136899/Get-Blueprints-by-Slugs-returns-OK-response_1473250004/recording.har @@ -0,0 +1,57 @@ +{ + "log": { + "_recordingName": "App Builder/Get Blueprints by Slugs returns \"OK\" response", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.5" + }, + "entries": [ + { + "_id": "d58db21a252d04e00047c9427f7ef348", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "_fromType": "array", + "name": "accept", + "value": "application/json" + } + ], + "headersSize": 549, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://api.datadoghq.com/api/v2/app-builder/blueprints/slugs/aws-service-manager" + }, + "response": { + "bodySize": 11, + "content": { + "mimeType": "application/vnd.api+json", + "size": 11, + "text": "{\"data\":[]}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/vnd.api+json" + } + ], + "headersSize": 655, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-05-18T17:39:18.079Z", + "time": 692 + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/cassettes/v2/App-Builder_216136899/List-Blueprints-returns-OK-response_195803873/frozen.json b/cassettes/v2/App-Builder_216136899/List-Blueprints-returns-OK-response_195803873/frozen.json new file mode 100644 index 000000000000..181df53307a5 --- /dev/null +++ b/cassettes/v2/App-Builder_216136899/List-Blueprints-returns-OK-response_195803873/frozen.json @@ -0,0 +1 @@ +"2026-05-18T17:39:19.135Z" diff --git a/cassettes/v2/App-Builder_216136899/List-Blueprints-returns-OK-response_195803873/recording.har b/cassettes/v2/App-Builder_216136899/List-Blueprints-returns-OK-response_195803873/recording.har new file mode 100644 index 000000000000..3b8e4a3ad0e7 --- /dev/null +++ b/cassettes/v2/App-Builder_216136899/List-Blueprints-returns-OK-response_195803873/recording.har @@ -0,0 +1,57 @@ +{ + "log": { + "_recordingName": "App Builder/List Blueprints returns \"OK\" response", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.5" + }, + "entries": [ + { + "_id": "8133af3297f864d1f7bbb95ff80b76f8", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "_fromType": "array", + "name": "accept", + "value": "application/json" + } + ], + "headersSize": 517, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://api.datadoghq.com/api/v2/app-builder/blueprints" + }, + "response": { + "bodySize": 23529, + "content": { + "mimeType": "application/vnd.api+json", + "size": 23529, + "text": "{\"data\":[{\"id\":\"faeef8bc-d9eb-43a1-b829-71782380279d\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-08-18T16:20:42.182618Z\",\"description\":\"Manage AWS Services from a single unified interface.\",\"name\":\"AWS Service Management Console\",\"slug\":\"aws_service_management_console\",\"tags\":[\"aws\"],\"tile_background\":\"one-callout-table\",\"tile_icon_action_fqn\":\"com.datadoghq.aws.organizations.listAccounts\",\"updated_at\":\"2026-05-18T17:02:03.016145Z\"}},{\"id\":\"b2ba39de-d111-4940-b600-df6bb52661dc\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-08-15T00:00:19.017104Z\",\"description\":\"Manage projects, merge requests, commits, pipelines, jobs, branches, and deployments all from a unified interface within Datadog.\",\"name\":\"GitLab Manager\",\"slug\":\"gitlab_manager\",\"tags\":[\"software_delivery\"],\"tile_background\":\"search-callout-table\",\"tile_icon_action_fqn\":\"com.datadoghq.gitlab.projects.listProjects\",\"updated_at\":\"2026-05-18T17:01:20.81581Z\"}},{\"id\":\"398529ec-6c34-4e6d-bccf-5a34be7e6e1c\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-10-15T19:11:36.098607Z\",\"description\":\"Unifying Jira, Confluence, GitHub, and Datadog Incidents to highlight team and developer contribution with AI summaries.\",\"name\":\"Development Insights\",\"slug\":\"development-insights\",\"tags\":[\"datadog\",\"uses_ai\"],\"tile_background\":\"search-callout-table\",\"tile_icon_action_fqn\":\"com.datadoghq.dd.apps_datastore.getDatastoreItem\",\"updated_at\":\"2026-05-18T17:02:03.557012Z\"}},{\"id\":\"1a9239ca-1d11-48c0-ad23-0f8ca00cd321\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-10-08T17:07:54.77105Z\",\"description\":\"Unified device visibility. Smarter investigations\",\"name\":\"Asset Investigation App\",\"slug\":\"asset-intel-app\",\"tags\":[\"datadog\",\"uses_ai\"],\"tile_background\":\"one-callout-table\",\"tile_icon_action_fqn\":\"com.datadoghq.dd.apps_datastore.listDatastoreItems\",\"updated_at\":\"2026-05-18T17:02:03.371529Z\"}},{\"id\":\"d190e5cd-412c-4857-9993-6e98a478a64e\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-06-30T18:02:02.519433Z\",\"description\":\"Manage Okta users, groups, and roles directly from Datadog in a secure, unified interface.\",\"name\":\"Manage Okta Users, Groups, and Roles\",\"slug\":\"manage-okta-user-groups-roles\",\"tags\":[\"security\"],\"tile_background\":\"one-callout-table\",\"tile_icon_action_fqn\":\"com.datadoghq.okta.add_user_to_group\",\"updated_at\":\"2026-05-18T17:02:15.156458Z\"}},{\"id\":\"11feb11b-85d9-4e89-9f5c-0c96c04da5bc\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-06-30T18:02:02.176559Z\",\"description\":\"Scaffolder app can be used for creating new software components from template repositories. It takes inputs from developers and generates a new repository or a PR based on the provided data and the template.\",\"name\":\"Scaffold New Project in GitHub\",\"slug\":\"scaffold-new-project-in-github\",\"tags\":[\"software_delivery\"],\"tile_background\":\"table-with-modal\",\"tile_icon_action_fqn\":\"com.datadoghq.github.searchRepositories\",\"updated_at\":\"2026-05-18T17:02:09.340524Z\"}},{\"id\":\"6c5b24ef-c303-42ec-a305-351f5a1026cf\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-05-02T20:27:43.381741Z\",\"description\":\"Monitor Kubernetes resources, restart deployments, delete pods, and create tickets or incidents\",\"name\":\"Manage Kubernetes Deployments\",\"slug\":\"manage-kubernetes-deployments\",\"tags\":[\"kubernetes\",\"private_action\"],\"tile_background\":\"table\",\"tile_icon_action_fqn\":\"com.datadoghq.kubernetes.apps.listDeployment\",\"updated_at\":\"2026-05-18T17:01:26.003985Z\"}},{\"id\":\"dd0adb73-dd5f-4cb5-a22d-41946755958e\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-04-29T18:37:39.261927Z\",\"description\":\"Stop RDS clusters \\u0026 instances and reduce your cost\",\"name\":\"Manage RDS Clusters \\u0026 Instances\",\"slug\":\"rds_console\",\"tags\":[\"aws\"],\"tile_background\":\"table\",\"tile_icon_action_fqn\":\"com.datadoghq.aws.rds.list_db_instances\",\"updated_at\":\"2026-05-18T17:02:04.353815Z\"}},{\"id\":\"8750a7cb-f076-474f-9f66-8d3f7c02ad3f\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-04-08T15:16:02.674864Z\",\"description\":\"Analyze your metrics in Datadog and create threshold alert monitors\",\"name\":\"Explore Metrics \\u0026 Create Monitors\",\"slug\":\"datadog_metrics_and_monitors\",\"tags\":[\"datadog\"],\"tile_background\":\"bento-box-table\",\"tile_icon_action_fqn\":\"com.datadoghq.dd.metrics.listMetrics\",\"updated_at\":\"2026-05-18T17:02:03.452603Z\"}},{\"id\":\"17127e2b-ea85-4c3a-ba3e-0f1dfa0c941a\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-04-30T21:11:28.731422Z\",\"description\":\"Fill out the form to generate the terraform for a new S3 bucket in Github\",\"name\":\"Create S3 Bucket with a Terraform PR\",\"slug\":\"create-new-s3-bucket-terraform-pr\",\"tags\":[\"software_delivery\"],\"tile_background\":\"table-with-modal\",\"tile_icon_action_fqn\":\"com.datadoghq.github.searchRepositories\",\"updated_at\":\"2026-05-18T17:02:09.266218Z\"}},{\"id\":\"dc4075af-5e50-402f-abb2-6041db59d378\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-04-30T21:11:28.759103Z\",\"description\":\"View open pull requests from your team in a table with an AI-generated summary of the progress.\",\"name\":\"GitHub PR Summarizer\",\"slug\":\"github-pr-summarizer\",\"tags\":[\"uses_ai\"],\"tile_background\":\"table\",\"tile_icon_action_fqn\":\"com.datadoghq.github.searchRepositories\",\"updated_at\":\"2026-05-18T17:02:09.306954Z\"}},{\"id\":\"dc1bcad2-1eb7-456f-a32b-60e8ad7adf71\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-04-28T21:17:42.010916Z\",\"description\":\"Start, stop or reboot your AWS EC2 instances\",\"name\":\"Manage EC2 Instances\",\"slug\":\"ec2_instance_manager\",\"tags\":[\"aws\"],\"tile_background\":\"one-callout-table\",\"tile_icon_action_fqn\":\"com.datadoghq.aws.ec2.describe_ec2_instances\",\"updated_at\":\"2026-05-18T17:02:03.602628Z\"}},{\"id\":\"8d6b6284-10ba-42d0-829c-800e7c396a3b\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-04-30T08:38:29.623958Z\",\"description\":\"Peek, purge or redrive SQS queues\",\"name\":\"Manage SQS Queues\",\"slug\":\"sqs-queue-manager\",\"tags\":[\"aws\"],\"tile_background\":\"bento-box-table\",\"tile_icon_action_fqn\":\"com.datadoghq.aws.sqs.list_queues_with_attributes\",\"updated_at\":\"2026-05-18T17:02:02.47498Z\"}},{\"id\":\"be6d5e27-a5a8-406a-9b0c-b779f6a94728\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-05-02T20:27:46.237126Z\",\"description\":\"Create, view, or toggle on or off LaunchDarkly feature flags\",\"name\":\"LaunchDarkly Feature Flag Manager\",\"slug\":\"launchdarkly_feature_flag_manager\",\"tags\":[\"software_delivery\"],\"tile_background\":\"bento-box-table\",\"tile_icon_action_fqn\":\"com.datadoghq.launchdarkly.listProjects\",\"updated_at\":\"2026-05-18T17:01:49.464175Z\"}},{\"id\":\"7566d028-b111-47a8-8ee2-b42efbd95edb\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-05-02T20:27:43.058949Z\",\"description\":\"View, retry, or cancel deployments in Gitlab\",\"name\":\"Manage Gitlab Deployments\",\"slug\":\"gitlab-deployment-manager\",\"tags\":[\"software_delivery\"],\"tile_background\":\"table\",\"tile_icon_action_fqn\":\"com.datadoghq.gitlab.getProjectDeployments\",\"updated_at\":\"2026-05-18T17:01:20.761242Z\"}},{\"id\":\"dddf3b1a-47a4-400a-8485-321ad58f2779\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-04-30T08:38:30.229357Z\",\"description\":\"Create, view, and manage incidents in ServiceNow\",\"name\":\"Manage ServiceNow Incidents\",\"slug\":\"servicenow_incident_manager\",\"tags\":[\"paging\"],\"tile_background\":\"table\",\"tile_icon_action_fqn\":\"com.datadoghq.servicenow.listIncidents\",\"updated_at\":\"2026-05-18T17:02:17.797196Z\"}},{\"id\":\"df97f5ff-0ce8-4def-b1fb-151b427fc82d\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-04-09T16:50:07.302357Z\",\"description\":\"Personalized developer homepage to prioritize tasks across tools\",\"name\":\"Developer Homepage\",\"slug\":\"developer-homepage\",\"tags\":[\"datadog\",\"uses_ai\"],\"tile_background\":\"one-callout-table\",\"tile_icon_action_fqn\":\"com.datadoghq.dd.service_catalog.getServicePagerdutyOncall\",\"updated_at\":\"2026-05-18T17:02:03.484343Z\"}},{\"id\":\"f290ac0f-ded8-4143-bb94-3dbe20f883d5\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-05-05T19:50:19.410003Z\",\"description\":\"Explore mobile user sessions, using Luciq's observability tools\",\"name\":\"Explore Luciq Sessions\",\"slug\":\"instabug-sessions-explorer\",\"tags\":[\"observability\"],\"tile_background\":\"table\",\"tile_icon_action_fqn\":\"com.datadoghq.http.request\",\"updated_at\":\"2026-05-18T17:01:48.606352Z\"}},{\"id\":\"a7041749-fb41-451b-880f-10eddcdbbe1c\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-05-02T20:27:48.306432Z\",\"description\":\"View incidents across pages, update them, follow past updates, and create new incidents on Statuspage \u2014 all directly from Datadog.\",\"name\":\"Manage Statuspage Incidents\",\"slug\":\"manage-statuspage-incidents\",\"tags\":[\"software_delivery\"],\"tile_background\":\"search-callout-table\",\"tile_icon_action_fqn\":\"com.datadoghq.statuspage.updateComponentStatus\",\"updated_at\":\"2026-05-18T17:02:18.402711Z\"}},{\"id\":\"8839570e-1711-43e8-86f2-679f5ae0f8f9\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-04-30T21:11:28.769943Z\",\"description\":\"Complete the form to provision a new EKS Cluster using Terraform\",\"name\":\"Provision EKS Cluster\",\"slug\":\"provision-eks-cluster\",\"tags\":[\"software_delivery\"],\"tile_background\":\"table-with-modal\",\"tile_icon_action_fqn\":\"com.datadoghq.github.createOrUpdateFile\",\"updated_at\":\"2026-05-18T17:02:09.329157Z\"}},{\"id\":\"7f3fb131-0ff5-48d9-a997-87f99ef8b364\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-04-30T21:11:28.764126Z\",\"description\":\"Select a service and trigger a restart in Github Workflows\",\"name\":\"Restart Service With Github Actions\",\"slug\":\"github_actions_restart_service\",\"tags\":[\"software_delivery\"],\"tile_background\":\"table\",\"tile_icon_action_fqn\":\"com.datadoghq.github.actions.triggerWorkflowRun\",\"updated_at\":\"2026-05-18T17:02:09.318622Z\"}},{\"id\":\"39ff9db2-aeed-4552-8080-d6a13fbfad74\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-04-29T18:37:39.278756Z\",\"description\":\"Create a new RDS DB instance from a form\",\"name\":\"Provision RDS Instance\",\"slug\":\"rds_provision_instance\",\"tags\":[\"aws\"],\"tile_background\":\"table\",\"tile_icon_action_fqn\":\"com.datadoghq.aws.rds.createRdsDbInstance\",\"updated_at\":\"2026-05-18T17:02:04.37742Z\"}},{\"id\":\"0b110831-0834-4898-84dc-292153807df1\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-04-29T18:37:39.21136Z\",\"description\":\"View and manage Jira tickets by board, status, or sprint\",\"name\":\"Manage Jira Tickets\",\"slug\":\"jira-ticket-manager\",\"tags\":[\"software_delivery\"],\"tile_background\":\"table\",\"tile_icon_action_fqn\":\"com.datadoghq.jira.create_issue\",\"updated_at\":\"2026-05-18T17:02:04.247226Z\"}},{\"id\":\"111cc4d5-1fdf-47aa-8bb1-25cc8ac7dff2\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-04-29T18:37:39.286928Z\",\"description\":\"Explore S3 files and view their content\",\"name\":\"Explore S3 Files\",\"slug\":\"s3_file_explorer\",\"tags\":[\"aws\"],\"tile_background\":\"bento-box-table\",\"tile_icon_action_fqn\":\"com.datadoghq.aws.s3.list_s3_buckets\",\"updated_at\":\"2026-05-18T17:02:02.170177Z\"}},{\"id\":\"773fce74-eec7-4170-a222-53e24261f812\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-04-29T18:37:39.307523Z\",\"description\":\"Fill out the form to generate the terraform for new monitors for a service.\",\"name\":\"Create Monitors for New Service\",\"slug\":\"service-monitor-creation\",\"tags\":[\"datadog\"],\"tile_background\":\"table-with-modal\",\"tile_icon_action_fqn\":\"com.datadoghq.dd.service_catalog.listServiceDefinitions\",\"updated_at\":\"2026-05-18T17:02:04.388154Z\"}},{\"id\":\"b899cebf-0b56-4e6e-89c8-01afdb19e781\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-04-30T21:11:28.742329Z\",\"description\":\"View opened, closed, and assigned pull requests to a specific user\",\"name\":\"Github PR Pipeline\",\"slug\":\"github-pr-dashboard\",\"tags\":[\"software_delivery\"],\"tile_background\":\"two-input-table\",\"tile_icon_action_fqn\":\"com.datadoghq.github.searchRepositories\",\"updated_at\":\"2026-05-18T17:02:09.287376Z\"}},{\"id\":\"635fc8c5-0330-40e6-a859-b8fc3d76e331\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-05-02T20:27:46.466284Z\",\"description\":\"Monitor the status of PagerDuty services and trigger incidents when needed\",\"name\":\"Manage PagerDuty Services\",\"slug\":\"pagerduty_service_manager\",\"tags\":[\"paging\"],\"tile_background\":\"table\",\"tile_icon_action_fqn\":\"com.datadoghq.pagerduty.listServices\",\"updated_at\":\"2026-05-18T17:02:15.911013Z\"}},{\"id\":\"8ada5164-b533-462e-80db-47e7d0fbed0d\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-04-28T21:17:42.02843Z\",\"description\":\"Select from your clusters and services, and easily scale tasks up or down\",\"name\":\"Manage ECS Tasks\",\"slug\":\"ecs_task_manager\",\"tags\":[\"aws\"],\"tile_background\":\"three-callout-prompt\",\"tile_icon_action_fqn\":\"com.datadoghq.aws.ecs.listEcsClusters\",\"updated_at\":\"2026-05-18T17:02:00.300159Z\"}},{\"id\":\"e2f2ff93-709c-4eae-95ab-cbc0f2bc87f0\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-06-23T19:08:48.624684Z\",\"description\":\"List, explore details and re-run lambda functions\",\"name\":\"Manage Lambda Functions\",\"slug\":\"lambda-function-manager\",\"tags\":[\"aws\"],\"tile_background\":\"table-with-modal\",\"tile_icon_action_fqn\":\"com.datadoghq.aws.lambda.listAWSLambdaFunction\",\"updated_at\":\"2026-05-18T17:02:01.047167Z\"}},{\"id\":\"07f8536d-6342-4f30-8254-0c7b019707f0\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-04-30T08:38:30.332498Z\",\"description\":\"Manage and update Statuspage components across pages.\",\"name\":\"Manage Statuspage Components\",\"slug\":\"statuspage-component-manager\",\"tags\":[\"software_delivery\"],\"tile_background\":\"one-callout-table\",\"tile_icon_action_fqn\":\"com.datadoghq.statuspage.listIncidents\",\"updated_at\":\"2026-05-18T17:02:18.425899Z\"}},{\"id\":\"53d32e20-034c-4d46-ad54-f71f83ae7850\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-05-02T20:27:47.563531Z\",\"description\":\"Manage, update or delete your AWS EKS clusters\",\"name\":\"Manage AWS EKS\",\"slug\":\"manage-aws-eks\",\"tags\":[\"aws\"],\"tile_background\":\"one-callout-table\",\"tile_icon_action_fqn\":\"com.datadoghq.aws.eks.updateClusterConfig\",\"updated_at\":\"2026-05-18T17:02:04.264646Z\"}},{\"id\":\"8b8aa818-4ed3-40f5-b6ca-dd891c75f317\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-05-02T20:27:46.449263Z\",\"description\":\"Trigger, acknowledge and resolve incidents from PagerDuty.\",\"name\":\"Manage PagerDuty Incidents\",\"slug\":\"pagerduty_incident_manager\",\"tags\":[\"paging\"],\"tile_background\":\"one-callout-table\",\"tile_icon_action_fqn\":\"com.datadoghq.pagerduty.resolve_incident\",\"updated_at\":\"2026-05-18T17:02:15.703635Z\"}},{\"id\":\"d4eac482-3518-412b-8424-31935f6fc1b6\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-04-29T18:37:39.247502Z\",\"description\":\"Enter a prompt to find the most likely causes of your regression\",\"name\":\"Find PR Regressions\",\"slug\":\"pr_regression_finder\",\"tags\":[\"uses_ai\"],\"tile_background\":\"search-callout-table\",\"tile_icon_action_fqn\":\"com.datadoghq.openai.generateText\",\"updated_at\":\"2026-05-18T17:02:04.329232Z\"}},{\"id\":\"5a617cdf-6d0c-4fc5-a26f-e123e37e1438\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-05-02T20:27:47.572068Z\",\"description\":\"List a Datastore in your app and manage its CRUD (Create, Read, Update, Delete) operations directly from App Builder.\",\"name\":\"Manage Datastore\",\"slug\":\"manage-datastore\",\"tags\":[\"datadog\"],\"tile_background\":\"search-callout-table\",\"tile_icon_action_fqn\":\"com.datadoghq.dd.apps_datastore.bulkPutDatastoreItem\",\"updated_at\":\"2026-05-18T17:02:04.277122Z\"}},{\"id\":\"8caf15ac-f175-4b46-b867-dfbd73f5d1ba\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-04-29T18:37:39.237759Z\",\"description\":\"Track on-call engineers across different teams and services, and create incidents in OpsGenie\",\"name\":\"Manage OpsGenie On-call\",\"slug\":\"manage-ops-genie-on-call\",\"tags\":[\"paging\"],\"tile_background\":\"one-callout-table\",\"tile_icon_action_fqn\":\"com.datadoghq.opsgenie.createIncident\",\"updated_at\":\"2026-05-18T17:02:04.302057Z\"}},{\"id\":\"88a2c35b-31f4-4420-b6a0-f3da6a1fd740\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-04-14T02:00:39.687547Z\",\"description\":\"Create new S3 buckets directly in AWS.\",\"name\":\"Create S3 Bucket\",\"slug\":\"create-new-s3-bucket\",\"tags\":[\"aws\"],\"tile_background\":\"table\",\"tile_icon_action_fqn\":\"com.datadoghq.aws.s3.create_s3_bucket\",\"updated_at\":\"2026-05-18T17:02:02.159767Z\"}},{\"id\":\"eef5812e-45ef-47a4-9570-4c6b7a11bc4f\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-05-02T20:27:43.692089Z\",\"description\":\"Prompt OpenAI and get responses from a text inputs\",\"name\":\"Prompt OpenAI\",\"slug\":\"openai-prompter\",\"tags\":[\"uses_ai\"],\"tile_background\":\"table\",\"tile_icon_action_fqn\":\"com.datadoghq.openai.generateText\",\"updated_at\":\"2026-05-18T17:01:29.850296Z\"}},{\"id\":\"f333c674-1010-4bf6-9b7b-215f6c88f878\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-05-02T20:27:46.458292Z\",\"description\":\"Track on-call engineers across different teams and services\",\"name\":\"Manage PagerDuty On-call\",\"slug\":\"pagerduty_oncall_manager\",\"tags\":[\"paging\"],\"tile_background\":\"people-modal\",\"tile_icon_action_fqn\":\"com.datadoghq.pagerduty.listServices\",\"updated_at\":\"2026-05-18T17:02:15.724318Z\"}},{\"id\":\"5761abf4-771d-42e6-9898-5eae6465e94c\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-04-29T18:37:39.317021Z\",\"description\":\"Manage, start, restart, and stop your Azure Web Apps\",\"name\":\"Manage Azure Web Apps\",\"slug\":\"manage-azure-web-apps\",\"tags\":[\"azure\"],\"tile_background\":\"one-callout-table\",\"tile_icon_action_fqn\":\"com.datadoghq.azure.apps.restartWebApp\",\"updated_at\":\"2026-05-18T17:02:04.40436Z\"}},{\"id\":\"858a49c0-7781-46ef-b4e0-7fc7c96a311b\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-06-23T19:08:48.677682Z\",\"description\":\"View state machines and stop, start or pause their associated executions\",\"name\":\"Manage Step Functions\",\"slug\":\"step-functions-console\",\"tags\":[\"aws\"],\"tile_background\":\"table-with-modal\",\"tile_icon_action_fqn\":\"com.datadoghq.aws.stepfunctions.listStateMachines\",\"updated_at\":\"2026-05-18T17:02:02.699196Z\"}},{\"id\":\"4c19fab0-3269-46e4-a2dd-365ba5bb2619\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-04-28T21:17:42.057615Z\",\"description\":\"List, start, restart, power off and deallocate your VMs\",\"name\":\"Manage Azure Virtual Machines\",\"slug\":\"azure_vms_management_console\",\"tags\":[\"azure\"],\"tile_background\":\"one-callout-table\",\"tile_icon_action_fqn\":\"com.datadoghq.azure.vm.listSubscriptionVirtualMachines\",\"updated_at\":\"2026-05-18T17:02:06.221711Z\"}},{\"id\":\"a276b5f5-c6c0-4329-af64-d630d25593dc\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-04-28T21:17:42.000627Z\",\"description\":\"View DynamoDB table status and perform CRUD operations\",\"name\":\"Manage DynamoDB\",\"slug\":\"dynamodb_console\",\"tags\":[\"aws\"],\"tile_background\":\"bento-box-table\",\"tile_icon_action_fqn\":\"com.datadoghq.aws.dynamodb.describe_table\",\"updated_at\":\"2026-05-18T17:02:00.038636Z\"}},{\"id\":\"cc9872f6-9a15-454e-8f02-beec66ce1bde\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-04-28T21:17:42.039633Z\",\"description\":\"Rebuild or restart Elastic Beanstalk applications\",\"name\":\"Manage Elastic Beanstalk Apps\",\"slug\":\"elastic_beanstalk_console\",\"tags\":[\"aws\"],\"tile_background\":\"search-callout-table\",\"tile_icon_action_fqn\":\"com.datadoghq.aws.elasticbeanstalk.listApplications\",\"updated_at\":\"2026-05-18T17:02:03.613799Z\"}},{\"id\":\"84c7ba6f-d69b-4e7c-aa0b-56ba9022ff50\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-05-05T19:50:21.700674Z\",\"description\":\"List, start or stop your Compute Engine instances\",\"name\":\"Manage Google Cloud Compute\",\"slug\":\"gcp-cloud-compute-management-console\",\"tags\":[\"gcp\"],\"tile_background\":\"one-callout-table\",\"tile_icon_action_fqn\":\"com.datadoghq.gcp.compute.listInstances\",\"updated_at\":\"2026-05-18T17:02:11.166133Z\"}},{\"id\":\"e426403a-5d30-49d2-abed-d2372e8c7744\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-05-02T20:27:46.472898Z\",\"description\":\"Select a service \\u0026 trigger an incident\",\"name\":\"Trigger Incident in Pagerduty\",\"slug\":\"pagerduty_trigger_incident\",\"tags\":[\"paging\",\"datadog\"],\"tile_background\":\"table\",\"tile_icon_action_fqn\":\"com.datadoghq.pagerduty.trigger_incident\",\"updated_at\":\"2026-05-18T17:02:15.92158Z\"}},{\"id\":\"e6b74e1f-7f36-49b4-abfe-7c9ebf067ff2\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-04-08T20:09:58.363312Z\",\"description\":\"View autoscaling group capacity and trigger a change\",\"name\":\"Manage AWS Autoscaling Groups\",\"slug\":\"aws_autoscaling_groups\",\"tags\":[\"aws\"],\"tile_background\":\"three-callout-prompt\",\"tile_icon_action_fqn\":\"com.datadoghq.aws.autoscaling.describe_auto_scaling_group\",\"updated_at\":\"2026-05-18T17:02:03.420659Z\"}},{\"id\":\"9913dec9-e949-45e6-908a-587ffb823a0c\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-05-02T20:27:47.592154Z\",\"description\":\"Renew, describe, delete and request private and public certificates\",\"name\":\"Manage AWS Certificates\",\"slug\":\"manage-aws-certificates\",\"tags\":[\"aws\"],\"tile_background\":\"one-callout-table\",\"tile_icon_action_fqn\":\"com.datadoghq.aws.acm.requestPublicCertificate\",\"updated_at\":\"2026-05-18T17:02:04.316282Z\"}},{\"id\":\"d837c301-edcd-48fb-8250-a4e9fb9add11\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-04-29T18:37:39.200777Z\",\"description\":\"Create new tickets in Jira\",\"name\":\"Create Jira Ticket\",\"slug\":\"jira-ticket-creator\",\"tags\":[\"software_delivery\"],\"tile_background\":\"table\",\"tile_icon_action_fqn\":\"com.datadoghq.jira.create_issue\",\"updated_at\":\"2026-05-18T17:02:04.229225Z\"}},{\"id\":\"25bc3ad1-724c-4750-9bc2-112a59e76b6a\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-08-22T01:16:30.733428Z\",\"description\":\"Use this form to create a new entity definition YAML in Github.\",\"name\":\"Create Catalog Entity Definition\",\"slug\":\"create_catalog_entity_definition\",\"tags\":[\"datadog\",\"software_delivery\"],\"tile_background\":\"people-modal\",\"tile_icon_action_fqn\":\"com.datadoghq.github.createOrUpdateFile\",\"updated_at\":\"2026-05-18T17:02:03.431113Z\"}},{\"id\":\"7d2e21d5-1e1f-4abc-aebb-880ef86882f5\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-07-21T00:43:24.42963Z\",\"description\":\"How to add bar charts to apps\",\"name\":\"How To: Bar Charts\",\"slug\":\"how_to__bar_charts\",\"tags\":[\"datadog\",\"howTo\"],\"tile_background\":\"table\",\"tile_icon_action_fqn\":\"com.datadoghq.dd.teams.listTeams\",\"updated_at\":\"2026-05-18T17:02:03.801347Z\"}},{\"id\":\"6bf5671b-3195-4ea5-b3fe-eba97d25b26a\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-07-02T16:43:02.148346Z\",\"description\":\"Scaffolder app is used to create new software components from template repositories. It takes inputs from developers and generates a new repository or a PR based on the provided data and the template.\",\"name\":\"Scaffold New Project in GitLab\",\"slug\":\"scaffold-new-project-in-gitlab\",\"tags\":[\"software_delivery\"],\"tile_background\":\"table-with-modal\",\"tile_icon_action_fqn\":\"com.datadoghq.gitlab.getProjectDeployments\",\"updated_at\":\"2026-05-18T17:01:20.860684Z\"}},{\"id\":\"f5998cda-c054-48d9-9e88-ae37ab1990cb\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-07-18T16:51:32.667124Z\",\"description\":\"See how to make form fields dynamic and dependent on other fields.\",\"name\":\"How to: Form With Dynamic Fields\",\"slug\":\"how_to__form_with_dynamic_fields\",\"tags\":[\"howTo\"],\"tile_background\":\"people-modal\",\"tile_icon_action_fqn\":\"com.datadoghq.github.createOrUpdateFile\",\"updated_at\":\"2026-05-18T17:02:03.923635Z\"}},{\"id\":\"6e27f913-7170-4977-b2b1-243015b9fafd\",\"type\":\"blueprint\",\"attributes\":{\"created_at\":\"2025-07-17T23:29:17.423877Z\",\"description\":\"How to persist your app in a datastore using CRUD (Create, Read, Update, Delete) operations\",\"name\":\"How To: Persist Data in Datastore\",\"slug\":\"how_to__persist_data_in_datastore_using_crud\",\"tags\":[\"datadog\",\"howTo\"],\"tile_background\":\"search-callout-table\",\"tile_icon_action_fqn\":\"com.datadoghq.dd.apps_datastore.listDatastoreItems\",\"updated_at\":\"2026-05-18T17:02:04.018585Z\"}}]}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/vnd.api+json" + } + ], + "headersSize": 663, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-05-18T17:39:19.138Z", + "time": 522 + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/cassettes/v2/App-Builder_216136899/List-Tags-returns-OK-response_704072488/frozen.json b/cassettes/v2/App-Builder_216136899/List-Tags-returns-OK-response_704072488/frozen.json new file mode 100644 index 000000000000..b0795a98438c --- /dev/null +++ b/cassettes/v2/App-Builder_216136899/List-Tags-returns-OK-response_704072488/frozen.json @@ -0,0 +1 @@ +"2026-05-18T17:39:19.668Z" diff --git a/cassettes/v2/App-Builder_216136899/List-Tags-returns-OK-response_704072488/recording.har b/cassettes/v2/App-Builder_216136899/List-Tags-returns-OK-response_704072488/recording.har new file mode 100644 index 000000000000..3787a1d9c9c1 --- /dev/null +++ b/cassettes/v2/App-Builder_216136899/List-Tags-returns-OK-response_704072488/recording.har @@ -0,0 +1,57 @@ +{ + "log": { + "_recordingName": "App Builder/List Tags returns \"OK\" response", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.5" + }, + "entries": [ + { + "_id": "90068ede3a13d0eceb7e543b27512f8e", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "_fromType": "array", + "name": "accept", + "value": "application/json" + } + ], + "headersSize": 505, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://api.datadoghq.com/api/v2/app-builder/tags" + }, + "response": { + "bodySize": 11, + "content": { + "mimeType": "application/vnd.api+json", + "size": 11, + "text": "{\"data\":[]}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/vnd.api+json" + } + ], + "headersSize": 655, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-05-18T17:39:19.672Z", + "time": 316 + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/features/v2/app_builder.feature b/features/v2/app_builder.feature index 9f2b3174bc2c..782c77895fb3 100644 --- a/features/v2/app_builder.feature +++ b/features/v2/app_builder.feature @@ -113,7 +113,7 @@ Feature: App Builder When the request is sent Then the response status is 400 Bad Request - @skip-typescript @team:DataDog/app-builder-backend + @skip @team:DataDog/app-builder-backend Scenario: Get App returns "Gone" response Given new "GetApp" request And there is a valid "app" in the system @@ -139,6 +139,34 @@ Feature: App Builder And the response "data.id" has the same value as "app.data.id" And the response "data.type" is equal to "appDefinitions" + @team:DataDog/app-builder-backend + Scenario: Get Blueprint returns "Not Found" response + Given new "GetBlueprint" request + And request contains "blueprint_id" parameter with value "00000000-0000-0000-0000-000000000001" + When the request is sent + Then the response status is 404 Not Found + + @generated @skip @team:DataDog/app-builder-backend + Scenario: Get Blueprint returns "OK" response + Given new "GetBlueprint" request + And request contains "blueprint_id" parameter from "REPLACE.ME" + When the request is sent + Then the response status is 200 OK + + @team:DataDog/app-builder-backend + Scenario: Get Blueprints by Integration ID returns "OK" response + Given new "GetBlueprintsByIntegrationId" request + And request contains "integration_id" parameter with value "aws" + When the request is sent + Then the response status is 200 OK + + @team:DataDog/app-builder-backend + Scenario: Get Blueprints by Slugs returns "OK" response + Given new "GetBlueprintsBySlugs" request + And request contains "slugs" parameter with value "aws-service-manager" + When the request is sent + Then the response status is 200 OK + @skip @team:DataDog/app-builder-backend Scenario: List App Versions returns "Bad Request" response Given new "ListAppVersions" request @@ -173,6 +201,18 @@ Feature: App Builder When the request is sent Then the response status is 200 OK + @team:DataDog/app-builder-backend + Scenario: List Blueprints returns "OK" response + Given new "ListBlueprints" request + When the request is sent + Then the response status is 200 OK + + @team:DataDog/app-builder-backend + Scenario: List Tags returns "OK" response + Given new "ListTags" request + When the request is sent + Then the response status is 200 OK + @skip @team:DataDog/app-builder-backend Scenario: Name App Version returns "Bad Request" response Given new "UpdateAppVersionName" request diff --git a/features/v2/undo.json b/features/v2/undo.json index 02753f1a80a7..a1657c00279e 100644 --- a/features/v2/undo.json +++ b/features/v2/undo.json @@ -687,6 +687,36 @@ "type": "safe" } }, + "GetBlueprint": { + "tag": "App Builder", + "undo": { + "type": "safe" + } + }, + "ListBlueprints": { + "tag": "App Builder", + "undo": { + "type": "safe" + } + }, + "GetBlueprintsByIntegrationId": { + "tag": "App Builder", + "undo": { + "type": "safe" + } + }, + "GetBlueprintsBySlugs": { + "tag": "App Builder", + "undo": { + "type": "safe" + } + }, + "ListTags": { + "tag": "App Builder", + "undo": { + "type": "safe" + } + }, "ListApplicationKeys": { "tag": "Key Management", "undo": { diff --git a/private/bdd_runner/src/support/scenarios_model_mapping.ts b/private/bdd_runner/src/support/scenarios_model_mapping.ts index e5be093fdc5a..ce6a6f7e6688 100644 --- a/private/bdd_runner/src/support/scenarios_model_mapping.ts +++ b/private/bdd_runner/src/support/scenarios_model_mapping.ts @@ -4001,6 +4001,41 @@ export const ScenariosModelMappings: { [key: string]: OperationMapping } = { }, operationResponseType: "ListAppVersionsResponse", }, + "AppBuilderApi.V2.GetBlueprint": { + blueprintId: { + type: "string", + format: "uuid", + }, + operationResponseType: "GetBlueprintResponse", + }, + "AppBuilderApi.V2.ListBlueprints": { + limit: { + type: "number", + format: "int64", + }, + page: { + type: "number", + format: "int64", + }, + operationResponseType: "ListBlueprintsResponse", + }, + "AppBuilderApi.V2.GetBlueprintsByIntegrationId": { + integrationId: { + type: "string", + format: "", + }, + operationResponseType: "GetBlueprintsResponse", + }, + "AppBuilderApi.V2.GetBlueprintsBySlugs": { + slugs: { + type: "string", + format: "", + }, + operationResponseType: "GetBlueprintsResponse", + }, + "AppBuilderApi.V2.ListTags": { + operationResponseType: "AppBuilderListTagsResponse", + }, "AuditApi.V2.ListAuditLogs": { filterQuery: { type: "string", diff --git a/services/app_builder/src/v2/AppBuilderApi.ts b/services/app_builder/src/v2/AppBuilderApi.ts index fb6890510d74..186e3137fd67 100644 --- a/services/app_builder/src/v2/AppBuilderApi.ts +++ b/services/app_builder/src/v2/AppBuilderApi.ts @@ -23,6 +23,7 @@ import { import { TypingInfo } from "./models/TypingInfo"; import { APIErrorResponse } from "./models/APIErrorResponse"; +import { AppBuilderListTagsResponse } from "./models/AppBuilderListTagsResponse"; import { AppsSortField } from "./models/AppsSortField"; import { CreateAppRequest } from "./models/CreateAppRequest"; import { CreateAppResponse } from "./models/CreateAppResponse"; @@ -31,9 +32,12 @@ import { DeleteAppResponse } from "./models/DeleteAppResponse"; import { DeleteAppsRequest } from "./models/DeleteAppsRequest"; import { DeleteAppsResponse } from "./models/DeleteAppsResponse"; import { GetAppResponse } from "./models/GetAppResponse"; +import { GetBlueprintResponse } from "./models/GetBlueprintResponse"; +import { GetBlueprintsResponse } from "./models/GetBlueprintsResponse"; import { JSONAPIErrorResponse } from "./models/JSONAPIErrorResponse"; import { ListAppsResponse } from "./models/ListAppsResponse"; import { ListAppVersionsResponse } from "./models/ListAppVersionsResponse"; +import { ListBlueprintsResponse } from "./models/ListBlueprintsResponse"; import { PublishAppResponse } from "./models/PublishAppResponse"; import { UnpublishAppResponse } from "./models/UnpublishAppResponse"; import { UpdateAppFavoriteRequest } from "./models/UpdateAppFavoriteRequest"; @@ -312,6 +316,139 @@ export class AppBuilderApiRequestFactory extends BaseAPIRequestFactory { return requestContext; } + public async getBlueprint( + blueprintId: string, + _options?: Configuration, + ): Promise { + const _config = _options || this.configuration; + + // verify required parameter 'blueprintId' is not null or undefined + if (blueprintId === null || blueprintId === undefined) { + throw new RequiredError("blueprintId", "getBlueprint"); + } + + // Path Params + const localVarPath = "/api/v2/app-builder/blueprint/{blueprint_id}".replace( + "{blueprint_id}", + encodeURIComponent(String(blueprintId)), + ); + + // Make Request Context + const { server, overrides } = _config.getServerAndOverrides( + "AppBuilderApi.v2.getBlueprint", + AppBuilderApi.operationServers, + ); + const requestContext = server.makeRequestContext( + localVarPath, + HttpMethod.GET, + overrides, + ); + requestContext.setHeaderParam("Accept", "application/json"); + requestContext.setHttpConfig(_config.httpConfig); + + // Set User-Agent + if (this.userAgent) { + requestContext.setHeaderParam("User-Agent", this.userAgent); + } + + // Apply auth methods + applySecurityAuthentication(_config, requestContext, [ + "apiKeyAuth", + "appKeyAuth", + ]); + + return requestContext; + } + + public async getBlueprintsByIntegrationId( + integrationId: string, + _options?: Configuration, + ): Promise { + const _config = _options || this.configuration; + + // verify required parameter 'integrationId' is not null or undefined + if (integrationId === null || integrationId === undefined) { + throw new RequiredError("integrationId", "getBlueprintsByIntegrationId"); + } + + // Path Params + const localVarPath = + "/api/v2/app-builder/blueprints/integration-id/{integration_id}".replace( + "{integration_id}", + encodeURIComponent(String(integrationId)), + ); + + // Make Request Context + const { server, overrides } = _config.getServerAndOverrides( + "AppBuilderApi.v2.getBlueprintsByIntegrationId", + AppBuilderApi.operationServers, + ); + const requestContext = server.makeRequestContext( + localVarPath, + HttpMethod.GET, + overrides, + ); + requestContext.setHeaderParam("Accept", "application/json"); + requestContext.setHttpConfig(_config.httpConfig); + + // Set User-Agent + if (this.userAgent) { + requestContext.setHeaderParam("User-Agent", this.userAgent); + } + + // Apply auth methods + applySecurityAuthentication(_config, requestContext, [ + "apiKeyAuth", + "appKeyAuth", + ]); + + return requestContext; + } + + public async getBlueprintsBySlugs( + slugs: string, + _options?: Configuration, + ): Promise { + const _config = _options || this.configuration; + + // verify required parameter 'slugs' is not null or undefined + if (slugs === null || slugs === undefined) { + throw new RequiredError("slugs", "getBlueprintsBySlugs"); + } + + // Path Params + const localVarPath = "/api/v2/app-builder/blueprints/slugs/{slugs}".replace( + "{slugs}", + encodeURIComponent(String(slugs)), + ); + + // Make Request Context + const { server, overrides } = _config.getServerAndOverrides( + "AppBuilderApi.v2.getBlueprintsBySlugs", + AppBuilderApi.operationServers, + ); + const requestContext = server.makeRequestContext( + localVarPath, + HttpMethod.GET, + overrides, + ); + requestContext.setHeaderParam("Accept", "application/json"); + requestContext.setHttpConfig(_config.httpConfig); + + // Set User-Agent + if (this.userAgent) { + requestContext.setHeaderParam("User-Agent", this.userAgent); + } + + // Apply auth methods + applySecurityAuthentication(_config, requestContext, [ + "apiKeyAuth", + "appKeyAuth", + ]); + + return requestContext; + } + public async listApps( limit?: number, page?: number, @@ -499,6 +636,92 @@ export class AppBuilderApiRequestFactory extends BaseAPIRequestFactory { return requestContext; } + public async listBlueprints( + limit?: number, + page?: number, + _options?: Configuration, + ): Promise { + const _config = _options || this.configuration; + + // Path Params + const localVarPath = "/api/v2/app-builder/blueprints"; + + // Make Request Context + const { server, overrides } = _config.getServerAndOverrides( + "AppBuilderApi.v2.listBlueprints", + AppBuilderApi.operationServers, + ); + const requestContext = server.makeRequestContext( + localVarPath, + HttpMethod.GET, + overrides, + ); + requestContext.setHeaderParam("Accept", "application/json"); + requestContext.setHttpConfig(_config.httpConfig); + + // Set User-Agent + if (this.userAgent) { + requestContext.setHeaderParam("User-Agent", this.userAgent); + } + + // Query Params + if (limit !== undefined) { + requestContext.setQueryParam( + "limit", + serialize(limit, TypingInfo, "number", "int64"), + "", + ); + } + if (page !== undefined) { + requestContext.setQueryParam( + "page", + serialize(page, TypingInfo, "number", "int64"), + "", + ); + } + + // Apply auth methods + applySecurityAuthentication(_config, requestContext, [ + "apiKeyAuth", + "appKeyAuth", + ]); + + return requestContext; + } + + public async listTags(_options?: Configuration): Promise { + const _config = _options || this.configuration; + + // Path Params + const localVarPath = "/api/v2/app-builder/tags"; + + // Make Request Context + const { server, overrides } = _config.getServerAndOverrides( + "AppBuilderApi.v2.listTags", + AppBuilderApi.operationServers, + ); + const requestContext = server.makeRequestContext( + localVarPath, + HttpMethod.GET, + overrides, + ); + requestContext.setHeaderParam("Accept", "application/json"); + requestContext.setHttpConfig(_config.httpConfig); + + // Set User-Agent + if (this.userAgent) { + requestContext.setHeaderParam("User-Agent", this.userAgent); + } + + // Apply auth methods + applySecurityAuthentication(_config, requestContext, [ + "apiKeyAuth", + "appKeyAuth", + ]); + + return requestContext; + } + public async publishApp( appId: string, _options?: Configuration, @@ -995,51 +1218,452 @@ export class AppBuilderApiRequestFactory extends BaseAPIRequestFactory { requestContext.setHeaderParam("Accept", "application/json"); requestContext.setHttpConfig(_config.httpConfig); - // Set User-Agent - if (this.userAgent) { - requestContext.setHeaderParam("User-Agent", this.userAgent); + // Set User-Agent + if (this.userAgent) { + requestContext.setHeaderParam("User-Agent", this.userAgent); + } + + // Body Params + const contentType = getPreferredMediaType(["application/json"]); + requestContext.setHeaderParam("Content-Type", contentType); + const serializedBody = stringify( + serialize(body, TypingInfo, "UpdateAppProtectionLevelRequest", ""), + contentType, + ); + requestContext.setBody(serializedBody); + + // Apply auth methods + applySecurityAuthentication(_config, requestContext, [ + "apiKeyAuth", + "appKeyAuth", + ]); + + return requestContext; + } +} + +export class AppBuilderApiResponseProcessor { + /** + * Unwraps the actual response sent by the server from the response context and deserializes the response content + * to the expected objects + * + * @params response Response returned by the server for a request to createApp + * @throws ApiException if the response code was not in [200, 299] + */ + public async createApp( + response: ResponseContext, + ): Promise { + const contentType = normalizeMediaType(response.headers["content-type"]); + if (response.httpStatusCode === 201) { + const body: CreateAppResponse = deserialize( + parse(await response.body.text(), contentType), + TypingInfo, + "CreateAppResponse", + ) as CreateAppResponse; + return body; + } + if (response.httpStatusCode === 400 || response.httpStatusCode === 403) { + const bodyText = parse(await response.body.text(), contentType); + let body: JSONAPIErrorResponse; + try { + body = deserialize( + bodyText, + TypingInfo, + "JSONAPIErrorResponse", + ) as JSONAPIErrorResponse; + } catch (error) { + logger.debug(`Got error deserializing error: ${error}`); + throw new ApiException( + response.httpStatusCode, + bodyText, + ); + } + throw new ApiException( + response.httpStatusCode, + body, + ); + } + if (response.httpStatusCode === 429) { + const bodyText = parse(await response.body.text(), contentType); + let body: APIErrorResponse; + try { + body = deserialize( + bodyText, + TypingInfo, + "APIErrorResponse", + ) as APIErrorResponse; + } catch (error) { + logger.debug(`Got error deserializing error: ${error}`); + throw new ApiException( + response.httpStatusCode, + bodyText, + ); + } + throw new ApiException(response.httpStatusCode, body); + } + + // Work around for missing responses in specification, e.g. for petstore.yaml + if (response.httpStatusCode >= 200 && response.httpStatusCode <= 299) { + const body: CreateAppResponse = deserialize( + parse(await response.body.text(), contentType), + TypingInfo, + "CreateAppResponse", + "", + ) as CreateAppResponse; + return body; + } + + const body = (await response.body.text()) || ""; + throw new ApiException( + response.httpStatusCode, + 'Unknown API Status Code!\nBody: "' + body + '"', + ); + } + + /** + * Unwraps the actual response sent by the server from the response context and deserializes the response content + * to the expected objects + * + * @params response Response returned by the server for a request to createPublishRequest + * @throws ApiException if the response code was not in [200, 299] + */ + public async createPublishRequest( + response: ResponseContext, + ): Promise { + const contentType = normalizeMediaType(response.headers["content-type"]); + if (response.httpStatusCode === 201) { + const body: PublishAppResponse = deserialize( + parse(await response.body.text(), contentType), + TypingInfo, + "PublishAppResponse", + ) as PublishAppResponse; + return body; + } + if ( + response.httpStatusCode === 400 || + response.httpStatusCode === 403 || + response.httpStatusCode === 404 + ) { + const bodyText = parse(await response.body.text(), contentType); + let body: JSONAPIErrorResponse; + try { + body = deserialize( + bodyText, + TypingInfo, + "JSONAPIErrorResponse", + ) as JSONAPIErrorResponse; + } catch (error) { + logger.debug(`Got error deserializing error: ${error}`); + throw new ApiException( + response.httpStatusCode, + bodyText, + ); + } + throw new ApiException( + response.httpStatusCode, + body, + ); + } + if (response.httpStatusCode === 429) { + const bodyText = parse(await response.body.text(), contentType); + let body: APIErrorResponse; + try { + body = deserialize( + bodyText, + TypingInfo, + "APIErrorResponse", + ) as APIErrorResponse; + } catch (error) { + logger.debug(`Got error deserializing error: ${error}`); + throw new ApiException( + response.httpStatusCode, + bodyText, + ); + } + throw new ApiException(response.httpStatusCode, body); + } + + // Work around for missing responses in specification, e.g. for petstore.yaml + if (response.httpStatusCode >= 200 && response.httpStatusCode <= 299) { + const body: PublishAppResponse = deserialize( + parse(await response.body.text(), contentType), + TypingInfo, + "PublishAppResponse", + "", + ) as PublishAppResponse; + return body; + } + + const body = (await response.body.text()) || ""; + throw new ApiException( + response.httpStatusCode, + 'Unknown API Status Code!\nBody: "' + body + '"', + ); + } + + /** + * Unwraps the actual response sent by the server from the response context and deserializes the response content + * to the expected objects + * + * @params response Response returned by the server for a request to deleteApp + * @throws ApiException if the response code was not in [200, 299] + */ + public async deleteApp( + response: ResponseContext, + ): Promise { + const contentType = normalizeMediaType(response.headers["content-type"]); + if (response.httpStatusCode === 200) { + const body: DeleteAppResponse = deserialize( + parse(await response.body.text(), contentType), + TypingInfo, + "DeleteAppResponse", + ) as DeleteAppResponse; + return body; + } + if ( + response.httpStatusCode === 400 || + response.httpStatusCode === 403 || + response.httpStatusCode === 404 || + response.httpStatusCode === 410 + ) { + const bodyText = parse(await response.body.text(), contentType); + let body: JSONAPIErrorResponse; + try { + body = deserialize( + bodyText, + TypingInfo, + "JSONAPIErrorResponse", + ) as JSONAPIErrorResponse; + } catch (error) { + logger.debug(`Got error deserializing error: ${error}`); + throw new ApiException( + response.httpStatusCode, + bodyText, + ); + } + throw new ApiException( + response.httpStatusCode, + body, + ); + } + if (response.httpStatusCode === 429) { + const bodyText = parse(await response.body.text(), contentType); + let body: APIErrorResponse; + try { + body = deserialize( + bodyText, + TypingInfo, + "APIErrorResponse", + ) as APIErrorResponse; + } catch (error) { + logger.debug(`Got error deserializing error: ${error}`); + throw new ApiException( + response.httpStatusCode, + bodyText, + ); + } + throw new ApiException(response.httpStatusCode, body); + } + + // Work around for missing responses in specification, e.g. for petstore.yaml + if (response.httpStatusCode >= 200 && response.httpStatusCode <= 299) { + const body: DeleteAppResponse = deserialize( + parse(await response.body.text(), contentType), + TypingInfo, + "DeleteAppResponse", + "", + ) as DeleteAppResponse; + return body; + } + + const body = (await response.body.text()) || ""; + throw new ApiException( + response.httpStatusCode, + 'Unknown API Status Code!\nBody: "' + body + '"', + ); + } + + /** + * Unwraps the actual response sent by the server from the response context and deserializes the response content + * to the expected objects + * + * @params response Response returned by the server for a request to deleteApps + * @throws ApiException if the response code was not in [200, 299] + */ + public async deleteApps( + response: ResponseContext, + ): Promise { + const contentType = normalizeMediaType(response.headers["content-type"]); + if (response.httpStatusCode === 200) { + const body: DeleteAppsResponse = deserialize( + parse(await response.body.text(), contentType), + TypingInfo, + "DeleteAppsResponse", + ) as DeleteAppsResponse; + return body; + } + if ( + response.httpStatusCode === 400 || + response.httpStatusCode === 403 || + response.httpStatusCode === 404 + ) { + const bodyText = parse(await response.body.text(), contentType); + let body: JSONAPIErrorResponse; + try { + body = deserialize( + bodyText, + TypingInfo, + "JSONAPIErrorResponse", + ) as JSONAPIErrorResponse; + } catch (error) { + logger.debug(`Got error deserializing error: ${error}`); + throw new ApiException( + response.httpStatusCode, + bodyText, + ); + } + throw new ApiException( + response.httpStatusCode, + body, + ); + } + if (response.httpStatusCode === 429) { + const bodyText = parse(await response.body.text(), contentType); + let body: APIErrorResponse; + try { + body = deserialize( + bodyText, + TypingInfo, + "APIErrorResponse", + ) as APIErrorResponse; + } catch (error) { + logger.debug(`Got error deserializing error: ${error}`); + throw new ApiException( + response.httpStatusCode, + bodyText, + ); + } + throw new ApiException(response.httpStatusCode, body); + } + + // Work around for missing responses in specification, e.g. for petstore.yaml + if (response.httpStatusCode >= 200 && response.httpStatusCode <= 299) { + const body: DeleteAppsResponse = deserialize( + parse(await response.body.text(), contentType), + TypingInfo, + "DeleteAppsResponse", + "", + ) as DeleteAppsResponse; + return body; + } + + const body = (await response.body.text()) || ""; + throw new ApiException( + response.httpStatusCode, + 'Unknown API Status Code!\nBody: "' + body + '"', + ); + } + + /** + * Unwraps the actual response sent by the server from the response context and deserializes the response content + * to the expected objects + * + * @params response Response returned by the server for a request to getApp + * @throws ApiException if the response code was not in [200, 299] + */ + public async getApp(response: ResponseContext): Promise { + const contentType = normalizeMediaType(response.headers["content-type"]); + if (response.httpStatusCode === 200) { + const body: GetAppResponse = deserialize( + parse(await response.body.text(), contentType), + TypingInfo, + "GetAppResponse", + ) as GetAppResponse; + return body; + } + if ( + response.httpStatusCode === 400 || + response.httpStatusCode === 403 || + response.httpStatusCode === 404 || + response.httpStatusCode === 410 + ) { + const bodyText = parse(await response.body.text(), contentType); + let body: JSONAPIErrorResponse; + try { + body = deserialize( + bodyText, + TypingInfo, + "JSONAPIErrorResponse", + ) as JSONAPIErrorResponse; + } catch (error) { + logger.debug(`Got error deserializing error: ${error}`); + throw new ApiException( + response.httpStatusCode, + bodyText, + ); + } + throw new ApiException( + response.httpStatusCode, + body, + ); + } + if (response.httpStatusCode === 429) { + const bodyText = parse(await response.body.text(), contentType); + let body: APIErrorResponse; + try { + body = deserialize( + bodyText, + TypingInfo, + "APIErrorResponse", + ) as APIErrorResponse; + } catch (error) { + logger.debug(`Got error deserializing error: ${error}`); + throw new ApiException( + response.httpStatusCode, + bodyText, + ); + } + throw new ApiException(response.httpStatusCode, body); + } + + // Work around for missing responses in specification, e.g. for petstore.yaml + if (response.httpStatusCode >= 200 && response.httpStatusCode <= 299) { + const body: GetAppResponse = deserialize( + parse(await response.body.text(), contentType), + TypingInfo, + "GetAppResponse", + "", + ) as GetAppResponse; + return body; } - // Body Params - const contentType = getPreferredMediaType(["application/json"]); - requestContext.setHeaderParam("Content-Type", contentType); - const serializedBody = stringify( - serialize(body, TypingInfo, "UpdateAppProtectionLevelRequest", ""), - contentType, + const body = (await response.body.text()) || ""; + throw new ApiException( + response.httpStatusCode, + 'Unknown API Status Code!\nBody: "' + body + '"', ); - requestContext.setBody(serializedBody); - - // Apply auth methods - applySecurityAuthentication(_config, requestContext, [ - "apiKeyAuth", - "appKeyAuth", - ]); - - return requestContext; } -} -export class AppBuilderApiResponseProcessor { /** * Unwraps the actual response sent by the server from the response context and deserializes the response content * to the expected objects * - * @params response Response returned by the server for a request to createApp + * @params response Response returned by the server for a request to getBlueprint * @throws ApiException if the response code was not in [200, 299] */ - public async createApp( + public async getBlueprint( response: ResponseContext, - ): Promise { + ): Promise { const contentType = normalizeMediaType(response.headers["content-type"]); - if (response.httpStatusCode === 201) { - const body: CreateAppResponse = deserialize( + if (response.httpStatusCode === 200) { + const body: GetBlueprintResponse = deserialize( parse(await response.body.text(), contentType), TypingInfo, - "CreateAppResponse", - ) as CreateAppResponse; + "GetBlueprintResponse", + ) as GetBlueprintResponse; return body; } - if (response.httpStatusCode === 400 || response.httpStatusCode === 403) { + if (response.httpStatusCode === 403 || response.httpStatusCode === 404) { const bodyText = parse(await response.body.text(), contentType); let body: JSONAPIErrorResponse; try { @@ -1081,12 +1705,12 @@ export class AppBuilderApiResponseProcessor { // Work around for missing responses in specification, e.g. for petstore.yaml if (response.httpStatusCode >= 200 && response.httpStatusCode <= 299) { - const body: CreateAppResponse = deserialize( + const body: GetBlueprintResponse = deserialize( parse(await response.body.text(), contentType), TypingInfo, - "CreateAppResponse", + "GetBlueprintResponse", "", - ) as CreateAppResponse; + ) as GetBlueprintResponse; return body; } @@ -1101,26 +1725,22 @@ export class AppBuilderApiResponseProcessor { * Unwraps the actual response sent by the server from the response context and deserializes the response content * to the expected objects * - * @params response Response returned by the server for a request to createPublishRequest + * @params response Response returned by the server for a request to getBlueprintsByIntegrationId * @throws ApiException if the response code was not in [200, 299] */ - public async createPublishRequest( + public async getBlueprintsByIntegrationId( response: ResponseContext, - ): Promise { + ): Promise { const contentType = normalizeMediaType(response.headers["content-type"]); - if (response.httpStatusCode === 201) { - const body: PublishAppResponse = deserialize( + if (response.httpStatusCode === 200) { + const body: GetBlueprintsResponse = deserialize( parse(await response.body.text(), contentType), TypingInfo, - "PublishAppResponse", - ) as PublishAppResponse; + "GetBlueprintsResponse", + ) as GetBlueprintsResponse; return body; } - if ( - response.httpStatusCode === 400 || - response.httpStatusCode === 403 || - response.httpStatusCode === 404 - ) { + if (response.httpStatusCode === 403) { const bodyText = parse(await response.body.text(), contentType); let body: JSONAPIErrorResponse; try { @@ -1162,12 +1782,12 @@ export class AppBuilderApiResponseProcessor { // Work around for missing responses in specification, e.g. for petstore.yaml if (response.httpStatusCode >= 200 && response.httpStatusCode <= 299) { - const body: PublishAppResponse = deserialize( + const body: GetBlueprintsResponse = deserialize( parse(await response.body.text(), contentType), TypingInfo, - "PublishAppResponse", + "GetBlueprintsResponse", "", - ) as PublishAppResponse; + ) as GetBlueprintsResponse; return body; } @@ -1182,27 +1802,22 @@ export class AppBuilderApiResponseProcessor { * Unwraps the actual response sent by the server from the response context and deserializes the response content * to the expected objects * - * @params response Response returned by the server for a request to deleteApp + * @params response Response returned by the server for a request to getBlueprintsBySlugs * @throws ApiException if the response code was not in [200, 299] */ - public async deleteApp( + public async getBlueprintsBySlugs( response: ResponseContext, - ): Promise { + ): Promise { const contentType = normalizeMediaType(response.headers["content-type"]); if (response.httpStatusCode === 200) { - const body: DeleteAppResponse = deserialize( + const body: GetBlueprintsResponse = deserialize( parse(await response.body.text(), contentType), TypingInfo, - "DeleteAppResponse", - ) as DeleteAppResponse; + "GetBlueprintsResponse", + ) as GetBlueprintsResponse; return body; } - if ( - response.httpStatusCode === 400 || - response.httpStatusCode === 403 || - response.httpStatusCode === 404 || - response.httpStatusCode === 410 - ) { + if (response.httpStatusCode === 403) { const bodyText = parse(await response.body.text(), contentType); let body: JSONAPIErrorResponse; try { @@ -1244,12 +1859,12 @@ export class AppBuilderApiResponseProcessor { // Work around for missing responses in specification, e.g. for petstore.yaml if (response.httpStatusCode >= 200 && response.httpStatusCode <= 299) { - const body: DeleteAppResponse = deserialize( + const body: GetBlueprintsResponse = deserialize( parse(await response.body.text(), contentType), TypingInfo, - "DeleteAppResponse", + "GetBlueprintsResponse", "", - ) as DeleteAppResponse; + ) as GetBlueprintsResponse; return body; } @@ -1264,26 +1879,20 @@ export class AppBuilderApiResponseProcessor { * Unwraps the actual response sent by the server from the response context and deserializes the response content * to the expected objects * - * @params response Response returned by the server for a request to deleteApps + * @params response Response returned by the server for a request to listApps * @throws ApiException if the response code was not in [200, 299] */ - public async deleteApps( - response: ResponseContext, - ): Promise { + public async listApps(response: ResponseContext): Promise { const contentType = normalizeMediaType(response.headers["content-type"]); if (response.httpStatusCode === 200) { - const body: DeleteAppsResponse = deserialize( + const body: ListAppsResponse = deserialize( parse(await response.body.text(), contentType), TypingInfo, - "DeleteAppsResponse", - ) as DeleteAppsResponse; + "ListAppsResponse", + ) as ListAppsResponse; return body; } - if ( - response.httpStatusCode === 400 || - response.httpStatusCode === 403 || - response.httpStatusCode === 404 - ) { + if (response.httpStatusCode === 400 || response.httpStatusCode === 403) { const bodyText = parse(await response.body.text(), contentType); let body: JSONAPIErrorResponse; try { @@ -1325,12 +1934,12 @@ export class AppBuilderApiResponseProcessor { // Work around for missing responses in specification, e.g. for petstore.yaml if (response.httpStatusCode >= 200 && response.httpStatusCode <= 299) { - const body: DeleteAppsResponse = deserialize( + const body: ListAppsResponse = deserialize( parse(await response.body.text(), contentType), TypingInfo, - "DeleteAppsResponse", + "ListAppsResponse", "", - ) as DeleteAppsResponse; + ) as ListAppsResponse; return body; } @@ -1345,24 +1954,25 @@ export class AppBuilderApiResponseProcessor { * Unwraps the actual response sent by the server from the response context and deserializes the response content * to the expected objects * - * @params response Response returned by the server for a request to getApp + * @params response Response returned by the server for a request to listAppVersions * @throws ApiException if the response code was not in [200, 299] */ - public async getApp(response: ResponseContext): Promise { + public async listAppVersions( + response: ResponseContext, + ): Promise { const contentType = normalizeMediaType(response.headers["content-type"]); if (response.httpStatusCode === 200) { - const body: GetAppResponse = deserialize( + const body: ListAppVersionsResponse = deserialize( parse(await response.body.text(), contentType), TypingInfo, - "GetAppResponse", - ) as GetAppResponse; + "ListAppVersionsResponse", + ) as ListAppVersionsResponse; return body; } if ( response.httpStatusCode === 400 || response.httpStatusCode === 403 || - response.httpStatusCode === 404 || - response.httpStatusCode === 410 + response.httpStatusCode === 404 ) { const bodyText = parse(await response.body.text(), contentType); let body: JSONAPIErrorResponse; @@ -1405,12 +2015,12 @@ export class AppBuilderApiResponseProcessor { // Work around for missing responses in specification, e.g. for petstore.yaml if (response.httpStatusCode >= 200 && response.httpStatusCode <= 299) { - const body: GetAppResponse = deserialize( + const body: ListAppVersionsResponse = deserialize( parse(await response.body.text(), contentType), TypingInfo, - "GetAppResponse", + "ListAppVersionsResponse", "", - ) as GetAppResponse; + ) as ListAppVersionsResponse; return body; } @@ -1425,20 +2035,22 @@ export class AppBuilderApiResponseProcessor { * Unwraps the actual response sent by the server from the response context and deserializes the response content * to the expected objects * - * @params response Response returned by the server for a request to listApps + * @params response Response returned by the server for a request to listBlueprints * @throws ApiException if the response code was not in [200, 299] */ - public async listApps(response: ResponseContext): Promise { + public async listBlueprints( + response: ResponseContext, + ): Promise { const contentType = normalizeMediaType(response.headers["content-type"]); if (response.httpStatusCode === 200) { - const body: ListAppsResponse = deserialize( + const body: ListBlueprintsResponse = deserialize( parse(await response.body.text(), contentType), TypingInfo, - "ListAppsResponse", - ) as ListAppsResponse; + "ListBlueprintsResponse", + ) as ListBlueprintsResponse; return body; } - if (response.httpStatusCode === 400 || response.httpStatusCode === 403) { + if (response.httpStatusCode === 403) { const bodyText = parse(await response.body.text(), contentType); let body: JSONAPIErrorResponse; try { @@ -1480,12 +2092,12 @@ export class AppBuilderApiResponseProcessor { // Work around for missing responses in specification, e.g. for petstore.yaml if (response.httpStatusCode >= 200 && response.httpStatusCode <= 299) { - const body: ListAppsResponse = deserialize( + const body: ListBlueprintsResponse = deserialize( parse(await response.body.text(), contentType), TypingInfo, - "ListAppsResponse", + "ListBlueprintsResponse", "", - ) as ListAppsResponse; + ) as ListBlueprintsResponse; return body; } @@ -1500,26 +2112,22 @@ export class AppBuilderApiResponseProcessor { * Unwraps the actual response sent by the server from the response context and deserializes the response content * to the expected objects * - * @params response Response returned by the server for a request to listAppVersions + * @params response Response returned by the server for a request to listTags * @throws ApiException if the response code was not in [200, 299] */ - public async listAppVersions( + public async listTags( response: ResponseContext, - ): Promise { + ): Promise { const contentType = normalizeMediaType(response.headers["content-type"]); if (response.httpStatusCode === 200) { - const body: ListAppVersionsResponse = deserialize( + const body: AppBuilderListTagsResponse = deserialize( parse(await response.body.text(), contentType), TypingInfo, - "ListAppVersionsResponse", - ) as ListAppVersionsResponse; + "AppBuilderListTagsResponse", + ) as AppBuilderListTagsResponse; return body; } - if ( - response.httpStatusCode === 400 || - response.httpStatusCode === 403 || - response.httpStatusCode === 404 - ) { + if (response.httpStatusCode === 403) { const bodyText = parse(await response.body.text(), contentType); let body: JSONAPIErrorResponse; try { @@ -1561,12 +2169,12 @@ export class AppBuilderApiResponseProcessor { // Work around for missing responses in specification, e.g. for petstore.yaml if (response.httpStatusCode >= 200 && response.httpStatusCode <= 299) { - const body: ListAppVersionsResponse = deserialize( + const body: AppBuilderListTagsResponse = deserialize( parse(await response.body.text(), contentType), TypingInfo, - "ListAppVersionsResponse", + "AppBuilderListTagsResponse", "", - ) as ListAppVersionsResponse; + ) as AppBuilderListTagsResponse; return body; } @@ -2298,6 +2906,30 @@ export interface AppBuilderApiGetAppRequest { version?: string; } +export interface AppBuilderApiGetBlueprintRequest { + /** + * The ID of the blueprint to retrieve. + * @type string + */ + blueprintId: string; +} + +export interface AppBuilderApiGetBlueprintsByIntegrationIdRequest { + /** + * The integration ID to filter blueprints by. + * @type string + */ + integrationId: string; +} + +export interface AppBuilderApiGetBlueprintsBySlugsRequest { + /** + * A comma-separated list of blueprint slugs. + * @type string + */ + slugs: string; +} + export interface AppBuilderApiListAppsRequest { /** * The number of apps to return per page. @@ -2374,6 +3006,19 @@ export interface AppBuilderApiListAppVersionsRequest { page?: number; } +export interface AppBuilderApiListBlueprintsRequest { + /** + * The number of blueprints to return per page. Defaults to 10. Maximum is 100. + * @type number + */ + limit?: number; + /** + * The page of results to return. Starts at 0. + * @type number + */ + page?: number; +} + export interface AppBuilderApiPublishAppRequest { /** * The ID of the app to publish. @@ -2606,6 +3251,72 @@ export class AppBuilderApi { }); } + /** + * Retrieve an app blueprint by its ID. + * @param param The request object + */ + public getBlueprint( + param: AppBuilderApiGetBlueprintRequest, + options?: Configuration, + ): Promise { + const requestContextPromise = this.requestFactory.getBlueprint( + param.blueprintId, + options, + ); + return requestContextPromise.then((requestContext) => { + return this.configuration.httpApi + .send(requestContext) + .then((responseContext) => { + return this.responseProcessor.getBlueprint(responseContext); + }); + }); + } + + /** + * List app blueprints associated with a specific integration ID. + * @param param The request object + */ + public getBlueprintsByIntegrationId( + param: AppBuilderApiGetBlueprintsByIntegrationIdRequest, + options?: Configuration, + ): Promise { + const requestContextPromise = + this.requestFactory.getBlueprintsByIntegrationId( + param.integrationId, + options, + ); + return requestContextPromise.then((requestContext) => { + return this.configuration.httpApi + .send(requestContext) + .then((responseContext) => { + return this.responseProcessor.getBlueprintsByIntegrationId( + responseContext, + ); + }); + }); + } + + /** + * Retrieve app blueprints by their slugs. + * @param param The request object + */ + public getBlueprintsBySlugs( + param: AppBuilderApiGetBlueprintsBySlugsRequest, + options?: Configuration, + ): Promise { + const requestContextPromise = this.requestFactory.getBlueprintsBySlugs( + param.slugs, + options, + ); + return requestContextPromise.then((requestContext) => { + return this.configuration.httpApi + .send(requestContext) + .then((responseContext) => { + return this.responseProcessor.getBlueprintsBySlugs(responseContext); + }); + }); + } + /** * List all apps, with optional filters and sorting. This endpoint is paginated. Only basic app information such as the app ID, name, and description is returned by this endpoint. This API requires a [registered application key](https://docs.datadoghq.com/api/latest/action-connection/#register-a-new-app-key). Alternatively, you can configure these permissions [in the UI](https://docs.datadoghq.com/account_management/api-app-keys/#actions-api-access). * @param param The request object @@ -2660,6 +3371,45 @@ export class AppBuilderApi { }); } + /** + * List available app blueprints. + * @param param The request object + */ + public listBlueprints( + param: AppBuilderApiListBlueprintsRequest = {}, + options?: Configuration, + ): Promise { + const requestContextPromise = this.requestFactory.listBlueprints( + param.limit, + param.page, + options, + ); + return requestContextPromise.then((requestContext) => { + return this.configuration.httpApi + .send(requestContext) + .then((responseContext) => { + return this.responseProcessor.listBlueprints(responseContext); + }); + }); + } + + /** + * List all tags associated with the authenticated user's apps. + * @param param The request object + */ + public listTags( + options?: Configuration, + ): Promise { + const requestContextPromise = this.requestFactory.listTags(options); + return requestContextPromise.then((requestContext) => { + return this.configuration.httpApi + .send(requestContext) + .then((responseContext) => { + return this.responseProcessor.listTags(responseContext); + }); + }); + } + /** * Publish an app for use by other users. To ensure the app is accessible to the correct users, you also need to set a [Restriction Policy](https://docs.datadoghq.com/api/latest/restriction-policies/) on the app if a policy does not yet exist. This API requires a [registered application key](https://docs.datadoghq.com/api/latest/action-connection/#register-a-new-app-key). Alternatively, you can configure these permissions [in the UI](https://docs.datadoghq.com/account_management/api-app-keys/#actions-api-access). * @param param The request object diff --git a/services/app_builder/src/v2/index.ts b/services/app_builder/src/v2/index.ts index 497cfebe66c3..3ac3691c0924 100644 --- a/services/app_builder/src/v2/index.ts +++ b/services/app_builder/src/v2/index.ts @@ -4,8 +4,12 @@ export { AppBuilderApiDeleteAppRequest, AppBuilderApiDeleteAppsRequest, AppBuilderApiGetAppRequest, + AppBuilderApiGetBlueprintRequest, + AppBuilderApiGetBlueprintsByIntegrationIdRequest, + AppBuilderApiGetBlueprintsBySlugsRequest, AppBuilderApiListAppVersionsRequest, AppBuilderApiListAppsRequest, + AppBuilderApiListBlueprintsRequest, AppBuilderApiPublishAppRequest, AppBuilderApiRevertAppRequest, AppBuilderApiUnpublishAppRequest, @@ -38,6 +42,7 @@ export { APIErrorResponse } from "./models/APIErrorResponse"; export { AppBuilderEvent } from "./models/AppBuilderEvent"; export { AppBuilderEventName } from "./models/AppBuilderEventName"; export { AppBuilderEventType } from "./models/AppBuilderEventType"; +export { AppBuilderListTagsResponse } from "./models/AppBuilderListTagsResponse"; export { AppDefinitionType } from "./models/AppDefinitionType"; export { AppDeploymentType } from "./models/AppDeploymentType"; export { AppFavoriteType } from "./models/AppFavoriteType"; @@ -52,6 +57,11 @@ export { AppVersion } from "./models/AppVersion"; export { AppVersionAttributes } from "./models/AppVersionAttributes"; export { AppVersionNameType } from "./models/AppVersionNameType"; export { AppVersionType } from "./models/AppVersionType"; +export { BlueprintAttributes } from "./models/BlueprintAttributes"; +export { BlueprintData } from "./models/BlueprintData"; +export { BlueprintDataType } from "./models/BlueprintDataType"; +export { BlueprintMetadataAttributes } from "./models/BlueprintMetadataAttributes"; +export { BlueprintMetadataData } from "./models/BlueprintMetadataData"; export { Component } from "./models/Component"; export { ComponentGrid } from "./models/ComponentGrid"; export { ComponentGridProperties } from "./models/ComponentGridProperties"; @@ -89,6 +99,8 @@ export { DeploymentRelationshipData } from "./models/DeploymentRelationshipData" export { GetAppResponse } from "./models/GetAppResponse"; export { GetAppResponseData } from "./models/GetAppResponseData"; export { GetAppResponseDataAttributes } from "./models/GetAppResponseDataAttributes"; +export { GetBlueprintResponse } from "./models/GetBlueprintResponse"; +export { GetBlueprintsResponse } from "./models/GetBlueprintsResponse"; export { JSONAPIErrorItem } from "./models/JSONAPIErrorItem"; export { JSONAPIErrorItemSource } from "./models/JSONAPIErrorItemSource"; export { JSONAPIErrorResponse } from "./models/JSONAPIErrorResponse"; @@ -99,12 +111,15 @@ export { ListAppsResponseDataItemsRelationships } from "./models/ListAppsRespons export { ListAppsResponseMeta } from "./models/ListAppsResponseMeta"; export { ListAppsResponseMetaPage } from "./models/ListAppsResponseMetaPage"; export { ListAppVersionsResponse } from "./models/ListAppVersionsResponse"; +export { ListBlueprintsResponse } from "./models/ListBlueprintsResponse"; export { PublishAppResponse } from "./models/PublishAppResponse"; export { PublishRequestType } from "./models/PublishRequestType"; export { Query } from "./models/Query"; export { StateVariable } from "./models/StateVariable"; export { StateVariableProperties } from "./models/StateVariableProperties"; export { StateVariableType } from "./models/StateVariableType"; +export { TagData } from "./models/TagData"; +export { TagDataType } from "./models/TagDataType"; export { UnpublishAppResponse } from "./models/UnpublishAppResponse"; export { UpdateAppFavoriteRequest } from "./models/UpdateAppFavoriteRequest"; export { UpdateAppFavoriteRequestData } from "./models/UpdateAppFavoriteRequestData"; diff --git a/services/app_builder/src/v2/models/AppBuilderListTagsResponse.ts b/services/app_builder/src/v2/models/AppBuilderListTagsResponse.ts new file mode 100644 index 000000000000..00e6fedcc583 --- /dev/null +++ b/services/app_builder/src/v2/models/AppBuilderListTagsResponse.ts @@ -0,0 +1,46 @@ +import { AttributeTypeMap } from "@datadog/datadog-api-client"; + +import { TagData } from "./TagData"; + +/** + * The response for listing tags associated with apps. + */ +export class AppBuilderListTagsResponse { + /** + * An array of tags. + */ + "data"?: Array; + /** + * A container for additional, undeclared properties. + * This is a holder for any undeclared properties as specified with + * the 'additionalProperties' keyword in the OAS document. + */ + "additionalProperties"?: { [key: string]: any }; + /** + * @ignore + */ + "_unparsed"?: boolean; + + /** + * @ignore + */ + static readonly attributeTypeMap: AttributeTypeMap = { + data: { + baseName: "data", + type: "Array", + }, + additionalProperties: { + baseName: "additionalProperties", + type: "{ [key: string]: any; }", + }, + }; + + /** + * @ignore + */ + static getAttributeTypeMap(): AttributeTypeMap { + return AppBuilderListTagsResponse.attributeTypeMap; + } + + public constructor() {} +} diff --git a/services/app_builder/src/v2/models/BlueprintAttributes.ts b/services/app_builder/src/v2/models/BlueprintAttributes.ts new file mode 100644 index 000000000000..70dbf618faf9 --- /dev/null +++ b/services/app_builder/src/v2/models/BlueprintAttributes.ts @@ -0,0 +1,158 @@ +import { AttributeTypeMap } from "@datadog/datadog-api-client"; + +import { AppDefinitionType } from "./AppDefinitionType"; + +/** + * The attributes of a blueprint resource. + */ +export class BlueprintAttributes { + /** + * The timestamp when the blueprint was created. + */ + "createdAt": Date; + /** + * The app definition type. + */ + "definition": AppDefinitionType; + /** + * A description of what the blueprint does. + */ + "description": string; + /** + * Embedded datastore blueprints. + */ + "embeddedDatastoreBlueprints"?: { [key: string]: any }; + /** + * Embedded native actions. + */ + "embeddedNativeActions"?: Array<{ [key: string]: any }>; + /** + * Embedded workflow blueprints. + */ + "embeddedWorkflowBlueprints"?: { [key: string]: any }; + /** + * The integration ID associated with the blueprint. + */ + "integrationId"?: string; + /** + * Mocked outputs for testing the blueprint. + */ + "mockedOutputs"?: { [key: string]: any }; + /** + * The human-readable name of the blueprint. + */ + "name": string; + /** + * The unique slug identifier of the blueprint. + */ + "slug": string; + /** + * Tags associated with the blueprint. + */ + "tags"?: Array; + /** + * The background style of the blueprint tile. + */ + "tileBackground"?: string; + /** + * The fully qualified name of the action used as the tile icon. + */ + "tileIconActionFqn"?: string; + /** + * The timestamp when the blueprint was last updated. + */ + "updatedAt": Date; + /** + * A container for additional, undeclared properties. + * This is a holder for any undeclared properties as specified with + * the 'additionalProperties' keyword in the OAS document. + */ + "additionalProperties"?: { [key: string]: any }; + /** + * @ignore + */ + "_unparsed"?: boolean; + + /** + * @ignore + */ + static readonly attributeTypeMap: AttributeTypeMap = { + createdAt: { + baseName: "created_at", + type: "Date", + required: true, + format: "date-time", + }, + definition: { + baseName: "definition", + type: "AppDefinitionType", + required: true, + }, + description: { + baseName: "description", + type: "string", + required: true, + }, + embeddedDatastoreBlueprints: { + baseName: "embedded_datastore_blueprints", + type: "{ [key: string]: any; }", + }, + embeddedNativeActions: { + baseName: "embedded_native_actions", + type: "Array<{ [key: string]: any; }>", + }, + embeddedWorkflowBlueprints: { + baseName: "embedded_workflow_blueprints", + type: "{ [key: string]: any; }", + }, + integrationId: { + baseName: "integration_id", + type: "string", + }, + mockedOutputs: { + baseName: "mocked_outputs", + type: "{ [key: string]: any; }", + }, + name: { + baseName: "name", + type: "string", + required: true, + }, + slug: { + baseName: "slug", + type: "string", + required: true, + }, + tags: { + baseName: "tags", + type: "Array", + }, + tileBackground: { + baseName: "tile_background", + type: "string", + }, + tileIconActionFqn: { + baseName: "tile_icon_action_fqn", + type: "string", + }, + updatedAt: { + baseName: "updated_at", + type: "Date", + required: true, + format: "date-time", + }, + additionalProperties: { + baseName: "additionalProperties", + type: "{ [key: string]: any; }", + }, + }; + + /** + * @ignore + */ + static getAttributeTypeMap(): AttributeTypeMap { + return BlueprintAttributes.attributeTypeMap; + } + + public constructor() {} +} diff --git a/services/app_builder/src/v2/models/BlueprintData.ts b/services/app_builder/src/v2/models/BlueprintData.ts new file mode 100644 index 000000000000..e0ce143dac06 --- /dev/null +++ b/services/app_builder/src/v2/models/BlueprintData.ts @@ -0,0 +1,67 @@ +import { AttributeTypeMap } from "@datadog/datadog-api-client"; + +import { BlueprintAttributes } from "./BlueprintAttributes"; +import { BlueprintDataType } from "./BlueprintDataType"; + +/** + * A blueprint resource. + */ +export class BlueprintData { + /** + * The attributes of a blueprint resource. + */ + "attributes": BlueprintAttributes; + /** + * The ID of the blueprint. + */ + "id": string; + /** + * The resource type for a blueprint. + */ + "type": BlueprintDataType; + /** + * A container for additional, undeclared properties. + * This is a holder for any undeclared properties as specified with + * the 'additionalProperties' keyword in the OAS document. + */ + "additionalProperties"?: { [key: string]: any }; + /** + * @ignore + */ + "_unparsed"?: boolean; + + /** + * @ignore + */ + static readonly attributeTypeMap: AttributeTypeMap = { + attributes: { + baseName: "attributes", + type: "BlueprintAttributes", + required: true, + }, + id: { + baseName: "id", + type: "string", + required: true, + format: "uuid", + }, + type: { + baseName: "type", + type: "BlueprintDataType", + required: true, + }, + additionalProperties: { + baseName: "additionalProperties", + type: "{ [key: string]: any; }", + }, + }; + + /** + * @ignore + */ + static getAttributeTypeMap(): AttributeTypeMap { + return BlueprintData.attributeTypeMap; + } + + public constructor() {} +} diff --git a/services/app_builder/src/v2/models/BlueprintDataType.ts b/services/app_builder/src/v2/models/BlueprintDataType.ts new file mode 100644 index 000000000000..2c5f3cc4294a --- /dev/null +++ b/services/app_builder/src/v2/models/BlueprintDataType.ts @@ -0,0 +1,7 @@ +import { UnparsedObject } from "@datadog/datadog-api-client"; + +/** + * The resource type for a blueprint. + */ +export type BlueprintDataType = typeof BLUEPRINT | UnparsedObject; +export const BLUEPRINT = "blueprint"; diff --git a/services/app_builder/src/v2/models/BlueprintMetadataAttributes.ts b/services/app_builder/src/v2/models/BlueprintMetadataAttributes.ts new file mode 100644 index 000000000000..053a0374266b --- /dev/null +++ b/services/app_builder/src/v2/models/BlueprintMetadataAttributes.ts @@ -0,0 +1,107 @@ +import { AttributeTypeMap } from "@datadog/datadog-api-client"; + +/** + * The attributes of a blueprint metadata resource. + */ +export class BlueprintMetadataAttributes { + /** + * The timestamp when the blueprint was created. + */ + "createdAt": Date; + /** + * A description of what the blueprint does. + */ + "description": string; + /** + * The human-readable name of the blueprint. + */ + "name": string; + /** + * The unique slug identifier of the blueprint. + */ + "slug": string; + /** + * Tags associated with the blueprint. + */ + "tags"?: Array; + /** + * The background style of the blueprint tile. + */ + "tileBackground"?: string; + /** + * The fully qualified name of the action used as the tile icon. + */ + "tileIconActionFqn"?: string; + /** + * The timestamp when the blueprint was last updated. + */ + "updatedAt": Date; + /** + * A container for additional, undeclared properties. + * This is a holder for any undeclared properties as specified with + * the 'additionalProperties' keyword in the OAS document. + */ + "additionalProperties"?: { [key: string]: any }; + /** + * @ignore + */ + "_unparsed"?: boolean; + + /** + * @ignore + */ + static readonly attributeTypeMap: AttributeTypeMap = { + createdAt: { + baseName: "created_at", + type: "Date", + required: true, + format: "date-time", + }, + description: { + baseName: "description", + type: "string", + required: true, + }, + name: { + baseName: "name", + type: "string", + required: true, + }, + slug: { + baseName: "slug", + type: "string", + required: true, + }, + tags: { + baseName: "tags", + type: "Array", + }, + tileBackground: { + baseName: "tile_background", + type: "string", + }, + tileIconActionFqn: { + baseName: "tile_icon_action_fqn", + type: "string", + }, + updatedAt: { + baseName: "updated_at", + type: "Date", + required: true, + format: "date-time", + }, + additionalProperties: { + baseName: "additionalProperties", + type: "{ [key: string]: any; }", + }, + }; + + /** + * @ignore + */ + static getAttributeTypeMap(): AttributeTypeMap { + return BlueprintMetadataAttributes.attributeTypeMap; + } + + public constructor() {} +} diff --git a/services/app_builder/src/v2/models/BlueprintMetadataData.ts b/services/app_builder/src/v2/models/BlueprintMetadataData.ts new file mode 100644 index 000000000000..d141e2ea1aff --- /dev/null +++ b/services/app_builder/src/v2/models/BlueprintMetadataData.ts @@ -0,0 +1,67 @@ +import { AttributeTypeMap } from "@datadog/datadog-api-client"; + +import { BlueprintDataType } from "./BlueprintDataType"; +import { BlueprintMetadataAttributes } from "./BlueprintMetadataAttributes"; + +/** + * A blueprint metadata resource. + */ +export class BlueprintMetadataData { + /** + * The attributes of a blueprint metadata resource. + */ + "attributes": BlueprintMetadataAttributes; + /** + * The ID of the blueprint. + */ + "id": string; + /** + * The resource type for a blueprint. + */ + "type": BlueprintDataType; + /** + * A container for additional, undeclared properties. + * This is a holder for any undeclared properties as specified with + * the 'additionalProperties' keyword in the OAS document. + */ + "additionalProperties"?: { [key: string]: any }; + /** + * @ignore + */ + "_unparsed"?: boolean; + + /** + * @ignore + */ + static readonly attributeTypeMap: AttributeTypeMap = { + attributes: { + baseName: "attributes", + type: "BlueprintMetadataAttributes", + required: true, + }, + id: { + baseName: "id", + type: "string", + required: true, + format: "uuid", + }, + type: { + baseName: "type", + type: "BlueprintDataType", + required: true, + }, + additionalProperties: { + baseName: "additionalProperties", + type: "{ [key: string]: any; }", + }, + }; + + /** + * @ignore + */ + static getAttributeTypeMap(): AttributeTypeMap { + return BlueprintMetadataData.attributeTypeMap; + } + + public constructor() {} +} diff --git a/services/app_builder/src/v2/models/GetBlueprintResponse.ts b/services/app_builder/src/v2/models/GetBlueprintResponse.ts new file mode 100644 index 000000000000..81fae24fa3be --- /dev/null +++ b/services/app_builder/src/v2/models/GetBlueprintResponse.ts @@ -0,0 +1,46 @@ +import { AttributeTypeMap } from "@datadog/datadog-api-client"; + +import { BlueprintData } from "./BlueprintData"; + +/** + * The response for retrieving a single blueprint. + */ +export class GetBlueprintResponse { + /** + * A blueprint resource. + */ + "data"?: BlueprintData; + /** + * A container for additional, undeclared properties. + * This is a holder for any undeclared properties as specified with + * the 'additionalProperties' keyword in the OAS document. + */ + "additionalProperties"?: { [key: string]: any }; + /** + * @ignore + */ + "_unparsed"?: boolean; + + /** + * @ignore + */ + static readonly attributeTypeMap: AttributeTypeMap = { + data: { + baseName: "data", + type: "BlueprintData", + }, + additionalProperties: { + baseName: "additionalProperties", + type: "{ [key: string]: any; }", + }, + }; + + /** + * @ignore + */ + static getAttributeTypeMap(): AttributeTypeMap { + return GetBlueprintResponse.attributeTypeMap; + } + + public constructor() {} +} diff --git a/services/app_builder/src/v2/models/GetBlueprintsResponse.ts b/services/app_builder/src/v2/models/GetBlueprintsResponse.ts new file mode 100644 index 000000000000..87fadd8af452 --- /dev/null +++ b/services/app_builder/src/v2/models/GetBlueprintsResponse.ts @@ -0,0 +1,46 @@ +import { AttributeTypeMap } from "@datadog/datadog-api-client"; + +import { BlueprintData } from "./BlueprintData"; + +/** + * The response for retrieving multiple blueprints. + */ +export class GetBlueprintsResponse { + /** + * An array of blueprints. + */ + "data"?: Array; + /** + * A container for additional, undeclared properties. + * This is a holder for any undeclared properties as specified with + * the 'additionalProperties' keyword in the OAS document. + */ + "additionalProperties"?: { [key: string]: any }; + /** + * @ignore + */ + "_unparsed"?: boolean; + + /** + * @ignore + */ + static readonly attributeTypeMap: AttributeTypeMap = { + data: { + baseName: "data", + type: "Array", + }, + additionalProperties: { + baseName: "additionalProperties", + type: "{ [key: string]: any; }", + }, + }; + + /** + * @ignore + */ + static getAttributeTypeMap(): AttributeTypeMap { + return GetBlueprintsResponse.attributeTypeMap; + } + + public constructor() {} +} diff --git a/services/app_builder/src/v2/models/ListBlueprintsResponse.ts b/services/app_builder/src/v2/models/ListBlueprintsResponse.ts new file mode 100644 index 000000000000..e70ef963e55e --- /dev/null +++ b/services/app_builder/src/v2/models/ListBlueprintsResponse.ts @@ -0,0 +1,46 @@ +import { AttributeTypeMap } from "@datadog/datadog-api-client"; + +import { BlueprintMetadataData } from "./BlueprintMetadataData"; + +/** + * The response for listing available blueprints. + */ +export class ListBlueprintsResponse { + /** + * An array of blueprint metadata. + */ + "data"?: Array; + /** + * A container for additional, undeclared properties. + * This is a holder for any undeclared properties as specified with + * the 'additionalProperties' keyword in the OAS document. + */ + "additionalProperties"?: { [key: string]: any }; + /** + * @ignore + */ + "_unparsed"?: boolean; + + /** + * @ignore + */ + static readonly attributeTypeMap: AttributeTypeMap = { + data: { + baseName: "data", + type: "Array", + }, + additionalProperties: { + baseName: "additionalProperties", + type: "{ [key: string]: any; }", + }, + }; + + /** + * @ignore + */ + static getAttributeTypeMap(): AttributeTypeMap { + return ListBlueprintsResponse.attributeTypeMap; + } + + public constructor() {} +} diff --git a/services/app_builder/src/v2/models/TagData.ts b/services/app_builder/src/v2/models/TagData.ts new file mode 100644 index 000000000000..811f40ca6deb --- /dev/null +++ b/services/app_builder/src/v2/models/TagData.ts @@ -0,0 +1,56 @@ +import { AttributeTypeMap } from "@datadog/datadog-api-client"; + +import { TagDataType } from "./TagDataType"; + +/** + * A tag resource associated with an app. + */ +export class TagData { + /** + * The name of the tag. + */ + "id": string; + /** + * The resource type for a tag. + */ + "type": TagDataType; + /** + * A container for additional, undeclared properties. + * This is a holder for any undeclared properties as specified with + * the 'additionalProperties' keyword in the OAS document. + */ + "additionalProperties"?: { [key: string]: any }; + /** + * @ignore + */ + "_unparsed"?: boolean; + + /** + * @ignore + */ + static readonly attributeTypeMap: AttributeTypeMap = { + id: { + baseName: "id", + type: "string", + required: true, + }, + type: { + baseName: "type", + type: "TagDataType", + required: true, + }, + additionalProperties: { + baseName: "additionalProperties", + type: "{ [key: string]: any; }", + }, + }; + + /** + * @ignore + */ + static getAttributeTypeMap(): AttributeTypeMap { + return TagData.attributeTypeMap; + } + + public constructor() {} +} diff --git a/services/app_builder/src/v2/models/TagDataType.ts b/services/app_builder/src/v2/models/TagDataType.ts new file mode 100644 index 000000000000..c76e7e93594d --- /dev/null +++ b/services/app_builder/src/v2/models/TagDataType.ts @@ -0,0 +1,7 @@ +import { UnparsedObject } from "@datadog/datadog-api-client"; + +/** + * The resource type for a tag. + */ +export type TagDataType = typeof TAG | UnparsedObject; +export const TAG = "tag"; diff --git a/services/app_builder/src/v2/models/TypingInfo.ts b/services/app_builder/src/v2/models/TypingInfo.ts index 56908ed2e5ed..4bb7b39d5d7d 100644 --- a/services/app_builder/src/v2/models/TypingInfo.ts +++ b/services/app_builder/src/v2/models/TypingInfo.ts @@ -7,10 +7,15 @@ import { ActionQueryProperties } from "./ActionQueryProperties"; import { ActionQuerySpecConnectionGroup } from "./ActionQuerySpecConnectionGroup"; import { ActionQuerySpecObject } from "./ActionQuerySpecObject"; import { AppBuilderEvent } from "./AppBuilderEvent"; +import { AppBuilderListTagsResponse } from "./AppBuilderListTagsResponse"; import { AppMeta } from "./AppMeta"; import { AppRelationship } from "./AppRelationship"; import { AppVersion } from "./AppVersion"; import { AppVersionAttributes } from "./AppVersionAttributes"; +import { BlueprintAttributes } from "./BlueprintAttributes"; +import { BlueprintData } from "./BlueprintData"; +import { BlueprintMetadataAttributes } from "./BlueprintMetadataAttributes"; +import { BlueprintMetadataData } from "./BlueprintMetadataData"; import { Component } from "./Component"; import { ComponentGrid } from "./ComponentGrid"; import { ComponentGridProperties } from "./ComponentGridProperties"; @@ -42,6 +47,8 @@ import { DeploymentRelationshipData } from "./DeploymentRelationshipData"; import { GetAppResponse } from "./GetAppResponse"; import { GetAppResponseData } from "./GetAppResponseData"; import { GetAppResponseDataAttributes } from "./GetAppResponseDataAttributes"; +import { GetBlueprintResponse } from "./GetBlueprintResponse"; +import { GetBlueprintsResponse } from "./GetBlueprintsResponse"; import { JSONAPIErrorItem } from "./JSONAPIErrorItem"; import { JSONAPIErrorItemSource } from "./JSONAPIErrorItemSource"; import { JSONAPIErrorResponse } from "./JSONAPIErrorResponse"; @@ -52,9 +59,11 @@ import { ListAppsResponseDataItemsAttributes } from "./ListAppsResponseDataItems import { ListAppsResponseDataItemsRelationships } from "./ListAppsResponseDataItemsRelationships"; import { ListAppsResponseMeta } from "./ListAppsResponseMeta"; import { ListAppsResponseMetaPage } from "./ListAppsResponseMetaPage"; +import { ListBlueprintsResponse } from "./ListBlueprintsResponse"; import { PublishAppResponse } from "./PublishAppResponse"; import { StateVariable } from "./StateVariable"; import { StateVariableProperties } from "./StateVariableProperties"; +import { TagData } from "./TagData"; import { UnpublishAppResponse } from "./UnpublishAppResponse"; import { UpdateAppFavoriteRequest } from "./UpdateAppFavoriteRequest"; import { UpdateAppFavoriteRequestData } from "./UpdateAppFavoriteRequestData"; @@ -122,6 +131,7 @@ export const TypingInfo: ModelTypingInfo = { "-updated_at", "-user_name", ], + BlueprintDataType: ["blueprint"], ComponentGridType: ["grid"], ComponentType: [ "table", @@ -149,6 +159,7 @@ export const TypingInfo: ModelTypingInfo = { DataTransformType: ["dataTransform"], PublishRequestType: ["publishRequest"], StateVariableType: ["stateVariable"], + TagDataType: ["tag"], }, oneOfMap: { ActionQueryCondition: ["boolean", "string"], @@ -173,10 +184,15 @@ export const TypingInfo: ModelTypingInfo = { ActionQuerySpecConnectionGroup: ActionQuerySpecConnectionGroup, ActionQuerySpecObject: ActionQuerySpecObject, AppBuilderEvent: AppBuilderEvent, + AppBuilderListTagsResponse: AppBuilderListTagsResponse, AppMeta: AppMeta, AppRelationship: AppRelationship, AppVersion: AppVersion, AppVersionAttributes: AppVersionAttributes, + BlueprintAttributes: BlueprintAttributes, + BlueprintData: BlueprintData, + BlueprintMetadataAttributes: BlueprintMetadataAttributes, + BlueprintMetadataData: BlueprintMetadataData, Component: Component, ComponentGrid: ComponentGrid, ComponentGridProperties: ComponentGridProperties, @@ -210,6 +226,8 @@ export const TypingInfo: ModelTypingInfo = { GetAppResponse: GetAppResponse, GetAppResponseData: GetAppResponseData, GetAppResponseDataAttributes: GetAppResponseDataAttributes, + GetBlueprintResponse: GetBlueprintResponse, + GetBlueprintsResponse: GetBlueprintsResponse, JSONAPIErrorItem: JSONAPIErrorItem, JSONAPIErrorItemSource: JSONAPIErrorItemSource, JSONAPIErrorResponse: JSONAPIErrorResponse, @@ -221,9 +239,11 @@ export const TypingInfo: ModelTypingInfo = { ListAppsResponseDataItemsRelationships, ListAppsResponseMeta: ListAppsResponseMeta, ListAppsResponseMetaPage: ListAppsResponseMetaPage, + ListBlueprintsResponse: ListBlueprintsResponse, PublishAppResponse: PublishAppResponse, StateVariable: StateVariable, StateVariableProperties: StateVariableProperties, + TagData: TagData, UnpublishAppResponse: UnpublishAppResponse, UpdateAppFavoriteRequest: UpdateAppFavoriteRequest, UpdateAppFavoriteRequestData: UpdateAppFavoriteRequestData,