diff --git a/.generator/schemas/v2/openapi.yaml b/.generator/schemas/v2/openapi.yaml index 65d674fb23..6424cf7188 100644 --- a/.generator/schemas/v2/openapi.yaml +++ b/.generator/schemas/v2/openapi.yaml @@ -1968,6 +1968,64 @@ components: type: string requestBodies: {} responses: + AmsIntegrationAccountSchemaBadRequestResponse: + content: + application/json: + examples: + invalid_integration_name: + summary: Invalid integration name format + value: + errors: + - detail: Invalid integration name format + status: "400" + title: Bad Request + schema: + $ref: "#/components/schemas/APIErrorResponse" + description: "Bad Request: The integration name format is invalid." + AmsIntegrationAccountSchemaForbiddenResponse: + content: + application/json: + examples: + integration_not_allowed: + summary: Integration not allowed + value: + errors: + - detail: "The API is currently disabled for this integration" + status: "403" + title: Integration Not Allowed + schema: + $ref: "#/components/schemas/APIErrorResponse" + description: "Forbidden: The integration is not enabled for API access." + AmsIntegrationAccountSchemaNotFoundResponse: + content: + application/json: + examples: + schema_not_found: + summary: Schema not found for integration + value: + errors: + - detail: "Schema not found for integration: twilio" + status: "404" + title: Not Found + schema: + $ref: "#/components/schemas/APIErrorResponse" + description: "Not Found: The integration does not exist or has no schema available." + AmsIntegrationAccountSchemaTooManyRequestsResponse: + content: + application/json: + examples: + rate_limit_exceeded: + summary: Rate limit exceeded + value: + errors: + - detail: "Rate limit exceeded. Please retry after the rate limit window expires." + status: "429" + title: Too Many Requests + schema: + $ref: "#/components/schemas/APIErrorResponse" + description: |- + Too Many Requests: Rate limit exceeded. + This endpoint has a rate limit of 12000 requests per organization every 60 seconds. BadRequestResponse: content: "application/json": @@ -2100,6 +2158,324 @@ components: schema: $ref: "#/components/schemas/JSONAPIErrorResponse" description: The server cannot process the request because it contains invalid data. + WebIntegrationCreateAccountBadRequestResponse: + content: + application/json: + examples: + invalid_request: + summary: Invalid request body + value: + errors: + - detail: "Invalid request body: missing required field 'name'" + status: "400" + title: Bad Request + schema: + $ref: "#/components/schemas/APIErrorResponse" + description: "Bad Request: The request body is malformed or the integration name format is invalid." + WebIntegrationCreateAccountForbiddenResponse: + content: + application/json: + examples: + permission_denied: + summary: Permission denied + value: + errors: + - detail: "User does not have permission to manage integrations" + status: "403" + title: Forbidden + schema: + $ref: "#/components/schemas/APIErrorResponse" + description: "Forbidden: The integration is not enabled for API access or the user lacks permissions to manage integrations." + WebIntegrationCreateAccountNotFoundResponse: + content: + application/json: + examples: + integration_not_found: + summary: Integration not found + value: + errors: + - detail: "Integration not found: unknown_integration" + status: "404" + title: Not Found + schema: + $ref: "#/components/schemas/APIErrorResponse" + description: "Not Found: The integration does not exist." + WebIntegrationCreateAccountTooManyRequestsResponse: + content: + application/json: + examples: + rate_limit_exceeded: + summary: Rate limit exceeded + value: + errors: + - detail: "Rate limit exceeded. Please retry after 20 seconds." + status: "429" + title: Too Many Requests + schema: + $ref: "#/components/schemas/APIErrorResponse" + description: |- + Too Many Requests: Rate limit exceeded. + This endpoint has a rate limit of 50 requests per user every 20 seconds. + WebIntegrationCreateAccountUnprocessableEntityResponse: + content: + application/json: + examples: + validation_failed: + summary: Validation failed + value: + errors: + - detail: "settings.account_sid is required" + status: "422" + title: Unprocessable Entity + schema: + $ref: "#/components/schemas/APIErrorResponse" + description: "Unprocessable Entity: The account configuration does not match the integration schema." + WebIntegrationDeleteAccountBadRequestResponse: + content: + application/json: + examples: + invalid_account_id: + summary: Invalid account ID format + value: + errors: + - detail: "Invalid account ID format" + status: "400" + title: Bad Request + schema: + $ref: "#/components/schemas/APIErrorResponse" + description: "Bad Request: The integration name or account ID format is invalid." + WebIntegrationDeleteAccountForbiddenResponse: + content: + application/json: + examples: + permission_denied: + summary: Permission denied + value: + errors: + - detail: "User does not have permission to delete this account" + status: "403" + title: Forbidden + schema: + $ref: "#/components/schemas/APIErrorResponse" + description: "Forbidden: The integration is not enabled for API access or the user lacks permissions to manage this account." + WebIntegrationDeleteAccountNotFoundResponse: + content: + application/json: + examples: + account_not_found: + summary: Account not found + value: + errors: + - detail: "Account not found: abc123def456" + status: "404" + title: Not Found + schema: + $ref: "#/components/schemas/APIErrorResponse" + description: "Not Found: The integration or account does not exist." + WebIntegrationDeleteAccountTooManyRequestsResponse: + content: + application/json: + examples: + rate_limit_exceeded: + summary: Rate limit exceeded + value: + errors: + - detail: "Rate limit exceeded. Please retry after 20 seconds." + status: "429" + title: Too Many Requests + schema: + $ref: "#/components/schemas/APIErrorResponse" + description: |- + Too Many Requests: Rate limit exceeded. + This endpoint has a rate limit of 50 requests per user every 20 seconds. + WebIntegrationGetAccountBadRequestResponse: + content: + application/json: + examples: + invalid_account_id: + summary: Invalid account ID format + value: + errors: + - detail: "Invalid account ID format" + status: "400" + title: Bad Request + schema: + $ref: "#/components/schemas/APIErrorResponse" + description: "Bad Request: The integration name or account ID format is invalid." + WebIntegrationGetAccountForbiddenResponse: + content: + application/json: + examples: + permission_denied: + summary: Permission denied + value: + errors: + - detail: "User does not have permission to access this account" + status: "403" + title: Forbidden + schema: + $ref: "#/components/schemas/APIErrorResponse" + description: "Forbidden: The integration is not enabled for API access or the user lacks required permissions." + WebIntegrationGetAccountNotFoundResponse: + content: + application/json: + examples: + account_not_found: + summary: Account not found + value: + errors: + - detail: "Account not found: abc123def456" + status: "404" + title: Not Found + schema: + $ref: "#/components/schemas/APIErrorResponse" + description: "Not Found: The integration or account does not exist." + WebIntegrationGetAccountTooManyRequestsResponse: + content: + application/json: + examples: + rate_limit_exceeded: + summary: Rate limit exceeded + value: + errors: + - detail: "Rate limit exceeded. Please retry after 60 seconds." + status: "429" + title: Too Many Requests + schema: + $ref: "#/components/schemas/APIErrorResponse" + description: |- + Too Many Requests: Rate limit exceeded. + This endpoint has a rate limit of 12000 requests per organization every 60 seconds. + WebIntegrationListAccountsBadRequestResponse: + content: + application/json: + examples: + invalid_integration_name: + summary: Invalid integration name format + value: + errors: + - detail: Invalid integration name format + status: "400" + title: Bad Request + schema: + $ref: "#/components/schemas/APIErrorResponse" + description: "Bad Request: The integration name format is invalid." + WebIntegrationListAccountsForbiddenResponse: + content: + application/json: + examples: + integration_not_allowed: + summary: Integration not allowed + value: + errors: + - detail: "The API is currently disabled for this integration" + status: "403" + title: Forbidden + schema: + $ref: "#/components/schemas/APIErrorResponse" + description: "Forbidden: The integration is not enabled for API access or the user lacks required permissions." + WebIntegrationListAccountsNotFoundResponse: + content: + application/json: + examples: + integration_not_found: + summary: Integration not found + value: + errors: + - detail: "Integration not found: unknown_integration" + status: "404" + title: Not Found + schema: + $ref: "#/components/schemas/APIErrorResponse" + description: "Not Found: The integration does not exist." + WebIntegrationListAccountsTooManyRequestsResponse: + content: + application/json: + examples: + rate_limit_exceeded: + summary: Rate limit exceeded + value: + errors: + - detail: "Rate limit exceeded. Please retry after 20 seconds." + status: "429" + title: Too Many Requests + schema: + $ref: "#/components/schemas/APIErrorResponse" + description: |- + Too Many Requests: Rate limit exceeded. + This endpoint has a rate limit of 50 requests per user every 20 seconds. + WebIntegrationUpdateAccountBadRequestResponse: + content: + application/json: + examples: + invalid_request: + summary: Invalid request body + value: + errors: + - detail: "Invalid request body format" + status: "400" + title: Bad Request + schema: + $ref: "#/components/schemas/APIErrorResponse" + description: "Bad Request: The request body is malformed or the integration name/account ID format is invalid." + WebIntegrationUpdateAccountForbiddenResponse: + content: + application/json: + examples: + permission_denied: + summary: Permission denied + value: + errors: + - detail: "User does not have permission to update this account" + status: "403" + title: Forbidden + schema: + $ref: "#/components/schemas/APIErrorResponse" + description: "Forbidden: The integration is not enabled for API access or the user lacks permissions to manage this account." + WebIntegrationUpdateAccountNotFoundResponse: + content: + application/json: + examples: + account_not_found: + summary: Account not found + value: + errors: + - detail: "Account not found: abc123def456" + status: "404" + title: Not Found + schema: + $ref: "#/components/schemas/APIErrorResponse" + description: "Not Found: The integration or account does not exist." + WebIntegrationUpdateAccountTooManyRequestsResponse: + content: + application/json: + examples: + rate_limit_exceeded: + summary: Rate limit exceeded + value: + errors: + - detail: "Rate limit exceeded. Please retry after 20 seconds." + status: "429" + title: Too Many Requests + schema: + $ref: "#/components/schemas/APIErrorResponse" + description: |- + Too Many Requests: Rate limit exceeded. + This endpoint has a rate limit of 50 requests per user every 20 seconds. + WebIntegrationUpdateAccountUnprocessableEntityResponse: + content: + application/json: + examples: + validation_failed: + summary: Validation failed + value: + errors: + - detail: "settings.api_key must be at least 32 characters" + status: "422" + title: Unprocessable Entity + schema: + $ref: "#/components/schemas/APIErrorResponse" + description: "Unprocessable Entity: The account configuration does not match the integration schema." schemas: APIErrorResponse: description: API error response. @@ -6394,6 +6770,370 @@ components: x-enum-varnames: - FEATURE_GATE - CANARY + AmsIntegrationAccountAttributes: + description: Attributes for a web integration account. + properties: + name: + description: The name of the account. + example: "My Production Account" + type: string + settings: + additionalProperties: {} + description: |- + Integration-specific settings for the account. The structure and required fields vary by integration type. + Use the schema endpoint to retrieve the specific requirements for each integration. + example: + account_sid: "ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + alerts: false + api_key: "SKxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + call_summaries: true + ccm_enabled: true + censor_logs: true + events: true + messages: true + type: object + required: + - name + - settings + type: object + AmsIntegrationAccountCreateRequest: + description: Payload for creating a web integration account. + properties: + data: + $ref: "#/components/schemas/AmsIntegrationAccountCreateRequestData" + required: + - data + type: object + AmsIntegrationAccountCreateRequestAttributes: + description: Attributes for creating a web integration account. + properties: + name: + description: The name of the account. + example: "My Production Account" + type: string + secrets: + additionalProperties: {} + description: |- + Sensitive credentials for the account. The structure and required fields vary by integration type. + These values are write-only and never returned in responses. + example: + api_key_token: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + type: object + settings: + additionalProperties: {} + description: |- + Integration-specific settings for the account. The structure and required fields vary by integration type. + Use the schema endpoint (GET /api/v2/integrations/{integration_name}/accounts/schema) to retrieve + the specific requirements for your integration before creating an account. + example: + account_sid: "ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + alerts: true + api_key: "SKxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + call_summaries: true + ccm_enabled: true + censor_logs: true + events: true + messages: true + type: object + required: + - name + - settings + - secrets + type: object + AmsIntegrationAccountCreateRequestData: + description: Data object for creating a web integration account. + properties: + attributes: + $ref: "#/components/schemas/AmsIntegrationAccountCreateRequestAttributes" + type: + $ref: "#/components/schemas/AmsIntegrationAccountType" + required: + - type + - attributes + type: object + AmsIntegrationAccountResponse: + description: Response containing a single web integration account. + properties: + data: + $ref: "#/components/schemas/AmsIntegrationAccountResponseData" + integration_name: + description: The name of the integration. + example: "twilio" + type: string + type: object + AmsIntegrationAccountResponseData: + description: Data object for a web integration account response. + properties: + attributes: + $ref: "#/components/schemas/AmsIntegrationAccountAttributes" + id: + description: The unique identifier for the account. + example: "abc123def456" + type: string + type: + $ref: "#/components/schemas/AmsIntegrationAccountType" + required: + - id + - type + - attributes + type: object + AmsIntegrationAccountSchemaResponse: + description: |- + Response containing the JSON schema for an integration's account configuration. + This schema defines the required and optional fields for both settings and secrets, + including field types, validation rules, and descriptions. + + The response is a standard [JSON Schema (draft-07)](https://json-schema.org/draft-07/schema#) document describing the account + configuration structure. Because this is a dynamic JSON Schema, the exact properties vary by integration. + example: + properties: + secrets: + $ref: "#/components/schemas/AmsIntegrationAccountSchemaResponseExampleSecrets" + settings: + $ref: "#/components/schemas/AmsIntegrationAccountSchemaResponseExampleSettings" + required: + - settings + - secrets + type: "object" + properties: + additionalProperties: + description: Whether additional properties are allowed at the root level (typically false). + example: false + type: boolean + properties: + $ref: "#/components/schemas/AmsIntegrationAccountSchemaResponseProperties" + required: + description: List of required top-level properties. + example: ["settings", "secrets"] + items: + type: string + type: array + type: + description: The root type of the schema (always "object"). + example: "object" + type: string + required: + - type + - properties + - required + type: object + AmsIntegrationAccountSchemaResponseExampleSecrets: + additionalProperties: false + description: Example secrets object for a Twilio integration account schema response. + properties: + api_key_token: + description: "The Twilio API Key Secret corresponding to the API Key SID." + example: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + minLength: 1 + type: "string" + required: + - api_key_token + type: "object" + AmsIntegrationAccountSchemaResponseExampleSettings: + additionalProperties: false + description: Example settings object for a Twilio integration account schema response. + properties: + account_sid: + description: "Twilio Account SID that uniquely identifies your Twilio account, found in your account info in the Twilio console." + example: "ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + minLength: 1 + type: "string" + alerts: + default: false + description: "Enable collection of Twilio Alert logs to monitor account alerts and notifications." + type: "boolean" + api_key: + description: "Twilio API Key SID for authentication. Create this API key in the Twilio console." + example: "SKxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + minLength: 1 + type: "string" + call_summaries: + default: false + description: "Enable collection of Twilio Voice call summaries to track voice call performance and metadata." + type: "boolean" + ccm_enabled: + default: false + description: "Enable Cloud Cost Management to monitor Twilio usage costs and identify optimization opportunities." + type: "boolean" + censor_logs: + default: false + description: "Enable censoring of sensitive data in logs. When true, phone numbers and SMS message bodies are censored for privacy." + type: "boolean" + events: + default: false + description: "Enable collection of Twilio Event logs to monitor account-level events and activities." + type: "boolean" + messages: + default: false + description: "Enable collection of Twilio Message logs to track SMS and messaging activity." + type: "boolean" + required: + - api_key + - account_sid + type: "object" + AmsIntegrationAccountSchemaResponseProperties: + description: |- + The properties object containing settings and secrets schema definitions. + Both are always present in every integration schema, but the fields within each + vary depending on the specific integration. + properties: + secrets: + $ref: "#/components/schemas/AmsIntegrationAccountSchemaResponseSecretsObject" + settings: + $ref: "#/components/schemas/AmsIntegrationAccountSchemaResponseSettingsObject" + required: + - settings + - secrets + type: object + AmsIntegrationAccountSchemaResponseSecretsObject: + description: |- + JSON Schema definition for the secrets object. + Contains sensitive credentials required for the integration such as API keys, + tokens, and passwords. These values are write-only and never returned in responses. + properties: + additionalProperties: + description: Whether additional properties are allowed (typically false). + example: false + type: boolean + properties: + additionalProperties: + $ref: "#/components/schemas/AmsIntegrationAccountSchemaResponseSettingsField" + description: |- + The individual secret fields for this integration. + Field names and types vary by integration. + type: object + required: + description: List of required secret field names. + items: + type: string + type: array + type: + description: Always "object" for the secrets container. + example: "object" + type: string + type: object + AmsIntegrationAccountSchemaResponseSettingsField: + description: |- + JSON Schema definition for a single field within settings or secrets. + The exact fields vary by integration. + properties: + additionalProperties: + description: Whether additional properties are allowed for this field. + example: false + type: boolean + default: + description: Default value for the field if not provided. + description: + description: Human-readable description of the field's purpose. + example: "API key for authentication" + type: string + items: + description: Schema for array items when type is "array". + type: object + minLength: + description: Minimum length for string fields. + example: 1 + format: int64 + type: integer + type: + description: The data type of the field (string, boolean, integer, array, object). + example: "string" + type: string + type: object + AmsIntegrationAccountSchemaResponseSettingsObject: + description: |- + JSON Schema definition for the settings object. + Contains integration-specific configuration fields such as account identifiers, + feature toggles, and non-sensitive configuration options. + properties: + additionalProperties: + description: Whether additional properties are allowed (typically false). + example: false + type: boolean + properties: + additionalProperties: + $ref: "#/components/schemas/AmsIntegrationAccountSchemaResponseSettingsField" + description: |- + The individual setting fields for this integration. + Field names and types vary by integration. + type: object + required: + description: List of required setting field names. + items: + type: string + type: array + type: + description: Always "object" for the settings container. + example: "object" + type: string + type: object + AmsIntegrationAccountType: + default: Account + description: The JSON:API type for web integration accounts. + enum: + - Account + example: Account + type: string + x-enum-varnames: + - ACCOUNT + AmsIntegrationAccountUpdateRequest: + description: Payload for updating a web integration account. + properties: + data: + $ref: "#/components/schemas/AmsIntegrationAccountUpdateRequestData" + required: + - data + type: object + AmsIntegrationAccountUpdateRequestAttributes: + description: |- + Attributes for updating a web integration account. All fields are optional; + only provide the fields you want to update. + properties: + name: + description: The name of the account. + example: "My Production Account (Updated)" + type: string + secrets: + additionalProperties: {} + description: |- + Sensitive credentials to update. Only the secrets provided are updated. + These values are write-only and never returned in responses. + example: + api_key_token: "new_secret_token_value" + type: object + settings: + additionalProperties: {} + description: |- + Integration-specific settings to update. Only the fields provided are updated. + The structure varies by integration type. See the integration's schema for available fields. + example: + ccm_enabled: true + events: true + messages: false + type: object + type: object + AmsIntegrationAccountUpdateRequestData: + description: Data object for updating a web integration account. + properties: + attributes: + $ref: "#/components/schemas/AmsIntegrationAccountUpdateRequestAttributes" + type: + $ref: "#/components/schemas/AmsIntegrationAccountType" + required: + - type + type: object + AmsIntegrationAccountsResponse: + description: Response containing a list of web integration accounts. + properties: + data: + items: + $ref: "#/components/schemas/AmsIntegrationAccountResponseData" + type: array + integration_name: + description: The name of the integration. + example: "twilio" + type: string + type: object AnalysisEdit: description: A single edit operation within a fix suggestion for a rule violation. properties: @@ -77612,6 +78352,48 @@ components: page: $ref: "#/components/schemas/Pagination" type: object + ResponseSchema: + additionalProperties: false + description: Example JSON Schema document for an integration account configuration. + properties: + secrets: + $ref: "#/components/schemas/ResponseSchema139714313396896" + settings: + $ref: "#/components/schemas/ResponseSchema139714313396096" + required: + - settings + - secrets + type: "object" + ResponseSchema139714313396096: + additionalProperties: false + description: Example settings schema for an integration account configuration. + properties: + account_sid: + description: Twilio Account SID that uniquely identifies the Twilio account. + example: L + minLength: 1 + type: "string" + api_key: + description: Twilio API Key SID for authentication. + example: L + minLength: 1 + type: "string" + required: + - api_key + - account_sid + type: "object" + ResponseSchema139714313396896: + additionalProperties: false + description: Example secrets schema for an integration account configuration. + properties: + api_key_token: + description: The Twilio API Key Secret corresponding to the API Key SID. + example: L + minLength: 1 + type: "string" + required: + - api_key_token + type: "object" RestrictionPolicy: description: Restriction policy object. properties: @@ -143102,6 +143884,388 @@ paths: operator: OR permissions: - manage_integrations + /api/v2/integrations/{integration_name}/interfaces/{interface_id}/accounts: + get: + description: |- + Retrieve all configured accounts for a specific integration within your organization. + + Rate limit: 50 requests per user every 20 seconds. + operationId: ListAmsIntegrationAccounts + parameters: + - description: The name of the integration. + example: "twilio" + in: path + name: integration_name + required: true + schema: + type: string + - description: The unique identifier of the interface. + example: "twilio.messaging" + in: path + name: interface_id + required: true + schema: + type: string + responses: + "200": + content: + application/json: + examples: + default: + value: + data: + - attributes: + name: "My Production Account" + settings: + account_sid: "ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + api_key: "SKxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + id: "abc123def456" + type: "Account" + schema: + $ref: "#/components/schemas/AmsIntegrationAccountsResponse" + description: "OK: List of all accounts for the specified integration." + "400": + $ref: "#/components/responses/WebIntegrationListAccountsBadRequestResponse" + "403": + $ref: "#/components/responses/WebIntegrationListAccountsForbiddenResponse" + "404": + $ref: "#/components/responses/WebIntegrationListAccountsNotFoundResponse" + "429": + $ref: "#/components/responses/WebIntegrationListAccountsTooManyRequestsResponse" + summary: List integration accounts + tags: + - Integration Accounts + x-permission: + operator: OR + permissions: + - integrations_read + post: + description: |- + Create a new account for a specific integration. The account configuration must conform + to the schema defined for the integration, which can be retrieved using the schema endpoint. + + Rate limit: 50 requests per user every 20 seconds. + operationId: CreateAmsIntegrationAccount + parameters: + - description: The name of the integration. + example: "twilio" + in: path + name: integration_name + required: true + schema: + type: string + - description: The unique identifier of the interface. + example: "twilio.messaging" + in: path + name: interface_id + required: true + schema: + type: string + requestBody: + content: + application/json: + examples: + default: + value: + data: + attributes: + name: "My Production Account" + secrets: + api_key_token: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + settings: + account_sid: "ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + alerts: true + api_key: "SKxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + call_summaries: true + ccm_enabled: true + censor_logs: true + events: true + messages: true + type: "Account" + schema: + $ref: "#/components/schemas/AmsIntegrationAccountCreateRequest" + required: true + responses: + "201": + content: + application/json: + examples: + default: + value: + data: + attributes: + name: "My Production Account" + settings: + account_sid: "ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + api_key: "SKxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + id: "abc123def456" + type: "Account" + schema: + $ref: "#/components/schemas/AmsIntegrationAccountResponse" + description: "Created: The account was successfully created." + "400": + $ref: "#/components/responses/WebIntegrationCreateAccountBadRequestResponse" + "403": + $ref: "#/components/responses/WebIntegrationCreateAccountForbiddenResponse" + "404": + $ref: "#/components/responses/WebIntegrationCreateAccountNotFoundResponse" + "422": + $ref: "#/components/responses/WebIntegrationCreateAccountUnprocessableEntityResponse" + "429": + $ref: "#/components/responses/WebIntegrationCreateAccountTooManyRequestsResponse" + summary: Create integration account + tags: + - Integration Accounts + x-codegen-request-body-name: body + x-permission: + operator: OR + permissions: + - manage_integrations + /api/v2/integrations/{integration_name}/interfaces/{interface_id}/accounts/schema: + get: + description: |- + Get the JSON schema that defines the structure and validation rules for account configuration + of a specific integration. This schema describes the required and optional fields for both + **settings** and **secrets** when creating or updating an account. + + The schema structure varies between integrations, so always retrieve the schema for your + specific integration before creating or updating accounts. + + Rate limit: 12000 requests per organization every 60 seconds. + operationId: GetAmsIntegrationAccountSchema + parameters: + - description: The name of the integration. + example: "twilio" + in: path + name: integration_name + required: true + schema: + type: string + - description: The unique identifier of the interface. + example: "twilio.messaging" + in: path + name: interface_id + required: true + schema: + type: string + responses: + "200": + content: + application/json: + examples: + default: + value: + $ref: "#/components/schemas/ResponseSchema" + schema: + $ref: "#/components/schemas/AmsIntegrationAccountSchemaResponse" + description: "OK: The JSON schema for the integration's account configuration." + "400": + $ref: "#/components/responses/AmsIntegrationAccountSchemaBadRequestResponse" + "403": + $ref: "#/components/responses/AmsIntegrationAccountSchemaForbiddenResponse" + "404": + $ref: "#/components/responses/AmsIntegrationAccountSchemaNotFoundResponse" + "429": + $ref: "#/components/responses/AmsIntegrationAccountSchemaTooManyRequestsResponse" + summary: Get account schema for an integration + tags: + - Integration Accounts + x-permission: + operator: OR + permissions: + - integrations_read + /api/v2/integrations/{integration_name}/interfaces/{interface_id}/accounts/{account_id}: + delete: + description: |- + Delete a specific account by its ID for a given integration. This removes the + account configuration and stops any data collection associated with it. + + Rate limit: 50 requests per user every 20 seconds. + operationId: DeleteAmsIntegrationAccount + parameters: + - description: The name of the integration. + example: "twilio" + in: path + name: integration_name + required: true + schema: + type: string + - description: The unique identifier of the interface. + example: "twilio.messaging" + in: path + name: interface_id + required: true + schema: + type: string + - description: The unique identifier of the account. + example: "abc123def456" + in: path + name: account_id + required: true + schema: + type: string + responses: + "200": + description: "OK: The account was successfully deleted." + "400": + $ref: "#/components/responses/WebIntegrationDeleteAccountBadRequestResponse" + "403": + $ref: "#/components/responses/WebIntegrationDeleteAccountForbiddenResponse" + "404": + $ref: "#/components/responses/WebIntegrationDeleteAccountNotFoundResponse" + "429": + $ref: "#/components/responses/WebIntegrationDeleteAccountTooManyRequestsResponse" + summary: Delete integration account + tags: + - Integration Accounts + x-permission: + operator: OR + permissions: + - manage_integrations + get: + description: |- + Retrieve a specific account by its ID for a given integration. The response includes + the account name and settings, but excludes sensitive secret values. + + Rate limit: 12000 requests per organization every 60 seconds. + operationId: GetAmsIntegrationAccount + parameters: + - description: The name of the integration. + example: "twilio" + in: path + name: integration_name + required: true + schema: + type: string + - description: The unique identifier of the interface. + example: "twilio.messaging" + in: path + name: interface_id + required: true + schema: + type: string + - description: The unique identifier of the account. + example: "abc123def456" + in: path + name: account_id + required: true + schema: + type: string + responses: + "200": + content: + application/json: + examples: + default: + value: + data: + attributes: + name: "My Production Account" + settings: + account_sid: "ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + api_key: "SKxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + id: "abc123def456" + type: "Account" + schema: + $ref: "#/components/schemas/AmsIntegrationAccountResponse" + description: "OK: The account details for the specified integration." + "400": + $ref: "#/components/responses/WebIntegrationGetAccountBadRequestResponse" + "403": + $ref: "#/components/responses/WebIntegrationGetAccountForbiddenResponse" + "404": + $ref: "#/components/responses/WebIntegrationGetAccountNotFoundResponse" + "429": + $ref: "#/components/responses/WebIntegrationGetAccountTooManyRequestsResponse" + summary: Get integration account + tags: + - Integration Accounts + x-permission: + operator: OR + permissions: + - integrations_read + patch: + description: |- + Update an existing account for a specific integration. You can update the name, settings, + and secrets. Only the fields provided in the request are updated. + + Rate limit: 50 requests per user every 20 seconds. + operationId: UpdateAmsIntegrationAccount + parameters: + - description: The name of the integration. + example: "twilio" + in: path + name: integration_name + required: true + schema: + type: string + - description: The unique identifier of the interface. + example: "twilio.messaging" + in: path + name: interface_id + required: true + schema: + type: string + - description: The unique identifier of the account. + example: "abc123def456" + in: path + name: account_id + required: true + schema: + type: string + requestBody: + content: + application/json: + examples: + default: + value: + data: + attributes: + name: "My Production Account (Updated)" + settings: + ccm_enabled: true + events: true + messages: false + type: "Account" + schema: + $ref: "#/components/schemas/AmsIntegrationAccountUpdateRequest" + required: true + responses: + "200": + content: + application/json: + examples: + default: + value: + data: + attributes: + name: "My Production Account (Updated)" + settings: + account_sid: "ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + api_key: "SKxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + id: "abc123def456" + type: "Account" + schema: + $ref: "#/components/schemas/AmsIntegrationAccountResponse" + description: "OK: The account was successfully updated." + "400": + $ref: "#/components/responses/WebIntegrationUpdateAccountBadRequestResponse" + "403": + $ref: "#/components/responses/WebIntegrationUpdateAccountForbiddenResponse" + "404": + $ref: "#/components/responses/WebIntegrationUpdateAccountNotFoundResponse" + "422": + $ref: "#/components/responses/WebIntegrationUpdateAccountUnprocessableEntityResponse" + "429": + $ref: "#/components/responses/WebIntegrationUpdateAccountTooManyRequestsResponse" + summary: Update integration account + tags: + - Integration Accounts + x-codegen-request-body-name: body + x-permission: + operator: OR + permissions: + - manage_integrations /api/v2/ip_allowlist: get: description: Returns the IP allowlist and its enabled or disabled state. @@ -193632,6 +194796,24 @@ tags: name: IP Allowlist - description: Manage incident response, as well as associated attachments, metadata, and todos. See the [Incident Management page](https://docs.datadoghq.com/service_management/incident_management/) for more information. name: Incidents + - description: |- + Configure and manage third-party integrations with Datadog. This API provides a unified + interface for managing integration accounts across various external services. + + Each integration has its own unique schema that defines the required settings and secrets. + Before creating or updating an account, use the schema endpoint to retrieve the specific + requirements, field types, validation rules, and available configuration options for your + integration. + + **Note**: This API manages integration account configurations only. It does not support + Grace Resources, Reference Tables, or Custom Queries CRUD operations. For those features, + refer to each integration's dedicated documentation. + + Supported Integrations: + - [Twilio](https://docs.datadoghq.com/integrations/twilio/) + - [Snowflake](https://docs.datadoghq.com/integrations/snowflake-web/) + - [Databricks](https://docs.datadoghq.com/integrations/databricks/) + name: Integration Accounts - description: |- The Integrations API is used to list available integrations and retrieve information about their installation status. diff --git a/docs/datadog_api_client.v2.api.rst b/docs/datadog_api_client.v2.api.rst index 972863d62b..3875ec0cff 100644 --- a/docs/datadog_api_client.v2.api.rst +++ b/docs/datadog_api_client.v2.api.rst @@ -424,6 +424,13 @@ datadog\_api\_client.v2.api.incidents\_api module :members: :show-inheritance: +datadog\_api\_client.v2.api.integration\_accounts\_api module +------------------------------------------------------------- + +.. automodule:: datadog_api_client.v2.api.integration_accounts_api + :members: + :show-inheritance: + datadog\_api\_client.v2.api.integrations\_api module ---------------------------------------------------- diff --git a/docs/datadog_api_client.v2.model.rst b/docs/datadog_api_client.v2.model.rst index 14023429c7..58fa2a7f37 100644 --- a/docs/datadog_api_client.v2.model.rst +++ b/docs/datadog_api_client.v2.model.rst @@ -914,6 +914,118 @@ datadog\_api\_client.v2.model.allocation\_type module :members: :show-inheritance: +datadog\_api\_client.v2.model.ams\_integration\_account\_attributes module +-------------------------------------------------------------------------- + +.. automodule:: datadog_api_client.v2.model.ams_integration_account_attributes + :members: + :show-inheritance: + +datadog\_api\_client.v2.model.ams\_integration\_account\_create\_request module +------------------------------------------------------------------------------- + +.. automodule:: datadog_api_client.v2.model.ams_integration_account_create_request + :members: + :show-inheritance: + +datadog\_api\_client.v2.model.ams\_integration\_account\_create\_request\_attributes module +------------------------------------------------------------------------------------------- + +.. automodule:: datadog_api_client.v2.model.ams_integration_account_create_request_attributes + :members: + :show-inheritance: + +datadog\_api\_client.v2.model.ams\_integration\_account\_create\_request\_data module +------------------------------------------------------------------------------------- + +.. automodule:: datadog_api_client.v2.model.ams_integration_account_create_request_data + :members: + :show-inheritance: + +datadog\_api\_client.v2.model.ams\_integration\_account\_response module +------------------------------------------------------------------------ + +.. automodule:: datadog_api_client.v2.model.ams_integration_account_response + :members: + :show-inheritance: + +datadog\_api\_client.v2.model.ams\_integration\_account\_response\_data module +------------------------------------------------------------------------------ + +.. automodule:: datadog_api_client.v2.model.ams_integration_account_response_data + :members: + :show-inheritance: + +datadog\_api\_client.v2.model.ams\_integration\_account\_schema\_response module +-------------------------------------------------------------------------------- + +.. automodule:: datadog_api_client.v2.model.ams_integration_account_schema_response + :members: + :show-inheritance: + +datadog\_api\_client.v2.model.ams\_integration\_account\_schema\_response\_properties module +-------------------------------------------------------------------------------------------- + +.. automodule:: datadog_api_client.v2.model.ams_integration_account_schema_response_properties + :members: + :show-inheritance: + +datadog\_api\_client.v2.model.ams\_integration\_account\_schema\_response\_secrets\_object module +------------------------------------------------------------------------------------------------- + +.. automodule:: datadog_api_client.v2.model.ams_integration_account_schema_response_secrets_object + :members: + :show-inheritance: + +datadog\_api\_client.v2.model.ams\_integration\_account\_schema\_response\_settings\_field module +------------------------------------------------------------------------------------------------- + +.. automodule:: datadog_api_client.v2.model.ams_integration_account_schema_response_settings_field + :members: + :show-inheritance: + +datadog\_api\_client.v2.model.ams\_integration\_account\_schema\_response\_settings\_object module +-------------------------------------------------------------------------------------------------- + +.. automodule:: datadog_api_client.v2.model.ams_integration_account_schema_response_settings_object + :members: + :show-inheritance: + +datadog\_api\_client.v2.model.ams\_integration\_account\_type module +-------------------------------------------------------------------- + +.. automodule:: datadog_api_client.v2.model.ams_integration_account_type + :members: + :show-inheritance: + +datadog\_api\_client.v2.model.ams\_integration\_account\_update\_request module +------------------------------------------------------------------------------- + +.. automodule:: datadog_api_client.v2.model.ams_integration_account_update_request + :members: + :show-inheritance: + +datadog\_api\_client.v2.model.ams\_integration\_account\_update\_request\_attributes module +------------------------------------------------------------------------------------------- + +.. automodule:: datadog_api_client.v2.model.ams_integration_account_update_request_attributes + :members: + :show-inheritance: + +datadog\_api\_client.v2.model.ams\_integration\_account\_update\_request\_data module +------------------------------------------------------------------------------------- + +.. automodule:: datadog_api_client.v2.model.ams_integration_account_update_request_data + :members: + :show-inheritance: + +datadog\_api\_client.v2.model.ams\_integration\_accounts\_response module +------------------------------------------------------------------------- + +.. automodule:: datadog_api_client.v2.model.ams_integration_accounts_response + :members: + :show-inheritance: + datadog\_api\_client.v2.model.analysis\_edit module --------------------------------------------------- diff --git a/examples/v2/integration-accounts/CreateAmsIntegrationAccount.py b/examples/v2/integration-accounts/CreateAmsIntegrationAccount.py new file mode 100644 index 0000000000..a414582232 --- /dev/null +++ b/examples/v2/integration-accounts/CreateAmsIntegrationAccount.py @@ -0,0 +1,45 @@ +""" +Create integration account returns "Created: The account was successfully created." response +""" + +from datadog_api_client import ApiClient, Configuration +from datadog_api_client.v2.api.integration_accounts_api import IntegrationAccountsApi +from datadog_api_client.v2.model.ams_integration_account_create_request import AmsIntegrationAccountCreateRequest +from datadog_api_client.v2.model.ams_integration_account_create_request_attributes import ( + AmsIntegrationAccountCreateRequestAttributes, +) +from datadog_api_client.v2.model.ams_integration_account_create_request_data import ( + AmsIntegrationAccountCreateRequestData, +) +from datadog_api_client.v2.model.ams_integration_account_type import AmsIntegrationAccountType + +body = AmsIntegrationAccountCreateRequest( + data=AmsIntegrationAccountCreateRequestData( + attributes=AmsIntegrationAccountCreateRequestAttributes( + name="My Production Account", + secrets=dict([("api_key_token", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")]), + settings=dict( + [ + ("account_sid", "ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"), + ("alerts", "True"), + ("api_key", "SKxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"), + ("call_summaries", "True"), + ("ccm_enabled", "True"), + ("censor_logs", "True"), + ("events", "True"), + ("messages", "True"), + ] + ), + ), + type=AmsIntegrationAccountType.ACCOUNT, + ), +) + +configuration = Configuration() +with ApiClient(configuration) as api_client: + api_instance = IntegrationAccountsApi(api_client) + response = api_instance.create_ams_integration_account( + integration_name="integration_name", interface_id="interface_id", body=body + ) + + print(response) diff --git a/examples/v2/integration-accounts/DeleteAmsIntegrationAccount.py b/examples/v2/integration-accounts/DeleteAmsIntegrationAccount.py new file mode 100644 index 0000000000..2e35b39472 --- /dev/null +++ b/examples/v2/integration-accounts/DeleteAmsIntegrationAccount.py @@ -0,0 +1,15 @@ +""" +Delete integration account returns "OK: The account was successfully deleted." response +""" + +from datadog_api_client import ApiClient, Configuration +from datadog_api_client.v2.api.integration_accounts_api import IntegrationAccountsApi + +configuration = Configuration() +with ApiClient(configuration) as api_client: + api_instance = IntegrationAccountsApi(api_client) + api_instance.delete_ams_integration_account( + integration_name="integration_name", + interface_id="interface_id", + account_id="account_id", + ) diff --git a/examples/v2/integration-accounts/GetAmsIntegrationAccount.py b/examples/v2/integration-accounts/GetAmsIntegrationAccount.py new file mode 100644 index 0000000000..d3eb76a4a6 --- /dev/null +++ b/examples/v2/integration-accounts/GetAmsIntegrationAccount.py @@ -0,0 +1,17 @@ +""" +Get integration account returns "OK: The account details for the specified integration." response +""" + +from datadog_api_client import ApiClient, Configuration +from datadog_api_client.v2.api.integration_accounts_api import IntegrationAccountsApi + +configuration = Configuration() +with ApiClient(configuration) as api_client: + api_instance = IntegrationAccountsApi(api_client) + response = api_instance.get_ams_integration_account( + integration_name="integration_name", + interface_id="interface_id", + account_id="account_id", + ) + + print(response) diff --git a/examples/v2/integration-accounts/GetAmsIntegrationAccountSchema.py b/examples/v2/integration-accounts/GetAmsIntegrationAccountSchema.py new file mode 100644 index 0000000000..77fd53966c --- /dev/null +++ b/examples/v2/integration-accounts/GetAmsIntegrationAccountSchema.py @@ -0,0 +1,17 @@ +""" +Get account schema for an integration returns "OK: The JSON schema for the integration's account configuration." +response +""" + +from datadog_api_client import ApiClient, Configuration +from datadog_api_client.v2.api.integration_accounts_api import IntegrationAccountsApi + +configuration = Configuration() +with ApiClient(configuration) as api_client: + api_instance = IntegrationAccountsApi(api_client) + response = api_instance.get_ams_integration_account_schema( + integration_name="integration_name", + interface_id="interface_id", + ) + + print(response) diff --git a/examples/v2/integration-accounts/ListAmsIntegrationAccounts.py b/examples/v2/integration-accounts/ListAmsIntegrationAccounts.py new file mode 100644 index 0000000000..69d0bccfe9 --- /dev/null +++ b/examples/v2/integration-accounts/ListAmsIntegrationAccounts.py @@ -0,0 +1,16 @@ +""" +List integration accounts returns "OK: List of all accounts for the specified integration." response +""" + +from datadog_api_client import ApiClient, Configuration +from datadog_api_client.v2.api.integration_accounts_api import IntegrationAccountsApi + +configuration = Configuration() +with ApiClient(configuration) as api_client: + api_instance = IntegrationAccountsApi(api_client) + response = api_instance.list_ams_integration_accounts( + integration_name="integration_name", + interface_id="interface_id", + ) + + print(response) diff --git a/examples/v2/integration-accounts/UpdateAmsIntegrationAccount.py b/examples/v2/integration-accounts/UpdateAmsIntegrationAccount.py new file mode 100644 index 0000000000..b0651d88d0 --- /dev/null +++ b/examples/v2/integration-accounts/UpdateAmsIntegrationAccount.py @@ -0,0 +1,34 @@ +""" +Update integration account returns "OK: The account was successfully updated." response +""" + +from datadog_api_client import ApiClient, Configuration +from datadog_api_client.v2.api.integration_accounts_api import IntegrationAccountsApi +from datadog_api_client.v2.model.ams_integration_account_type import AmsIntegrationAccountType +from datadog_api_client.v2.model.ams_integration_account_update_request import AmsIntegrationAccountUpdateRequest +from datadog_api_client.v2.model.ams_integration_account_update_request_attributes import ( + AmsIntegrationAccountUpdateRequestAttributes, +) +from datadog_api_client.v2.model.ams_integration_account_update_request_data import ( + AmsIntegrationAccountUpdateRequestData, +) + +body = AmsIntegrationAccountUpdateRequest( + data=AmsIntegrationAccountUpdateRequestData( + attributes=AmsIntegrationAccountUpdateRequestAttributes( + name="My Production Account (Updated)", + secrets=dict([("api_key_token", "new_secret_token_value")]), + settings=dict([("ccm_enabled", "True"), ("events", "True"), ("messages", "False")]), + ), + type=AmsIntegrationAccountType.ACCOUNT, + ), +) + +configuration = Configuration() +with ApiClient(configuration) as api_client: + api_instance = IntegrationAccountsApi(api_client) + response = api_instance.update_ams_integration_account( + integration_name="integration_name", interface_id="interface_id", account_id="account_id", body=body + ) + + print(response) diff --git a/src/datadog_api_client/v2/api/integration_accounts_api.py b/src/datadog_api_client/v2/api/integration_accounts_api.py new file mode 100644 index 0000000000..8e5b28b96a --- /dev/null +++ b/src/datadog_api_client/v2/api/integration_accounts_api.py @@ -0,0 +1,415 @@ +# Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019-Present Datadog, Inc. +from __future__ import annotations + +from typing import Any, Dict + +from datadog_api_client.api_client import ApiClient, Endpoint as _Endpoint +from datadog_api_client.configuration import Configuration +from datadog_api_client.v2.model.ams_integration_accounts_response import AmsIntegrationAccountsResponse +from datadog_api_client.v2.model.ams_integration_account_response import AmsIntegrationAccountResponse +from datadog_api_client.v2.model.ams_integration_account_create_request import AmsIntegrationAccountCreateRequest +from datadog_api_client.v2.model.ams_integration_account_schema_response import AmsIntegrationAccountSchemaResponse +from datadog_api_client.v2.model.ams_integration_account_update_request import AmsIntegrationAccountUpdateRequest + + +class IntegrationAccountsApi: + """ + Configure and manage third-party integrations with Datadog. This API provides a unified + interface for managing integration accounts across various external services. + + Each integration has its own unique schema that defines the required settings and secrets. + Before creating or updating an account, use the schema endpoint to retrieve the specific + requirements, field types, validation rules, and available configuration options for your + integration. + + **Note** : This API manages integration account configurations only. It does not support + Grace Resources, Reference Tables, or Custom Queries CRUD operations. For those features, + refer to each integration's dedicated documentation. + + Supported Integrations: + + * `Twilio `_ + * `Snowflake `_ + * `Databricks `_ + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient(Configuration()) + self.api_client = api_client + + self._create_ams_integration_account_endpoint = _Endpoint( + settings={ + "response_type": (AmsIntegrationAccountResponse,), + "auth": ["apiKeyAuth", "appKeyAuth"], + "endpoint_path": "/api/v2/integrations/{integration_name}/interfaces/{interface_id}/accounts", + "operation_id": "create_ams_integration_account", + "http_method": "POST", + "version": "v2", + }, + params_map={ + "integration_name": { + "required": True, + "openapi_types": (str,), + "attribute": "integration_name", + "location": "path", + }, + "interface_id": { + "required": True, + "openapi_types": (str,), + "attribute": "interface_id", + "location": "path", + }, + "body": { + "required": True, + "openapi_types": (AmsIntegrationAccountCreateRequest,), + "location": "body", + }, + }, + headers_map={"accept": ["application/json"], "content_type": ["application/json"]}, + api_client=api_client, + ) + + self._delete_ams_integration_account_endpoint = _Endpoint( + settings={ + "response_type": None, + "auth": ["apiKeyAuth", "appKeyAuth"], + "endpoint_path": "/api/v2/integrations/{integration_name}/interfaces/{interface_id}/accounts/{account_id}", + "operation_id": "delete_ams_integration_account", + "http_method": "DELETE", + "version": "v2", + }, + params_map={ + "integration_name": { + "required": True, + "openapi_types": (str,), + "attribute": "integration_name", + "location": "path", + }, + "interface_id": { + "required": True, + "openapi_types": (str,), + "attribute": "interface_id", + "location": "path", + }, + "account_id": { + "required": True, + "openapi_types": (str,), + "attribute": "account_id", + "location": "path", + }, + }, + headers_map={ + "accept": ["*/*"], + }, + api_client=api_client, + ) + + self._get_ams_integration_account_endpoint = _Endpoint( + settings={ + "response_type": (AmsIntegrationAccountResponse,), + "auth": ["apiKeyAuth", "appKeyAuth"], + "endpoint_path": "/api/v2/integrations/{integration_name}/interfaces/{interface_id}/accounts/{account_id}", + "operation_id": "get_ams_integration_account", + "http_method": "GET", + "version": "v2", + }, + params_map={ + "integration_name": { + "required": True, + "openapi_types": (str,), + "attribute": "integration_name", + "location": "path", + }, + "interface_id": { + "required": True, + "openapi_types": (str,), + "attribute": "interface_id", + "location": "path", + }, + "account_id": { + "required": True, + "openapi_types": (str,), + "attribute": "account_id", + "location": "path", + }, + }, + headers_map={ + "accept": ["application/json"], + }, + api_client=api_client, + ) + + self._get_ams_integration_account_schema_endpoint = _Endpoint( + settings={ + "response_type": (AmsIntegrationAccountSchemaResponse,), + "auth": ["apiKeyAuth", "appKeyAuth"], + "endpoint_path": "/api/v2/integrations/{integration_name}/interfaces/{interface_id}/accounts/schema", + "operation_id": "get_ams_integration_account_schema", + "http_method": "GET", + "version": "v2", + }, + params_map={ + "integration_name": { + "required": True, + "openapi_types": (str,), + "attribute": "integration_name", + "location": "path", + }, + "interface_id": { + "required": True, + "openapi_types": (str,), + "attribute": "interface_id", + "location": "path", + }, + }, + headers_map={ + "accept": ["application/json"], + }, + api_client=api_client, + ) + + self._list_ams_integration_accounts_endpoint = _Endpoint( + settings={ + "response_type": (AmsIntegrationAccountsResponse,), + "auth": ["apiKeyAuth", "appKeyAuth"], + "endpoint_path": "/api/v2/integrations/{integration_name}/interfaces/{interface_id}/accounts", + "operation_id": "list_ams_integration_accounts", + "http_method": "GET", + "version": "v2", + }, + params_map={ + "integration_name": { + "required": True, + "openapi_types": (str,), + "attribute": "integration_name", + "location": "path", + }, + "interface_id": { + "required": True, + "openapi_types": (str,), + "attribute": "interface_id", + "location": "path", + }, + }, + headers_map={ + "accept": ["application/json"], + }, + api_client=api_client, + ) + + self._update_ams_integration_account_endpoint = _Endpoint( + settings={ + "response_type": (AmsIntegrationAccountResponse,), + "auth": ["apiKeyAuth", "appKeyAuth"], + "endpoint_path": "/api/v2/integrations/{integration_name}/interfaces/{interface_id}/accounts/{account_id}", + "operation_id": "update_ams_integration_account", + "http_method": "PATCH", + "version": "v2", + }, + params_map={ + "integration_name": { + "required": True, + "openapi_types": (str,), + "attribute": "integration_name", + "location": "path", + }, + "interface_id": { + "required": True, + "openapi_types": (str,), + "attribute": "interface_id", + "location": "path", + }, + "account_id": { + "required": True, + "openapi_types": (str,), + "attribute": "account_id", + "location": "path", + }, + "body": { + "required": True, + "openapi_types": (AmsIntegrationAccountUpdateRequest,), + "location": "body", + }, + }, + headers_map={"accept": ["application/json"], "content_type": ["application/json"]}, + api_client=api_client, + ) + + def create_ams_integration_account( + self, + integration_name: str, + interface_id: str, + body: AmsIntegrationAccountCreateRequest, + ) -> AmsIntegrationAccountResponse: + """Create integration account. + + Create a new account for a specific integration. The account configuration must conform + to the schema defined for the integration, which can be retrieved using the schema endpoint. + + Rate limit: 50 requests per user every 20 seconds. + + :param integration_name: The name of the integration. + :type integration_name: str + :param interface_id: The unique identifier of the interface. + :type interface_id: str + :type body: AmsIntegrationAccountCreateRequest + :rtype: AmsIntegrationAccountResponse + """ + kwargs: Dict[str, Any] = {} + kwargs["integration_name"] = integration_name + + kwargs["interface_id"] = interface_id + + kwargs["body"] = body + + return self._create_ams_integration_account_endpoint.call_with_http_info(**kwargs) + + def delete_ams_integration_account( + self, + integration_name: str, + interface_id: str, + account_id: str, + ) -> None: + """Delete integration account. + + Delete a specific account by its ID for a given integration. This removes the + account configuration and stops any data collection associated with it. + + Rate limit: 50 requests per user every 20 seconds. + + :param integration_name: The name of the integration. + :type integration_name: str + :param interface_id: The unique identifier of the interface. + :type interface_id: str + :param account_id: The unique identifier of the account. + :type account_id: str + :rtype: None + """ + kwargs: Dict[str, Any] = {} + kwargs["integration_name"] = integration_name + + kwargs["interface_id"] = interface_id + + kwargs["account_id"] = account_id + + return self._delete_ams_integration_account_endpoint.call_with_http_info(**kwargs) + + def get_ams_integration_account( + self, + integration_name: str, + interface_id: str, + account_id: str, + ) -> AmsIntegrationAccountResponse: + """Get integration account. + + Retrieve a specific account by its ID for a given integration. The response includes + the account name and settings, but excludes sensitive secret values. + + Rate limit: 12000 requests per organization every 60 seconds. + + :param integration_name: The name of the integration. + :type integration_name: str + :param interface_id: The unique identifier of the interface. + :type interface_id: str + :param account_id: The unique identifier of the account. + :type account_id: str + :rtype: AmsIntegrationAccountResponse + """ + kwargs: Dict[str, Any] = {} + kwargs["integration_name"] = integration_name + + kwargs["interface_id"] = interface_id + + kwargs["account_id"] = account_id + + return self._get_ams_integration_account_endpoint.call_with_http_info(**kwargs) + + def get_ams_integration_account_schema( + self, + integration_name: str, + interface_id: str, + ) -> AmsIntegrationAccountSchemaResponse: + """Get account schema for an integration. + + Get the JSON schema that defines the structure and validation rules for account configuration + of a specific integration. This schema describes the required and optional fields for both + **settings** and **secrets** when creating or updating an account. + + The schema structure varies between integrations, so always retrieve the schema for your + specific integration before creating or updating accounts. + + Rate limit: 12000 requests per organization every 60 seconds. + + :param integration_name: The name of the integration. + :type integration_name: str + :param interface_id: The unique identifier of the interface. + :type interface_id: str + :rtype: AmsIntegrationAccountSchemaResponse + """ + kwargs: Dict[str, Any] = {} + kwargs["integration_name"] = integration_name + + kwargs["interface_id"] = interface_id + + return self._get_ams_integration_account_schema_endpoint.call_with_http_info(**kwargs) + + def list_ams_integration_accounts( + self, + integration_name: str, + interface_id: str, + ) -> AmsIntegrationAccountsResponse: + """List integration accounts. + + Retrieve all configured accounts for a specific integration within your organization. + + Rate limit: 50 requests per user every 20 seconds. + + :param integration_name: The name of the integration. + :type integration_name: str + :param interface_id: The unique identifier of the interface. + :type interface_id: str + :rtype: AmsIntegrationAccountsResponse + """ + kwargs: Dict[str, Any] = {} + kwargs["integration_name"] = integration_name + + kwargs["interface_id"] = interface_id + + return self._list_ams_integration_accounts_endpoint.call_with_http_info(**kwargs) + + def update_ams_integration_account( + self, + integration_name: str, + interface_id: str, + account_id: str, + body: AmsIntegrationAccountUpdateRequest, + ) -> AmsIntegrationAccountResponse: + """Update integration account. + + Update an existing account for a specific integration. You can update the name, settings, + and secrets. Only the fields provided in the request are updated. + + Rate limit: 50 requests per user every 20 seconds. + + :param integration_name: The name of the integration. + :type integration_name: str + :param interface_id: The unique identifier of the interface. + :type interface_id: str + :param account_id: The unique identifier of the account. + :type account_id: str + :type body: AmsIntegrationAccountUpdateRequest + :rtype: AmsIntegrationAccountResponse + """ + kwargs: Dict[str, Any] = {} + kwargs["integration_name"] = integration_name + + kwargs["interface_id"] = interface_id + + kwargs["account_id"] = account_id + + kwargs["body"] = body + + return self._update_ams_integration_account_endpoint.call_with_http_info(**kwargs) diff --git a/src/datadog_api_client/v2/apis/__init__.py b/src/datadog_api_client/v2/apis/__init__.py index f37e2eebe2..caf0f771ef 100644 --- a/src/datadog_api_client/v2/apis/__init__.py +++ b/src/datadog_api_client/v2/apis/__init__.py @@ -59,6 +59,7 @@ from datadog_api_client.v2.api.high_availability_multi_region_api import HighAvailabilityMultiRegionApi from datadog_api_client.v2.api.ip_allowlist_api import IPAllowlistApi from datadog_api_client.v2.api.incidents_api import IncidentsApi +from datadog_api_client.v2.api.integration_accounts_api import IntegrationAccountsApi from datadog_api_client.v2.api.integrations_api import IntegrationsApi from datadog_api_client.v2.api.jira_integration_api import JiraIntegrationApi from datadog_api_client.v2.api.key_management_api import KeyManagementApi @@ -195,6 +196,7 @@ "HighAvailabilityMultiRegionApi", "IPAllowlistApi", "IncidentsApi", + "IntegrationAccountsApi", "IntegrationsApi", "JiraIntegrationApi", "KeyManagementApi", diff --git a/src/datadog_api_client/v2/model/ams_integration_account_attributes.py b/src/datadog_api_client/v2/model/ams_integration_account_attributes.py new file mode 100644 index 0000000000..a7e6afd622 --- /dev/null +++ b/src/datadog_api_client/v2/model/ams_integration_account_attributes.py @@ -0,0 +1,60 @@ +# Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019-Present Datadog, Inc. +from __future__ import annotations + +from typing import Any, Dict + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, + date, + datetime, + none_type, + UUID, +) + + +class AmsIntegrationAccountAttributes(ModelNormal): + @cached_property + def openapi_types(_): + return { + "name": (str,), + "settings": ( + { + str: ( + bool, + date, + datetime, + dict, + float, + int, + list, + str, + UUID, + none_type, + ) + }, + ), + } + + attribute_map = { + "name": "name", + "settings": "settings", + } + + def __init__(self_, name: str, settings: Dict[str, Any], **kwargs): + """ + Attributes for a web integration account. + + :param name: The name of the account. + :type name: str + + :param settings: Integration-specific settings for the account. The structure and required fields vary by integration type. + Use the schema endpoint to retrieve the specific requirements for each integration. + :type settings: {str: (bool, date, datetime, dict, float, int, list, str, UUID, none_type,)} + """ + super().__init__(kwargs) + + self_.name = name + self_.settings = settings diff --git a/src/datadog_api_client/v2/model/ams_integration_account_create_request.py b/src/datadog_api_client/v2/model/ams_integration_account_create_request.py new file mode 100644 index 0000000000..ce74b09ac1 --- /dev/null +++ b/src/datadog_api_client/v2/model/ams_integration_account_create_request.py @@ -0,0 +1,44 @@ +# Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019-Present Datadog, Inc. +from __future__ import annotations + +from typing import TYPE_CHECKING + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, +) + + +if TYPE_CHECKING: + from datadog_api_client.v2.model.ams_integration_account_create_request_data import ( + AmsIntegrationAccountCreateRequestData, + ) + + +class AmsIntegrationAccountCreateRequest(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.ams_integration_account_create_request_data import ( + AmsIntegrationAccountCreateRequestData, + ) + + return { + "data": (AmsIntegrationAccountCreateRequestData,), + } + + attribute_map = { + "data": "data", + } + + def __init__(self_, data: AmsIntegrationAccountCreateRequestData, **kwargs): + """ + Payload for creating a web integration account. + + :param data: Data object for creating a web integration account. + :type data: AmsIntegrationAccountCreateRequestData + """ + super().__init__(kwargs) + + self_.data = data diff --git a/src/datadog_api_client/v2/model/ams_integration_account_create_request_attributes.py b/src/datadog_api_client/v2/model/ams_integration_account_create_request_attributes.py new file mode 100644 index 0000000000..7874d21e75 --- /dev/null +++ b/src/datadog_api_client/v2/model/ams_integration_account_create_request_attributes.py @@ -0,0 +1,83 @@ +# Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019-Present Datadog, Inc. +from __future__ import annotations + +from typing import Any, Dict + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, + date, + datetime, + none_type, + UUID, +) + + +class AmsIntegrationAccountCreateRequestAttributes(ModelNormal): + @cached_property + def openapi_types(_): + return { + "name": (str,), + "secrets": ( + { + str: ( + bool, + date, + datetime, + dict, + float, + int, + list, + str, + UUID, + none_type, + ) + }, + ), + "settings": ( + { + str: ( + bool, + date, + datetime, + dict, + float, + int, + list, + str, + UUID, + none_type, + ) + }, + ), + } + + attribute_map = { + "name": "name", + "secrets": "secrets", + "settings": "settings", + } + + def __init__(self_, name: str, secrets: Dict[str, Any], settings: Dict[str, Any], **kwargs): + """ + Attributes for creating a web integration account. + + :param name: The name of the account. + :type name: str + + :param secrets: Sensitive credentials for the account. The structure and required fields vary by integration type. + These values are write-only and never returned in responses. + :type secrets: {str: (bool, date, datetime, dict, float, int, list, str, UUID, none_type,)} + + :param settings: Integration-specific settings for the account. The structure and required fields vary by integration type. + Use the schema endpoint (GET /api/v2/integrations/{integration_name}/accounts/schema) to retrieve + the specific requirements for your integration before creating an account. + :type settings: {str: (bool, date, datetime, dict, float, int, list, str, UUID, none_type,)} + """ + super().__init__(kwargs) + + self_.name = name + self_.secrets = secrets + self_.settings = settings diff --git a/src/datadog_api_client/v2/model/ams_integration_account_create_request_data.py b/src/datadog_api_client/v2/model/ams_integration_account_create_request_data.py new file mode 100644 index 0000000000..e07ebc524c --- /dev/null +++ b/src/datadog_api_client/v2/model/ams_integration_account_create_request_data.py @@ -0,0 +1,54 @@ +# Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019-Present Datadog, Inc. +from __future__ import annotations + +from typing import TYPE_CHECKING + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, +) + + +if TYPE_CHECKING: + from datadog_api_client.v2.model.ams_integration_account_create_request_attributes import ( + AmsIntegrationAccountCreateRequestAttributes, + ) + from datadog_api_client.v2.model.ams_integration_account_type import AmsIntegrationAccountType + + +class AmsIntegrationAccountCreateRequestData(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.ams_integration_account_create_request_attributes import ( + AmsIntegrationAccountCreateRequestAttributes, + ) + from datadog_api_client.v2.model.ams_integration_account_type import AmsIntegrationAccountType + + return { + "attributes": (AmsIntegrationAccountCreateRequestAttributes,), + "type": (AmsIntegrationAccountType,), + } + + attribute_map = { + "attributes": "attributes", + "type": "type", + } + + def __init__( + self_, attributes: AmsIntegrationAccountCreateRequestAttributes, type: AmsIntegrationAccountType, **kwargs + ): + """ + Data object for creating a web integration account. + + :param attributes: Attributes for creating a web integration account. + :type attributes: AmsIntegrationAccountCreateRequestAttributes + + :param type: The JSON:API type for web integration accounts. + :type type: AmsIntegrationAccountType + """ + super().__init__(kwargs) + + self_.attributes = attributes + self_.type = type diff --git a/src/datadog_api_client/v2/model/ams_integration_account_response.py b/src/datadog_api_client/v2/model/ams_integration_account_response.py new file mode 100644 index 0000000000..7b3a0638ca --- /dev/null +++ b/src/datadog_api_client/v2/model/ams_integration_account_response.py @@ -0,0 +1,54 @@ +# Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019-Present Datadog, Inc. +from __future__ import annotations + +from typing import Union, TYPE_CHECKING + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, + unset, + UnsetType, +) + + +if TYPE_CHECKING: + from datadog_api_client.v2.model.ams_integration_account_response_data import AmsIntegrationAccountResponseData + + +class AmsIntegrationAccountResponse(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.ams_integration_account_response_data import AmsIntegrationAccountResponseData + + return { + "data": (AmsIntegrationAccountResponseData,), + "integration_name": (str,), + } + + attribute_map = { + "data": "data", + "integration_name": "integration_name", + } + + def __init__( + self_, + data: Union[AmsIntegrationAccountResponseData, UnsetType] = unset, + integration_name: Union[str, UnsetType] = unset, + **kwargs, + ): + """ + Response containing a single web integration account. + + :param data: Data object for a web integration account response. + :type data: AmsIntegrationAccountResponseData, optional + + :param integration_name: The name of the integration. + :type integration_name: str, optional + """ + if data is not unset: + kwargs["data"] = data + if integration_name is not unset: + kwargs["integration_name"] = integration_name + super().__init__(kwargs) diff --git a/src/datadog_api_client/v2/model/ams_integration_account_response_data.py b/src/datadog_api_client/v2/model/ams_integration_account_response_data.py new file mode 100644 index 0000000000..b5318fddb0 --- /dev/null +++ b/src/datadog_api_client/v2/model/ams_integration_account_response_data.py @@ -0,0 +1,56 @@ +# Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019-Present Datadog, Inc. +from __future__ import annotations + +from typing import TYPE_CHECKING + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, +) + + +if TYPE_CHECKING: + from datadog_api_client.v2.model.ams_integration_account_attributes import AmsIntegrationAccountAttributes + from datadog_api_client.v2.model.ams_integration_account_type import AmsIntegrationAccountType + + +class AmsIntegrationAccountResponseData(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.ams_integration_account_attributes import AmsIntegrationAccountAttributes + from datadog_api_client.v2.model.ams_integration_account_type import AmsIntegrationAccountType + + return { + "attributes": (AmsIntegrationAccountAttributes,), + "id": (str,), + "type": (AmsIntegrationAccountType,), + } + + attribute_map = { + "attributes": "attributes", + "id": "id", + "type": "type", + } + + def __init__( + self_, attributes: AmsIntegrationAccountAttributes, id: str, type: AmsIntegrationAccountType, **kwargs + ): + """ + Data object for a web integration account response. + + :param attributes: Attributes for a web integration account. + :type attributes: AmsIntegrationAccountAttributes + + :param id: The unique identifier for the account. + :type id: str + + :param type: The JSON:API type for web integration accounts. + :type type: AmsIntegrationAccountType + """ + super().__init__(kwargs) + + self_.attributes = attributes + self_.id = id + self_.type = type diff --git a/src/datadog_api_client/v2/model/ams_integration_account_schema_response.py b/src/datadog_api_client/v2/model/ams_integration_account_schema_response.py new file mode 100644 index 0000000000..6c2419a56c --- /dev/null +++ b/src/datadog_api_client/v2/model/ams_integration_account_schema_response.py @@ -0,0 +1,79 @@ +# Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019-Present Datadog, Inc. +from __future__ import annotations + +from typing import List, Union, TYPE_CHECKING + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, + unset, + UnsetType, +) + + +if TYPE_CHECKING: + from datadog_api_client.v2.model.ams_integration_account_schema_response_properties import ( + AmsIntegrationAccountSchemaResponseProperties, + ) + + +class AmsIntegrationAccountSchemaResponse(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.ams_integration_account_schema_response_properties import ( + AmsIntegrationAccountSchemaResponseProperties, + ) + + return { + "additional_properties": (bool,), + "properties": (AmsIntegrationAccountSchemaResponseProperties,), + "required": ([str],), + "type": (str,), + } + + attribute_map = { + "additional_properties": "additionalProperties", + "properties": "properties", + "required": "required", + "type": "type", + } + + def __init__( + self_, + properties: AmsIntegrationAccountSchemaResponseProperties, + required: List[str], + type: str, + additional_properties: Union[bool, UnsetType] = unset, + **kwargs, + ): + """ + Response containing the JSON schema for an integration's account configuration. + This schema defines the required and optional fields for both settings and secrets, + including field types, validation rules, and descriptions. + + The response is a standard `JSON Schema (draft-07) `_ document describing the account + configuration structure. Because this is a dynamic JSON Schema, the exact properties vary by integration. + + :param additional_properties: Whether additional properties are allowed at the root level (typically false). + :type additional_properties: bool, optional + + :param properties: The properties object containing settings and secrets schema definitions. + Both are always present in every integration schema, but the fields within each + vary depending on the specific integration. + :type properties: AmsIntegrationAccountSchemaResponseProperties + + :param required: List of required top-level properties. + :type required: [str] + + :param type: The root type of the schema (always "object"). + :type type: str + """ + if additional_properties is not unset: + kwargs["additional_properties"] = additional_properties + super().__init__(kwargs) + + self_.properties = properties + self_.required = required + self_.type = type diff --git a/src/datadog_api_client/v2/model/ams_integration_account_schema_response_properties.py b/src/datadog_api_client/v2/model/ams_integration_account_schema_response_properties.py new file mode 100644 index 0000000000..f42b23fde9 --- /dev/null +++ b/src/datadog_api_client/v2/model/ams_integration_account_schema_response_properties.py @@ -0,0 +1,67 @@ +# Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019-Present Datadog, Inc. +from __future__ import annotations + +from typing import TYPE_CHECKING + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, +) + + +if TYPE_CHECKING: + from datadog_api_client.v2.model.ams_integration_account_schema_response_secrets_object import ( + AmsIntegrationAccountSchemaResponseSecretsObject, + ) + from datadog_api_client.v2.model.ams_integration_account_schema_response_settings_object import ( + AmsIntegrationAccountSchemaResponseSettingsObject, + ) + + +class AmsIntegrationAccountSchemaResponseProperties(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.ams_integration_account_schema_response_secrets_object import ( + AmsIntegrationAccountSchemaResponseSecretsObject, + ) + from datadog_api_client.v2.model.ams_integration_account_schema_response_settings_object import ( + AmsIntegrationAccountSchemaResponseSettingsObject, + ) + + return { + "secrets": (AmsIntegrationAccountSchemaResponseSecretsObject,), + "settings": (AmsIntegrationAccountSchemaResponseSettingsObject,), + } + + attribute_map = { + "secrets": "secrets", + "settings": "settings", + } + + def __init__( + self_, + secrets: AmsIntegrationAccountSchemaResponseSecretsObject, + settings: AmsIntegrationAccountSchemaResponseSettingsObject, + **kwargs, + ): + """ + The properties object containing settings and secrets schema definitions. + Both are always present in every integration schema, but the fields within each + vary depending on the specific integration. + + :param secrets: JSON Schema definition for the secrets object. + Contains sensitive credentials required for the integration such as API keys, + tokens, and passwords. These values are write-only and never returned in responses. + :type secrets: AmsIntegrationAccountSchemaResponseSecretsObject + + :param settings: JSON Schema definition for the settings object. + Contains integration-specific configuration fields such as account identifiers, + feature toggles, and non-sensitive configuration options. + :type settings: AmsIntegrationAccountSchemaResponseSettingsObject + """ + super().__init__(kwargs) + + self_.secrets = secrets + self_.settings = settings diff --git a/src/datadog_api_client/v2/model/ams_integration_account_schema_response_secrets_object.py b/src/datadog_api_client/v2/model/ams_integration_account_schema_response_secrets_object.py new file mode 100644 index 0000000000..12d80430f4 --- /dev/null +++ b/src/datadog_api_client/v2/model/ams_integration_account_schema_response_secrets_object.py @@ -0,0 +1,77 @@ +# Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019-Present Datadog, Inc. +from __future__ import annotations + +from typing import Dict, List, Union, TYPE_CHECKING + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, + unset, + UnsetType, +) + + +if TYPE_CHECKING: + from datadog_api_client.v2.model.ams_integration_account_schema_response_settings_field import ( + AmsIntegrationAccountSchemaResponseSettingsField, + ) + + +class AmsIntegrationAccountSchemaResponseSecretsObject(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.ams_integration_account_schema_response_settings_field import ( + AmsIntegrationAccountSchemaResponseSettingsField, + ) + + return { + "additional_properties": (bool,), + "properties": ({str: (AmsIntegrationAccountSchemaResponseSettingsField,)},), + "required": ([str],), + "type": (str,), + } + + attribute_map = { + "additional_properties": "additionalProperties", + "properties": "properties", + "required": "required", + "type": "type", + } + + def __init__( + self_, + additional_properties: Union[bool, UnsetType] = unset, + properties: Union[Dict[str, AmsIntegrationAccountSchemaResponseSettingsField], UnsetType] = unset, + required: Union[List[str], UnsetType] = unset, + type: Union[str, UnsetType] = unset, + **kwargs, + ): + """ + JSON Schema definition for the secrets object. + Contains sensitive credentials required for the integration such as API keys, + tokens, and passwords. These values are write-only and never returned in responses. + + :param additional_properties: Whether additional properties are allowed (typically false). + :type additional_properties: bool, optional + + :param properties: The individual secret fields for this integration. + Field names and types vary by integration. + :type properties: {str: (AmsIntegrationAccountSchemaResponseSettingsField,)}, optional + + :param required: List of required secret field names. + :type required: [str], optional + + :param type: Always "object" for the secrets container. + :type type: str, optional + """ + if additional_properties is not unset: + kwargs["additional_properties"] = additional_properties + if properties is not unset: + kwargs["properties"] = properties + if required is not unset: + kwargs["required"] = required + if type is not unset: + kwargs["type"] = type + super().__init__(kwargs) diff --git a/src/datadog_api_client/v2/model/ams_integration_account_schema_response_settings_field.py b/src/datadog_api_client/v2/model/ams_integration_account_schema_response_settings_field.py new file mode 100644 index 0000000000..9b38bfd34f --- /dev/null +++ b/src/datadog_api_client/v2/model/ams_integration_account_schema_response_settings_field.py @@ -0,0 +1,96 @@ +# Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019-Present Datadog, Inc. +from __future__ import annotations + +from typing import Any, Union + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, + date, + datetime, + none_type, + unset, + UnsetType, + UUID, +) + + +class AmsIntegrationAccountSchemaResponseSettingsField(ModelNormal): + @cached_property + def openapi_types(_): + return { + "additional_properties": (bool,), + "default": ( + bool, + date, + datetime, + dict, + float, + int, + list, + str, + UUID, + none_type, + ), + "description": (str,), + "items": (dict,), + "min_length": (int,), + "type": (str,), + } + + attribute_map = { + "additional_properties": "additionalProperties", + "default": "default", + "description": "description", + "items": "items", + "min_length": "minLength", + "type": "type", + } + + def __init__( + self_, + additional_properties: Union[bool, UnsetType] = unset, + default: Union[Any, UnsetType] = unset, + description: Union[str, UnsetType] = unset, + items: Union[dict, UnsetType] = unset, + min_length: Union[int, UnsetType] = unset, + type: Union[str, UnsetType] = unset, + **kwargs, + ): + """ + JSON Schema definition for a single field within settings or secrets. + The exact fields vary by integration. + + :param additional_properties: Whether additional properties are allowed for this field. + :type additional_properties: bool, optional + + :param default: Default value for the field if not provided. + :type default: bool, date, datetime, dict, float, int, list, str, UUID, none_type, optional + + :param description: Human-readable description of the field's purpose. + :type description: str, optional + + :param items: Schema for array items when type is "array". + :type items: dict, optional + + :param min_length: Minimum length for string fields. + :type min_length: int, optional + + :param type: The data type of the field (string, boolean, integer, array, object). + :type type: str, optional + """ + if additional_properties is not unset: + kwargs["additional_properties"] = additional_properties + if default is not unset: + kwargs["default"] = default + if description is not unset: + kwargs["description"] = description + if items is not unset: + kwargs["items"] = items + if min_length is not unset: + kwargs["min_length"] = min_length + if type is not unset: + kwargs["type"] = type + super().__init__(kwargs) diff --git a/src/datadog_api_client/v2/model/ams_integration_account_schema_response_settings_object.py b/src/datadog_api_client/v2/model/ams_integration_account_schema_response_settings_object.py new file mode 100644 index 0000000000..39d3446114 --- /dev/null +++ b/src/datadog_api_client/v2/model/ams_integration_account_schema_response_settings_object.py @@ -0,0 +1,77 @@ +# Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019-Present Datadog, Inc. +from __future__ import annotations + +from typing import Dict, List, Union, TYPE_CHECKING + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, + unset, + UnsetType, +) + + +if TYPE_CHECKING: + from datadog_api_client.v2.model.ams_integration_account_schema_response_settings_field import ( + AmsIntegrationAccountSchemaResponseSettingsField, + ) + + +class AmsIntegrationAccountSchemaResponseSettingsObject(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.ams_integration_account_schema_response_settings_field import ( + AmsIntegrationAccountSchemaResponseSettingsField, + ) + + return { + "additional_properties": (bool,), + "properties": ({str: (AmsIntegrationAccountSchemaResponseSettingsField,)},), + "required": ([str],), + "type": (str,), + } + + attribute_map = { + "additional_properties": "additionalProperties", + "properties": "properties", + "required": "required", + "type": "type", + } + + def __init__( + self_, + additional_properties: Union[bool, UnsetType] = unset, + properties: Union[Dict[str, AmsIntegrationAccountSchemaResponseSettingsField], UnsetType] = unset, + required: Union[List[str], UnsetType] = unset, + type: Union[str, UnsetType] = unset, + **kwargs, + ): + """ + JSON Schema definition for the settings object. + Contains integration-specific configuration fields such as account identifiers, + feature toggles, and non-sensitive configuration options. + + :param additional_properties: Whether additional properties are allowed (typically false). + :type additional_properties: bool, optional + + :param properties: The individual setting fields for this integration. + Field names and types vary by integration. + :type properties: {str: (AmsIntegrationAccountSchemaResponseSettingsField,)}, optional + + :param required: List of required setting field names. + :type required: [str], optional + + :param type: Always "object" for the settings container. + :type type: str, optional + """ + if additional_properties is not unset: + kwargs["additional_properties"] = additional_properties + if properties is not unset: + kwargs["properties"] = properties + if required is not unset: + kwargs["required"] = required + if type is not unset: + kwargs["type"] = type + super().__init__(kwargs) diff --git a/src/datadog_api_client/v2/model/ams_integration_account_type.py b/src/datadog_api_client/v2/model/ams_integration_account_type.py new file mode 100644 index 0000000000..30a22d02a3 --- /dev/null +++ b/src/datadog_api_client/v2/model/ams_integration_account_type.py @@ -0,0 +1,35 @@ +# Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019-Present Datadog, Inc. +from __future__ import annotations + + +from datadog_api_client.model_utils import ( + ModelSimple, + cached_property, +) + +from typing import ClassVar + + +class AmsIntegrationAccountType(ModelSimple): + """ + The JSON:API type for web integration accounts. + + :param value: If omitted defaults to "Account". Must be one of ["Account"]. + :type value: str + """ + + allowed_values = { + "Account", + } + ACCOUNT: ClassVar["AmsIntegrationAccountType"] + + @cached_property + def openapi_types(_): + return { + "value": (str,), + } + + +AmsIntegrationAccountType.ACCOUNT = AmsIntegrationAccountType("Account") diff --git a/src/datadog_api_client/v2/model/ams_integration_account_update_request.py b/src/datadog_api_client/v2/model/ams_integration_account_update_request.py new file mode 100644 index 0000000000..ce1ed7bd45 --- /dev/null +++ b/src/datadog_api_client/v2/model/ams_integration_account_update_request.py @@ -0,0 +1,44 @@ +# Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019-Present Datadog, Inc. +from __future__ import annotations + +from typing import TYPE_CHECKING + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, +) + + +if TYPE_CHECKING: + from datadog_api_client.v2.model.ams_integration_account_update_request_data import ( + AmsIntegrationAccountUpdateRequestData, + ) + + +class AmsIntegrationAccountUpdateRequest(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.ams_integration_account_update_request_data import ( + AmsIntegrationAccountUpdateRequestData, + ) + + return { + "data": (AmsIntegrationAccountUpdateRequestData,), + } + + attribute_map = { + "data": "data", + } + + def __init__(self_, data: AmsIntegrationAccountUpdateRequestData, **kwargs): + """ + Payload for updating a web integration account. + + :param data: Data object for updating a web integration account. + :type data: AmsIntegrationAccountUpdateRequestData + """ + super().__init__(kwargs) + + self_.data = data diff --git a/src/datadog_api_client/v2/model/ams_integration_account_update_request_attributes.py b/src/datadog_api_client/v2/model/ams_integration_account_update_request_attributes.py new file mode 100644 index 0000000000..8530adb1f7 --- /dev/null +++ b/src/datadog_api_client/v2/model/ams_integration_account_update_request_attributes.py @@ -0,0 +1,93 @@ +# Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019-Present Datadog, Inc. +from __future__ import annotations + +from typing import Any, Dict, Union + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, + date, + datetime, + none_type, + unset, + UnsetType, + UUID, +) + + +class AmsIntegrationAccountUpdateRequestAttributes(ModelNormal): + @cached_property + def openapi_types(_): + return { + "name": (str,), + "secrets": ( + { + str: ( + bool, + date, + datetime, + dict, + float, + int, + list, + str, + UUID, + none_type, + ) + }, + ), + "settings": ( + { + str: ( + bool, + date, + datetime, + dict, + float, + int, + list, + str, + UUID, + none_type, + ) + }, + ), + } + + attribute_map = { + "name": "name", + "secrets": "secrets", + "settings": "settings", + } + + def __init__( + self_, + name: Union[str, UnsetType] = unset, + secrets: Union[Dict[str, Any], UnsetType] = unset, + settings: Union[Dict[str, Any], UnsetType] = unset, + **kwargs, + ): + """ + Attributes for updating a web integration account. All fields are optional; + only provide the fields you want to update. + + :param name: The name of the account. + :type name: str, optional + + :param secrets: Sensitive credentials to update. Only the secrets provided are updated. + These values are write-only and never returned in responses. + :type secrets: {str: (bool, date, datetime, dict, float, int, list, str, UUID, none_type,)}, optional + + :param settings: Integration-specific settings to update. Only the fields provided are updated. + The structure varies by integration type. See the integration's schema for available fields. + :type settings: {str: (bool, date, datetime, dict, float, int, list, str, UUID, none_type,)}, optional + """ + if name is not unset: + kwargs["name"] = name + if secrets is not unset: + kwargs["secrets"] = secrets + if settings is not unset: + kwargs["settings"] = settings + super().__init__(kwargs) diff --git a/src/datadog_api_client/v2/model/ams_integration_account_update_request_data.py b/src/datadog_api_client/v2/model/ams_integration_account_update_request_data.py new file mode 100644 index 0000000000..00f8a1b787 --- /dev/null +++ b/src/datadog_api_client/v2/model/ams_integration_account_update_request_data.py @@ -0,0 +1,61 @@ +# Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019-Present Datadog, Inc. +from __future__ import annotations + +from typing import Union, TYPE_CHECKING + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, + unset, + UnsetType, +) + + +if TYPE_CHECKING: + from datadog_api_client.v2.model.ams_integration_account_update_request_attributes import ( + AmsIntegrationAccountUpdateRequestAttributes, + ) + from datadog_api_client.v2.model.ams_integration_account_type import AmsIntegrationAccountType + + +class AmsIntegrationAccountUpdateRequestData(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.ams_integration_account_update_request_attributes import ( + AmsIntegrationAccountUpdateRequestAttributes, + ) + from datadog_api_client.v2.model.ams_integration_account_type import AmsIntegrationAccountType + + return { + "attributes": (AmsIntegrationAccountUpdateRequestAttributes,), + "type": (AmsIntegrationAccountType,), + } + + attribute_map = { + "attributes": "attributes", + "type": "type", + } + + def __init__( + self_, + type: AmsIntegrationAccountType, + attributes: Union[AmsIntegrationAccountUpdateRequestAttributes, UnsetType] = unset, + **kwargs, + ): + """ + Data object for updating a web integration account. + + :param attributes: Attributes for updating a web integration account. All fields are optional; + only provide the fields you want to update. + :type attributes: AmsIntegrationAccountUpdateRequestAttributes, optional + + :param type: The JSON:API type for web integration accounts. + :type type: AmsIntegrationAccountType + """ + if attributes is not unset: + kwargs["attributes"] = attributes + super().__init__(kwargs) + + self_.type = type diff --git a/src/datadog_api_client/v2/model/ams_integration_accounts_response.py b/src/datadog_api_client/v2/model/ams_integration_accounts_response.py new file mode 100644 index 0000000000..2d81838b76 --- /dev/null +++ b/src/datadog_api_client/v2/model/ams_integration_accounts_response.py @@ -0,0 +1,54 @@ +# Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019-Present Datadog, Inc. +from __future__ import annotations + +from typing import List, Union, TYPE_CHECKING + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, + unset, + UnsetType, +) + + +if TYPE_CHECKING: + from datadog_api_client.v2.model.ams_integration_account_response_data import AmsIntegrationAccountResponseData + + +class AmsIntegrationAccountsResponse(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.ams_integration_account_response_data import AmsIntegrationAccountResponseData + + return { + "data": ([AmsIntegrationAccountResponseData],), + "integration_name": (str,), + } + + attribute_map = { + "data": "data", + "integration_name": "integration_name", + } + + def __init__( + self_, + data: Union[List[AmsIntegrationAccountResponseData], UnsetType] = unset, + integration_name: Union[str, UnsetType] = unset, + **kwargs, + ): + """ + Response containing a list of web integration accounts. + + :param data: + :type data: [AmsIntegrationAccountResponseData], optional + + :param integration_name: The name of the integration. + :type integration_name: str, optional + """ + if data is not unset: + kwargs["data"] = data + if integration_name is not unset: + kwargs["integration_name"] = integration_name + super().__init__(kwargs) diff --git a/src/datadog_api_client/v2/models/__init__.py b/src/datadog_api_client/v2/models/__init__.py index 9413425cce..22bcd88a1e 100644 --- a/src/datadog_api_client/v2/models/__init__.py +++ b/src/datadog_api_client/v2/models/__init__.py @@ -283,6 +283,38 @@ from datadog_api_client.v2.model.allocation_exposure_schedule_response import AllocationExposureScheduleResponse from datadog_api_client.v2.model.allocation_response import AllocationResponse from datadog_api_client.v2.model.allocation_type import AllocationType +from datadog_api_client.v2.model.ams_integration_account_attributes import AmsIntegrationAccountAttributes +from datadog_api_client.v2.model.ams_integration_account_create_request import AmsIntegrationAccountCreateRequest +from datadog_api_client.v2.model.ams_integration_account_create_request_attributes import ( + AmsIntegrationAccountCreateRequestAttributes, +) +from datadog_api_client.v2.model.ams_integration_account_create_request_data import ( + AmsIntegrationAccountCreateRequestData, +) +from datadog_api_client.v2.model.ams_integration_account_response import AmsIntegrationAccountResponse +from datadog_api_client.v2.model.ams_integration_account_response_data import AmsIntegrationAccountResponseData +from datadog_api_client.v2.model.ams_integration_account_schema_response import AmsIntegrationAccountSchemaResponse +from datadog_api_client.v2.model.ams_integration_account_schema_response_properties import ( + AmsIntegrationAccountSchemaResponseProperties, +) +from datadog_api_client.v2.model.ams_integration_account_schema_response_secrets_object import ( + AmsIntegrationAccountSchemaResponseSecretsObject, +) +from datadog_api_client.v2.model.ams_integration_account_schema_response_settings_field import ( + AmsIntegrationAccountSchemaResponseSettingsField, +) +from datadog_api_client.v2.model.ams_integration_account_schema_response_settings_object import ( + AmsIntegrationAccountSchemaResponseSettingsObject, +) +from datadog_api_client.v2.model.ams_integration_account_type import AmsIntegrationAccountType +from datadog_api_client.v2.model.ams_integration_account_update_request import AmsIntegrationAccountUpdateRequest +from datadog_api_client.v2.model.ams_integration_account_update_request_attributes import ( + AmsIntegrationAccountUpdateRequestAttributes, +) +from datadog_api_client.v2.model.ams_integration_account_update_request_data import ( + AmsIntegrationAccountUpdateRequestData, +) +from datadog_api_client.v2.model.ams_integration_accounts_response import AmsIntegrationAccountsResponse from datadog_api_client.v2.model.analysis_edit import AnalysisEdit from datadog_api_client.v2.model.analysis_edit_type import AnalysisEditType from datadog_api_client.v2.model.analysis_fix import AnalysisFix @@ -9633,6 +9665,22 @@ "AllocationExposureScheduleResponse", "AllocationResponse", "AllocationType", + "AmsIntegrationAccountAttributes", + "AmsIntegrationAccountCreateRequest", + "AmsIntegrationAccountCreateRequestAttributes", + "AmsIntegrationAccountCreateRequestData", + "AmsIntegrationAccountResponse", + "AmsIntegrationAccountResponseData", + "AmsIntegrationAccountSchemaResponse", + "AmsIntegrationAccountSchemaResponseProperties", + "AmsIntegrationAccountSchemaResponseSecretsObject", + "AmsIntegrationAccountSchemaResponseSettingsField", + "AmsIntegrationAccountSchemaResponseSettingsObject", + "AmsIntegrationAccountType", + "AmsIntegrationAccountUpdateRequest", + "AmsIntegrationAccountUpdateRequestAttributes", + "AmsIntegrationAccountUpdateRequestData", + "AmsIntegrationAccountsResponse", "AnalysisEdit", "AnalysisEditType", "AnalysisFix", diff --git a/tests/v2/features/given.json b/tests/v2/features/given.json index 0f9de6d48a..dab2215ce3 100644 --- a/tests/v2/features/given.json +++ b/tests/v2/features/given.json @@ -834,6 +834,26 @@ "tag": "Okta Integration", "operationId": "CreateOktaAccount" }, + { + "parameters": [ + { + "name": "integration_name", + "value": "\"twilio\"" + }, + { + "name": "interface_id", + "value": "\"twilio.messaging\"" + }, + { + "name": "body", + "value": "{\n \"data\": {\n \"type\": \"Account\",\n \"attributes\": {\n \"name\": \"{{ unique }}\",\n \"settings\": {\n \"api_key\": \"SKxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\n \"account_sid\": \"ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\n \"events\": true,\n \"messages\": true,\n \"alerts\": true,\n \"call_summaries\": true,\n \"ccm_enabled\": true,\n \"censor_logs\": true\n },\n \"secrets\": {\n \"api_key_token\": \"test_secret_token_value\"\n }\n }\n }\n}" + } + ], + "step": "there is a valid \"web_integration_account\" in the system", + "key": "web_integration_account", + "tag": "Integration Accounts", + "operationId": "CreateAmsIntegrationAccount" + }, { "parameters": [ { diff --git a/tests/v2/features/integration_accounts.feature b/tests/v2/features/integration_accounts.feature new file mode 100644 index 0000000000..c0d96602bd --- /dev/null +++ b/tests/v2/features/integration_accounts.feature @@ -0,0 +1,199 @@ +@endpoint(integration-accounts) @endpoint(integration-accounts-v2) +Feature: Integration Accounts + Configure and manage third-party integrations with Datadog. This API + provides a unified interface for managing integration accounts across + various external services. Each integration has its own unique schema + that defines the required settings and secrets. Before creating or + updating an account, use the schema endpoint to retrieve the specific + requirements, field types, validation rules, and available configuration + options for your integration. **Note**: This API manages integration + account configurations only. It does not support Grace Resources, + Reference Tables, or Custom Queries CRUD operations. For those features, + refer to each integration's dedicated documentation. Supported + Integrations: - + [Twilio](https://docs.datadoghq.com/integrations/twilio/) - + [Snowflake](https://docs.datadoghq.com/integrations/snowflake-web/) - + [Databricks](https://docs.datadoghq.com/integrations/databricks/) + + Background: + Given a valid "apiKeyAuth" key in the system + And a valid "appKeyAuth" key in the system + And an instance of "IntegrationAccounts" API + + @generated @skip @team:DataDog/saas-integrations + Scenario: Create integration account returns "Bad Request: The request body is malformed or the integration name format is invalid." response + Given new "CreateAmsIntegrationAccount" request + And request contains "integration_name" parameter from "REPLACE.ME" + And request contains "interface_id" parameter from "REPLACE.ME" + And body with value {"data": {"attributes": {"name": "My Production Account", "secrets": {"api_key_token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}, "settings": {"account_sid": "ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "alerts": true, "api_key": "SKxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "call_summaries": true, "ccm_enabled": true, "censor_logs": true, "events": true, "messages": true}}, "type": "Account"}} + When the request is sent + Then the response status is 400 Bad Request: The request body is malformed or the integration name format is invalid. + + @generated @skip @team:DataDog/saas-integrations + Scenario: Create integration account returns "Created: The account was successfully created." response + Given new "CreateAmsIntegrationAccount" request + And request contains "integration_name" parameter from "REPLACE.ME" + And request contains "interface_id" parameter from "REPLACE.ME" + And body with value {"data": {"attributes": {"name": "My Production Account", "secrets": {"api_key_token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}, "settings": {"account_sid": "ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "alerts": true, "api_key": "SKxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "call_summaries": true, "ccm_enabled": true, "censor_logs": true, "events": true, "messages": true}}, "type": "Account"}} + When the request is sent + Then the response status is 201 Created: The account was successfully created. + + @generated @skip @team:DataDog/saas-integrations + Scenario: Create integration account returns "Not Found: The integration does not exist." response + Given new "CreateAmsIntegrationAccount" request + And request contains "integration_name" parameter from "REPLACE.ME" + And request contains "interface_id" parameter from "REPLACE.ME" + And body with value {"data": {"attributes": {"name": "My Production Account", "secrets": {"api_key_token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}, "settings": {"account_sid": "ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "alerts": true, "api_key": "SKxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "call_summaries": true, "ccm_enabled": true, "censor_logs": true, "events": true, "messages": true}}, "type": "Account"}} + When the request is sent + Then the response status is 404 Not Found: The integration does not exist. + + @generated @skip @team:DataDog/saas-integrations + Scenario: Create integration account returns "Unprocessable Entity: The account configuration does not match the integration schema." response + Given new "CreateAmsIntegrationAccount" request + And request contains "integration_name" parameter from "REPLACE.ME" + And request contains "interface_id" parameter from "REPLACE.ME" + And body with value {"data": {"attributes": {"name": "My Production Account", "secrets": {"api_key_token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}, "settings": {"account_sid": "ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "alerts": true, "api_key": "SKxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "call_summaries": true, "ccm_enabled": true, "censor_logs": true, "events": true, "messages": true}}, "type": "Account"}} + When the request is sent + Then the response status is 422 Unprocessable Entity: The account configuration does not match the integration schema. + + @generated @skip @team:DataDog/saas-integrations + Scenario: Delete integration account returns "Bad Request: The integration name or account ID format is invalid." response + Given new "DeleteAmsIntegrationAccount" request + And request contains "integration_name" parameter from "REPLACE.ME" + And request contains "interface_id" parameter from "REPLACE.ME" + And request contains "account_id" parameter from "REPLACE.ME" + When the request is sent + Then the response status is 400 Bad Request: The integration name or account ID format is invalid. + + @generated @skip @team:DataDog/saas-integrations + Scenario: Delete integration account returns "Not Found: The integration or account does not exist." response + Given new "DeleteAmsIntegrationAccount" request + And request contains "integration_name" parameter from "REPLACE.ME" + And request contains "interface_id" parameter from "REPLACE.ME" + And request contains "account_id" parameter from "REPLACE.ME" + When the request is sent + Then the response status is 404 Not Found: The integration or account does not exist. + + @generated @skip @team:DataDog/saas-integrations + Scenario: Delete integration account returns "OK: The account was successfully deleted." response + Given new "DeleteAmsIntegrationAccount" request + And request contains "integration_name" parameter from "REPLACE.ME" + And request contains "interface_id" parameter from "REPLACE.ME" + And request contains "account_id" parameter from "REPLACE.ME" + When the request is sent + Then the response status is 200 OK: The account was successfully deleted. + + @generated @skip @team:DataDog/saas-integrations + Scenario: Get account schema for an integration returns "Bad Request: The integration name format is invalid." response + Given new "GetAmsIntegrationAccountSchema" request + And request contains "integration_name" parameter from "REPLACE.ME" + And request contains "interface_id" parameter from "REPLACE.ME" + When the request is sent + Then the response status is 400 Bad Request: The integration name format is invalid. + + @generated @skip @team:DataDog/saas-integrations + Scenario: Get account schema for an integration returns "Not Found: The integration does not exist or has no schema available." response + Given new "GetAmsIntegrationAccountSchema" request + And request contains "integration_name" parameter from "REPLACE.ME" + And request contains "interface_id" parameter from "REPLACE.ME" + When the request is sent + Then the response status is 404 Not Found: The integration does not exist or has no schema available. + + @generated @skip @team:DataDog/saas-integrations + Scenario: Get account schema for an integration returns "OK: The JSON schema for the integration's account configuration." response + Given new "GetAmsIntegrationAccountSchema" request + And request contains "integration_name" parameter from "REPLACE.ME" + And request contains "interface_id" parameter from "REPLACE.ME" + When the request is sent + Then the response status is 200 OK: The JSON schema for the integration's account configuration. + + @generated @skip @team:DataDog/saas-integrations + Scenario: Get integration account returns "Bad Request: The integration name or account ID format is invalid." response + Given new "GetAmsIntegrationAccount" request + And request contains "integration_name" parameter from "REPLACE.ME" + And request contains "interface_id" parameter from "REPLACE.ME" + And request contains "account_id" parameter from "REPLACE.ME" + When the request is sent + Then the response status is 400 Bad Request: The integration name or account ID format is invalid. + + @generated @skip @team:DataDog/saas-integrations + Scenario: Get integration account returns "Not Found: The integration or account does not exist." response + Given new "GetAmsIntegrationAccount" request + And request contains "integration_name" parameter from "REPLACE.ME" + And request contains "interface_id" parameter from "REPLACE.ME" + And request contains "account_id" parameter from "REPLACE.ME" + When the request is sent + Then the response status is 404 Not Found: The integration or account does not exist. + + @generated @skip @team:DataDog/saas-integrations + Scenario: Get integration account returns "OK: The account details for the specified integration." response + Given new "GetAmsIntegrationAccount" request + And request contains "integration_name" parameter from "REPLACE.ME" + And request contains "interface_id" parameter from "REPLACE.ME" + And request contains "account_id" parameter from "REPLACE.ME" + When the request is sent + Then the response status is 200 OK: The account details for the specified integration. + + @generated @skip @team:DataDog/saas-integrations + Scenario: List integration accounts returns "Bad Request: The integration name format is invalid." response + Given new "ListAmsIntegrationAccounts" request + And request contains "integration_name" parameter from "REPLACE.ME" + And request contains "interface_id" parameter from "REPLACE.ME" + When the request is sent + Then the response status is 400 Bad Request: The integration name format is invalid. + + @generated @skip @team:DataDog/saas-integrations + Scenario: List integration accounts returns "Not Found: The integration does not exist." response + Given new "ListAmsIntegrationAccounts" request + And request contains "integration_name" parameter from "REPLACE.ME" + And request contains "interface_id" parameter from "REPLACE.ME" + When the request is sent + Then the response status is 404 Not Found: The integration does not exist. + + @generated @skip @team:DataDog/saas-integrations + Scenario: List integration accounts returns "OK: List of all accounts for the specified integration." response + Given new "ListAmsIntegrationAccounts" request + And request contains "integration_name" parameter from "REPLACE.ME" + And request contains "interface_id" parameter from "REPLACE.ME" + When the request is sent + Then the response status is 200 OK: List of all accounts for the specified integration. + + @generated @skip @team:DataDog/saas-integrations + Scenario: Update integration account returns "Bad Request: The request body is malformed or the integration name/account ID format is invalid." response + Given new "UpdateAmsIntegrationAccount" request + And request contains "integration_name" parameter from "REPLACE.ME" + And request contains "interface_id" parameter from "REPLACE.ME" + And request contains "account_id" parameter from "REPLACE.ME" + And body with value {"data": {"attributes": {"name": "My Production Account (Updated)", "secrets": {"api_key_token": "new_secret_token_value"}, "settings": {"ccm_enabled": true, "events": true, "messages": false}}, "type": "Account"}} + When the request is sent + Then the response status is 400 Bad Request: The request body is malformed or the integration name/account ID format is invalid. + + @generated @skip @team:DataDog/saas-integrations + Scenario: Update integration account returns "Not Found: The integration or account does not exist." response + Given new "UpdateAmsIntegrationAccount" request + And request contains "integration_name" parameter from "REPLACE.ME" + And request contains "interface_id" parameter from "REPLACE.ME" + And request contains "account_id" parameter from "REPLACE.ME" + And body with value {"data": {"attributes": {"name": "My Production Account (Updated)", "secrets": {"api_key_token": "new_secret_token_value"}, "settings": {"ccm_enabled": true, "events": true, "messages": false}}, "type": "Account"}} + When the request is sent + Then the response status is 404 Not Found: The integration or account does not exist. + + @generated @skip @team:DataDog/saas-integrations + Scenario: Update integration account returns "OK: The account was successfully updated." response + Given new "UpdateAmsIntegrationAccount" request + And request contains "integration_name" parameter from "REPLACE.ME" + And request contains "interface_id" parameter from "REPLACE.ME" + And request contains "account_id" parameter from "REPLACE.ME" + And body with value {"data": {"attributes": {"name": "My Production Account (Updated)", "secrets": {"api_key_token": "new_secret_token_value"}, "settings": {"ccm_enabled": true, "events": true, "messages": false}}, "type": "Account"}} + When the request is sent + Then the response status is 200 OK: The account was successfully updated. + + @generated @skip @team:DataDog/saas-integrations + Scenario: Update integration account returns "Unprocessable Entity: The account configuration does not match the integration schema." response + Given new "UpdateAmsIntegrationAccount" request + And request contains "integration_name" parameter from "REPLACE.ME" + And request contains "interface_id" parameter from "REPLACE.ME" + And request contains "account_id" parameter from "REPLACE.ME" + And body with value {"data": {"attributes": {"name": "My Production Account (Updated)", "secrets": {"api_key_token": "new_secret_token_value"}, "settings": {"ccm_enabled": true, "events": true, "messages": false}}, "type": "Account"}} + When the request is sent + Then the response status is 422 Unprocessable Entity: The account configuration does not match the integration schema. diff --git a/tests/v2/features/undo.json b/tests/v2/features/undo.json index a5c43f6c0f..33e331e2b1 100644 --- a/tests/v2/features/undo.json +++ b/tests/v2/features/undo.json @@ -4191,6 +4191,57 @@ "type": "idempotent" } }, + "ListAmsIntegrationAccounts": { + "tag": "Integration Accounts", + "undo": { + "type": "safe" + } + }, + "CreateAmsIntegrationAccount": { + "tag": "Integration Accounts", + "undo": { + "operationId": "DeleteAmsIntegrationAccount", + "parameters": [ + { + "name": "integration_name", + "source": "integration_name" + }, + { + "name": "interface_id", + "source": "interface_id" + }, + { + "name": "account_id", + "source": "data.id" + } + ], + "type": "unsafe" + } + }, + "GetAmsIntegrationAccountSchema": { + "tag": "Integration Accounts", + "undo": { + "type": "safe" + } + }, + "DeleteAmsIntegrationAccount": { + "tag": "Integration Accounts", + "undo": { + "type": "idempotent" + } + }, + "GetAmsIntegrationAccount": { + "tag": "Integration Accounts", + "undo": { + "type": "safe" + } + }, + "UpdateAmsIntegrationAccount": { + "tag": "Integration Accounts", + "undo": { + "type": "idempotent" + } + }, "GetIPAllowlist": { "tag": "IP Allowlist", "undo": {