diff --git a/.generator/schemas/v2/openapi.yaml b/.generator/schemas/v2/openapi.yaml index 10f16a21b7..cc175b4553 100644 --- a/.generator/schemas/v2/openapi.yaml +++ b/.generator/schemas/v2/openapi.yaml @@ -10745,6 +10745,51 @@ components: - findings - project type: object + AttachLinearIssueRequest: + description: Request for attaching security findings to a Linear issue. + properties: + data: + $ref: "#/components/schemas/AttachLinearIssueRequestData" + required: + - data + type: object + AttachLinearIssueRequestData: + description: Data of the Linear issue to attach security findings to. + properties: + attributes: + $ref: "#/components/schemas/AttachLinearIssueRequestDataAttributes" + relationships: + $ref: "#/components/schemas/AttachLinearIssueRequestDataRelationships" + type: + $ref: "#/components/schemas/LinearIssuesDataType" + required: + - attributes + - relationships + - type + type: object + AttachLinearIssueRequestDataAttributes: + description: Attributes of the Linear issue to attach security findings to. + properties: + linear_issue_url: + description: URL of the Linear issue to attach security findings to. + example: "https://linear.app/your-workspace/issue/ENG-123" + type: string + required: + - linear_issue_url + type: object + AttachLinearIssueRequestDataRelationships: + description: Relationships of the Linear issue to attach security findings to. + properties: + findings: + $ref: "#/components/schemas/Findings" + description: Security findings to attach to the Linear issue. + project: + $ref: "#/components/schemas/CaseManagementProject" + description: Case management project with the Linear integration configured. It is used to attach security findings to the Linear issue. + required: + - findings + - project + type: object AttachServiceNowTicketRequest: description: Request for attaching security findings to a ServiceNow ticket. properties: @@ -23958,6 +24003,74 @@ components: - findings - project type: object + CreateLinearIssueRequestArray: + description: List of requests to create Linear issues for security findings. + properties: + data: + description: Array of Linear issue creation request data objects. + items: + $ref: "#/components/schemas/CreateLinearIssueRequestData" + type: array + required: + - data + type: object + CreateLinearIssueRequestData: + description: Data of the Linear issue to create. + properties: + attributes: + $ref: "#/components/schemas/CreateLinearIssueRequestDataAttributes" + relationships: + $ref: "#/components/schemas/CreateLinearIssueRequestDataRelationships" + type: + $ref: "#/components/schemas/LinearIssuesDataType" + required: + - type + type: object + CreateLinearIssueRequestDataAttributes: + description: Attributes of the Linear issue to create. + properties: + assignee_id: + description: Unique identifier of the Datadog user assigned to the Linear issue. + example: "f315bdaf-9ee7-4808-a9c1-99c15bf0f4d0" + type: string + description: + description: Description of the Linear issue. If not provided, the description will be automatically generated. + example: "A description of the Linear issue." + type: string + label_ids: + description: Linear label IDs to set on the created issue. + example: + - "a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d" + items: + description: A Linear label ID. + type: string + type: array + linear_project_id: + description: Unique identifier of the Linear project to pin the issue to. If not provided, the issue is not associated with a Linear project. + example: "d4c3b2a1-6f5e-8b7a-0d9c-2f1e4a3b6c5d" + type: string + priority: + $ref: "#/components/schemas/CasePriority" + description: Datadog case priority mapped to the Linear issue priority. If not provided, the priority will be automatically set to "NOT_DEFINED". + example: "P4" + title: + description: Title of the Linear issue. If not provided, the title will be automatically generated. + example: "A title for the Linear issue." + type: string + type: object + CreateLinearIssueRequestDataRelationships: + description: Relationships of the Linear issue to create. + properties: + findings: + $ref: "#/components/schemas/Findings" + description: Security findings to create a Linear issue for. + project: + $ref: "#/components/schemas/CaseManagementProject" + description: Case management project configured with the Linear integration. It is used to create the Linear issue. + required: + - findings + - project + type: object CreateMaintenanceRequest: description: Request object for creating a maintenance. example: @@ -36878,6 +36991,9 @@ components: description: Key of the case. example: "PROJ-123" type: string + linear_issue: + $ref: "#/components/schemas/FindingLinearIssue" + description: Linear issue associated with the case. modified_at: description: Timestamp of when the case was last modified. example: "2025-01-01T00:00:00.000Z" @@ -37010,6 +37126,44 @@ components: example: "https://domain.atlassian.net/browse/PROJ-123" type: string type: object + FindingLinearIssue: + description: Linear issue associated with the case. + properties: + error_message: + description: Error message if the Linear issue creation failed. + example: "Linear issue creation failed." + type: string + result: + $ref: "#/components/schemas/FindingLinearIssueResult" + status: + description: Status of the Linear issue creation. Can be "COMPLETED" if the Linear issue was created successfully, or "FAILED" if the Linear issue creation failed. + example: "COMPLETED" + type: string + type: object + FindingLinearIssueResult: + description: Result of the Linear issue creation. + properties: + account_id: + description: Account ID of the Linear workspace. + example: "463a8631-680e-455c-bfd3-3ed04d326eb7" + type: string + issue_id: + description: Unique identifier of the Linear issue. + example: "9c1e5f8a-2b3d-4c7e-8f6a-1d2e3f4a5b6c" + type: string + issue_key: + description: Key of the Linear issue. + example: "ENG-123" + type: string + team_id: + description: Team ID of the Linear issue. + example: "b5d3c8a1-7e6f-4d2c-9a8b-3c4d5e6f7a8b" + type: string + url: + description: URL of the Linear issue. + example: "https://linear.app/your-workspace/issue/ENG-123" + type: string + type: object FindingMute: additionalProperties: false description: Information about the mute status of this finding. @@ -56335,6 +56489,15 @@ components: type: string x-enum-varnames: - LICENSEREQUEST + LinearIssuesDataType: + default: linear_issues + description: Linear issues resource type. + enum: + - linear_issues + example: linear_issues + type: string + x-enum-varnames: + - LINEAR_ISSUES Links: description: The JSON:API links related to pagination. properties: @@ -173712,6 +173875,153 @@ paths: permissions: - security_monitoring_findings_write - appsec_vm_write + /api/v2/security/findings/linear_issues: + patch: + description: >- + Attach security findings to a Linear issue by providing the Linear issue URL. + + You can attach up to 50 security findings per Linear issue. If the Linear issue is not linked to any case, this operation will create a case for the security findings and link the Linear issue to the newly created case. Security findings that are already attached to another Linear issue will be detached from their previous Linear issue and attached to the specified Linear issue. + operationId: AttachLinearIssue + requestBody: + content: + application/json: + examples: + default: + value: + data: + attributes: + linear_issue_url: https://linear.app/your-workspace/issue/ENG-123 + relationships: + findings: + data: + - id: ZGVmLTAwcC1pZXJ-aS0wZjhjNjMyZDNmMzRlZTgzNw== + type: findings + project: + data: + id: aeadc05e-98a8-11ec-ac2c-da7ad0900001 + type: projects + type: linear_issues + schema: + $ref: "#/components/schemas/AttachLinearIssueRequest" + required: true + responses: + "200": + content: + application/json: + examples: + default: + value: + data: + attributes: + created_at: "2024-01-01T00:00:00+00:00" + description: A description of the Linear issue. + modified_at: "2024-01-01T00:00:00+00:00" + priority: P4 + status: OPEN + title: A title for the Linear issue. + id: 00000000-0000-0000-0000-000000000008 + type: cases + schema: + $ref: "#/components/schemas/FindingCaseResponse" + description: OK + "400": + $ref: "#/components/responses/BadRequestResponse" + "404": + $ref: "#/components/responses/NotFoundResponse" + "429": + $ref: "#/components/responses/TooManyRequestsResponse" + security: + - apiKeyAuth: [] + appKeyAuth: [] + - AuthZ: [] + summary: Attach security findings to a Linear issue + tags: + - "Security Monitoring" + x-codegen-request-body-name: body + "x-permission": + operator: OR + permissions: + - security_monitoring_findings_write + - appsec_vm_write + x-unstable: |- + **Note**: This endpoint is in preview and is subject to change. + If you have any feedback, contact [Datadog support](https://docs.datadoghq.com/help/). + post: + description: >- + Create Linear issues for security findings. + + This operation creates a case in Datadog and a Linear issue linked to that case for bidirectional sync between Datadog and Linear. You can create up to 50 Linear issues per request and associate up to 50 security findings per Linear issue. Security findings that are already attached to another Linear issue will be detached from their previous Linear issue and attached to the newly created Linear issue. + operationId: CreateLinearIssues + requestBody: + content: + application/json: + examples: + default: + value: + data: + - attributes: + assignee_id: f315bdaf-9ee7-4808-a9c1-99c15bf0f4d0 + description: A description of the Linear issue. + label_ids: + - a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d + linear_project_id: d4c3b2a1-6f5e-8b7a-0d9c-2f1e4a3b6c5d + priority: NOT_DEFINED + title: A title for the Linear issue. + relationships: + findings: + data: + - id: ZGVmLTAwcC1pZXJ-aS0wZjhjNjMyZDNmMzRlZTgzNw== + type: findings + project: + data: + id: aeadc05e-98a8-11ec-ac2c-da7ad0900001 + type: projects + type: linear_issues + schema: + $ref: "#/components/schemas/CreateLinearIssueRequestArray" + required: true + responses: + "201": + content: + application/json: + examples: + default: + value: + data: + - attributes: + created_at: "2024-01-01T00:00:00+00:00" + description: A description of the Linear issue. + modified_at: "2024-01-01T00:00:00+00:00" + priority: P4 + status: OPEN + title: A title for the Linear issue. + id: 00000000-0000-0000-0000-000000000007 + type: cases + schema: + $ref: "#/components/schemas/FindingCaseResponseArray" + description: Created + "400": + $ref: "#/components/responses/BadRequestResponse" + "404": + $ref: "#/components/responses/NotFoundResponse" + "429": + $ref: "#/components/responses/TooManyRequestsResponse" + security: + - apiKeyAuth: [] + appKeyAuth: [] + - AuthZ: [] + summary: Create Linear issues for security findings + tags: + - "Security Monitoring" + x-codegen-request-body-name: body + "x-permission": + operator: OR + permissions: + - security_monitoring_findings_write + - appsec_vm_write + x-unstable: |- + **Note**: This endpoint is in preview and is subject to change. + If you have any feedback, contact [Datadog support](https://docs.datadoghq.com/help/). /api/v2/security/findings/mute: patch: description: >- diff --git a/docs/datadog_api_client.v2.model.rst b/docs/datadog_api_client.v2.model.rst index 2a9b95be14..931f3267fa 100644 --- a/docs/datadog_api_client.v2.model.rst +++ b/docs/datadog_api_client.v2.model.rst @@ -2608,6 +2608,34 @@ datadog\_api\_client.v2.model.attach\_jira\_issue\_request\_data\_relationships :members: :show-inheritance: +datadog\_api\_client.v2.model.attach\_linear\_issue\_request module +------------------------------------------------------------------- + +.. automodule:: datadog_api_client.v2.model.attach_linear_issue_request + :members: + :show-inheritance: + +datadog\_api\_client.v2.model.attach\_linear\_issue\_request\_data module +------------------------------------------------------------------------- + +.. automodule:: datadog_api_client.v2.model.attach_linear_issue_request_data + :members: + :show-inheritance: + +datadog\_api\_client.v2.model.attach\_linear\_issue\_request\_data\_attributes module +------------------------------------------------------------------------------------- + +.. automodule:: datadog_api_client.v2.model.attach_linear_issue_request_data_attributes + :members: + :show-inheritance: + +datadog\_api\_client.v2.model.attach\_linear\_issue\_request\_data\_relationships module +---------------------------------------------------------------------------------------- + +.. automodule:: datadog_api_client.v2.model.attach_linear_issue_request_data_relationships + :members: + :show-inheritance: + datadog\_api\_client.v2.model.attach\_service\_now\_ticket\_request module -------------------------------------------------------------------------- @@ -9146,6 +9174,34 @@ datadog\_api\_client.v2.model.create\_jira\_issue\_request\_data\_relationships :members: :show-inheritance: +datadog\_api\_client.v2.model.create\_linear\_issue\_request\_array module +-------------------------------------------------------------------------- + +.. automodule:: datadog_api_client.v2.model.create_linear_issue_request_array + :members: + :show-inheritance: + +datadog\_api\_client.v2.model.create\_linear\_issue\_request\_data module +------------------------------------------------------------------------- + +.. automodule:: datadog_api_client.v2.model.create_linear_issue_request_data + :members: + :show-inheritance: + +datadog\_api\_client.v2.model.create\_linear\_issue\_request\_data\_attributes module +------------------------------------------------------------------------------------- + +.. automodule:: datadog_api_client.v2.model.create_linear_issue_request_data_attributes + :members: + :show-inheritance: + +datadog\_api\_client.v2.model.create\_linear\_issue\_request\_data\_relationships module +---------------------------------------------------------------------------------------- + +.. automodule:: datadog_api_client.v2.model.create_linear_issue_request_data_relationships + :members: + :show-inheritance: + datadog\_api\_client.v2.model.create\_maintenance\_request module ----------------------------------------------------------------- @@ -14844,6 +14900,20 @@ datadog\_api\_client.v2.model.finding\_jira\_issue\_result module :members: :show-inheritance: +datadog\_api\_client.v2.model.finding\_linear\_issue module +----------------------------------------------------------- + +.. automodule:: datadog_api_client.v2.model.finding_linear_issue + :members: + :show-inheritance: + +datadog\_api\_client.v2.model.finding\_linear\_issue\_result module +------------------------------------------------------------------- + +.. automodule:: datadog_api_client.v2.model.finding_linear_issue_result + :members: + :show-inheritance: + datadog\_api\_client.v2.model.finding\_mute module -------------------------------------------------- @@ -20472,6 +20542,13 @@ datadog\_api\_client.v2.model.licenses\_list\_response\_data\_type module :members: :show-inheritance: +datadog\_api\_client.v2.model.linear\_issues\_data\_type module +--------------------------------------------------------------- + +.. automodule:: datadog_api_client.v2.model.linear_issues_data_type + :members: + :show-inheritance: + datadog\_api\_client.v2.model.links module ------------------------------------------ diff --git a/examples/v2/security-monitoring/AttachLinearIssue.py b/examples/v2/security-monitoring/AttachLinearIssue.py new file mode 100644 index 0000000000..68d5123d00 --- /dev/null +++ b/examples/v2/security-monitoring/AttachLinearIssue.py @@ -0,0 +1,54 @@ +""" +Attach security findings to a Linear issue returns "OK" response +""" + +from datadog_api_client import ApiClient, Configuration +from datadog_api_client.v2.api.security_monitoring_api import SecurityMonitoringApi +from datadog_api_client.v2.model.attach_linear_issue_request import AttachLinearIssueRequest +from datadog_api_client.v2.model.attach_linear_issue_request_data import AttachLinearIssueRequestData +from datadog_api_client.v2.model.attach_linear_issue_request_data_attributes import ( + AttachLinearIssueRequestDataAttributes, +) +from datadog_api_client.v2.model.attach_linear_issue_request_data_relationships import ( + AttachLinearIssueRequestDataRelationships, +) +from datadog_api_client.v2.model.case_management_project import CaseManagementProject +from datadog_api_client.v2.model.case_management_project_data import CaseManagementProjectData +from datadog_api_client.v2.model.case_management_project_data_type import CaseManagementProjectDataType +from datadog_api_client.v2.model.finding_data import FindingData +from datadog_api_client.v2.model.finding_data_type import FindingDataType +from datadog_api_client.v2.model.findings import Findings +from datadog_api_client.v2.model.linear_issues_data_type import LinearIssuesDataType + +body = AttachLinearIssueRequest( + data=AttachLinearIssueRequestData( + attributes=AttachLinearIssueRequestDataAttributes( + linear_issue_url="https://linear.app/your-workspace/issue/ENG-123", + ), + relationships=AttachLinearIssueRequestDataRelationships( + findings=Findings( + data=[ + FindingData( + id="ZGVmLTAwcC1pZXJ-aS0wZjhjNjMyZDNmMzRlZTgzNw==", + type=FindingDataType.FINDINGS, + ), + ], + ), + project=CaseManagementProject( + data=CaseManagementProjectData( + id="aeadc05e-98a8-11ec-ac2c-da7ad0900001", + type=CaseManagementProjectDataType.PROJECTS, + ), + ), + ), + type=LinearIssuesDataType.LINEAR_ISSUES, + ), +) + +configuration = Configuration() +configuration.unstable_operations["attach_linear_issue"] = True +with ApiClient(configuration) as api_client: + api_instance = SecurityMonitoringApi(api_client) + response = api_instance.attach_linear_issue(body=body) + + print(response) diff --git a/examples/v2/security-monitoring/CreateLinearIssues.py b/examples/v2/security-monitoring/CreateLinearIssues.py new file mode 100644 index 0000000000..fef00d5124 --- /dev/null +++ b/examples/v2/security-monitoring/CreateLinearIssues.py @@ -0,0 +1,64 @@ +""" +Create Linear issues for security findings returns "Created" response +""" + +from datadog_api_client import ApiClient, Configuration +from datadog_api_client.v2.api.security_monitoring_api import SecurityMonitoringApi +from datadog_api_client.v2.model.case_management_project import CaseManagementProject +from datadog_api_client.v2.model.case_management_project_data import CaseManagementProjectData +from datadog_api_client.v2.model.case_management_project_data_type import CaseManagementProjectDataType +from datadog_api_client.v2.model.case_priority import CasePriority +from datadog_api_client.v2.model.create_linear_issue_request_array import CreateLinearIssueRequestArray +from datadog_api_client.v2.model.create_linear_issue_request_data import CreateLinearIssueRequestData +from datadog_api_client.v2.model.create_linear_issue_request_data_attributes import ( + CreateLinearIssueRequestDataAttributes, +) +from datadog_api_client.v2.model.create_linear_issue_request_data_relationships import ( + CreateLinearIssueRequestDataRelationships, +) +from datadog_api_client.v2.model.finding_data import FindingData +from datadog_api_client.v2.model.finding_data_type import FindingDataType +from datadog_api_client.v2.model.findings import Findings +from datadog_api_client.v2.model.linear_issues_data_type import LinearIssuesDataType + +body = CreateLinearIssueRequestArray( + data=[ + CreateLinearIssueRequestData( + attributes=CreateLinearIssueRequestDataAttributes( + assignee_id="f315bdaf-9ee7-4808-a9c1-99c15bf0f4d0", + description="A description of the Linear issue.", + label_ids=[ + "a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d", + ], + linear_project_id="d4c3b2a1-6f5e-8b7a-0d9c-2f1e4a3b6c5d", + priority=CasePriority.NOT_DEFINED, + title="A title for the Linear issue.", + ), + relationships=CreateLinearIssueRequestDataRelationships( + findings=Findings( + data=[ + FindingData( + id="ZGVmLTAwcC1pZXJ-aS0wZjhjNjMyZDNmMzRlZTgzNw==", + type=FindingDataType.FINDINGS, + ), + ], + ), + project=CaseManagementProject( + data=CaseManagementProjectData( + id="aeadc05e-98a8-11ec-ac2c-da7ad0900001", + type=CaseManagementProjectDataType.PROJECTS, + ), + ), + ), + type=LinearIssuesDataType.LINEAR_ISSUES, + ), + ], +) + +configuration = Configuration() +configuration.unstable_operations["create_linear_issues"] = True +with ApiClient(configuration) as api_client: + api_instance = SecurityMonitoringApi(api_client) + response = api_instance.create_linear_issues(body=body) + + print(response) diff --git a/src/datadog_api_client/configuration.py b/src/datadog_api_client/configuration.py index 09ccfd74c7..3601b753e7 100644 --- a/src/datadog_api_client/configuration.py +++ b/src/datadog_api_client/configuration.py @@ -395,6 +395,7 @@ def __init__( "v2.get_aws_cloud_auth_persona_mapping": False, "v2.list_aws_cloud_auth_persona_mappings": False, "v2.activate_content_pack": False, + "v2.attach_linear_issue": False, "v2.batch_get_security_monitoring_dataset_dependencies": False, "v2.bulk_create_sample_log_generation_subscriptions": False, "v2.bulk_export_security_monitoring_terraform_resources": False, @@ -402,6 +403,7 @@ def __init__( "v2.convert_job_result_to_signal": False, "v2.convert_security_monitoring_terraform_resource": False, "v2.create_io_c_triage_state": False, + "v2.create_linear_issues": False, "v2.create_sample_log_generation_subscription": False, "v2.create_security_findings_automation_due_date_rule": False, "v2.create_security_findings_automation_mute_rule": False, diff --git a/src/datadog_api_client/v2/api/security_monitoring_api.py b/src/datadog_api_client/v2/api/security_monitoring_api.py index 1042297bc7..d521a21b5b 100644 --- a/src/datadog_api_client/v2/api/security_monitoring_api.py +++ b/src/datadog_api_client/v2/api/security_monitoring_api.py @@ -64,6 +64,8 @@ from datadog_api_client.v2.model.attach_case_request import AttachCaseRequest from datadog_api_client.v2.model.attach_jira_issue_request import AttachJiraIssueRequest from datadog_api_client.v2.model.create_jira_issue_request_array import CreateJiraIssueRequestArray +from datadog_api_client.v2.model.attach_linear_issue_request import AttachLinearIssueRequest +from datadog_api_client.v2.model.create_linear_issue_request_array import CreateLinearIssueRequestArray from datadog_api_client.v2.model.mute_findings_response import MuteFindingsResponse from datadog_api_client.v2.model.mute_findings_request import MuteFindingsRequest from datadog_api_client.v2.model.security_findings_search_request import SecurityFindingsSearchRequest @@ -361,6 +363,26 @@ def __init__(self, api_client=None): api_client=api_client, ) + self._attach_linear_issue_endpoint = _Endpoint( + settings={ + "response_type": (FindingCaseResponse,), + "auth": ["apiKeyAuth", "appKeyAuth", "AuthZ"], + "endpoint_path": "/api/v2/security/findings/linear_issues", + "operation_id": "attach_linear_issue", + "http_method": "PATCH", + "version": "v2", + }, + params_map={ + "body": { + "required": True, + "openapi_types": (AttachLinearIssueRequest,), + "location": "body", + }, + }, + headers_map={"accept": ["application/json"], "content_type": ["application/json"]}, + api_client=api_client, + ) + self._attach_service_now_ticket_endpoint = _Endpoint( settings={ "response_type": (FindingCaseResponse,), @@ -759,6 +781,26 @@ def __init__(self, api_client=None): api_client=api_client, ) + self._create_linear_issues_endpoint = _Endpoint( + settings={ + "response_type": (FindingCaseResponseArray,), + "auth": ["apiKeyAuth", "appKeyAuth", "AuthZ"], + "endpoint_path": "/api/v2/security/findings/linear_issues", + "operation_id": "create_linear_issues", + "http_method": "POST", + "version": "v2", + }, + params_map={ + "body": { + "required": True, + "openapi_types": (CreateLinearIssueRequestArray,), + "location": "body", + }, + }, + headers_map={"accept": ["application/json"], "content_type": ["application/json"]}, + api_client=api_client, + ) + self._create_sample_log_generation_subscription_endpoint = _Endpoint( settings={ "response_type": (SampleLogGenerationSubscriptionResponse,), @@ -4570,6 +4612,23 @@ def attach_jira_issue( return self._attach_jira_issue_endpoint.call_with_http_info(**kwargs) + def attach_linear_issue( + self, + body: AttachLinearIssueRequest, + ) -> FindingCaseResponse: + """Attach security findings to a Linear issue. + + Attach security findings to a Linear issue by providing the Linear issue URL. + You can attach up to 50 security findings per Linear issue. If the Linear issue is not linked to any case, this operation will create a case for the security findings and link the Linear issue to the newly created case. Security findings that are already attached to another Linear issue will be detached from their previous Linear issue and attached to the specified Linear issue. + + :type body: AttachLinearIssueRequest + :rtype: FindingCaseResponse + """ + kwargs: Dict[str, Any] = {} + kwargs["body"] = body + + return self._attach_linear_issue_endpoint.call_with_http_info(**kwargs) + def attach_service_now_ticket( self, body: AttachServiceNowTicketRequest, @@ -4939,6 +4998,23 @@ def create_jira_issues( return self._create_jira_issues_endpoint.call_with_http_info(**kwargs) + def create_linear_issues( + self, + body: CreateLinearIssueRequestArray, + ) -> FindingCaseResponseArray: + """Create Linear issues for security findings. + + Create Linear issues for security findings. + This operation creates a case in Datadog and a Linear issue linked to that case for bidirectional sync between Datadog and Linear. You can create up to 50 Linear issues per request and associate up to 50 security findings per Linear issue. Security findings that are already attached to another Linear issue will be detached from their previous Linear issue and attached to the newly created Linear issue. + + :type body: CreateLinearIssueRequestArray + :rtype: FindingCaseResponseArray + """ + kwargs: Dict[str, Any] = {} + kwargs["body"] = body + + return self._create_linear_issues_endpoint.call_with_http_info(**kwargs) + def create_sample_log_generation_subscription( self, body: SampleLogGenerationSubscriptionCreateRequest, diff --git a/src/datadog_api_client/v2/model/attach_linear_issue_request.py b/src/datadog_api_client/v2/model/attach_linear_issue_request.py new file mode 100644 index 0000000000..987453042c --- /dev/null +++ b/src/datadog_api_client/v2/model/attach_linear_issue_request.py @@ -0,0 +1,40 @@ +# Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019-Present Datadog, Inc. +from __future__ import annotations + +from typing import TYPE_CHECKING + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, +) + + +if TYPE_CHECKING: + from datadog_api_client.v2.model.attach_linear_issue_request_data import AttachLinearIssueRequestData + + +class AttachLinearIssueRequest(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.attach_linear_issue_request_data import AttachLinearIssueRequestData + + return { + "data": (AttachLinearIssueRequestData,), + } + + attribute_map = { + "data": "data", + } + + def __init__(self_, data: AttachLinearIssueRequestData, **kwargs): + """ + Request for attaching security findings to a Linear issue. + + :param data: Data of the Linear issue to attach security findings to. + :type data: AttachLinearIssueRequestData + """ + super().__init__(kwargs) + + self_.data = data diff --git a/src/datadog_api_client/v2/model/attach_linear_issue_request_data.py b/src/datadog_api_client/v2/model/attach_linear_issue_request_data.py new file mode 100644 index 0000000000..44f47b679a --- /dev/null +++ b/src/datadog_api_client/v2/model/attach_linear_issue_request_data.py @@ -0,0 +1,70 @@ +# 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.attach_linear_issue_request_data_attributes import ( + AttachLinearIssueRequestDataAttributes, + ) + from datadog_api_client.v2.model.attach_linear_issue_request_data_relationships import ( + AttachLinearIssueRequestDataRelationships, + ) + from datadog_api_client.v2.model.linear_issues_data_type import LinearIssuesDataType + + +class AttachLinearIssueRequestData(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.attach_linear_issue_request_data_attributes import ( + AttachLinearIssueRequestDataAttributes, + ) + from datadog_api_client.v2.model.attach_linear_issue_request_data_relationships import ( + AttachLinearIssueRequestDataRelationships, + ) + from datadog_api_client.v2.model.linear_issues_data_type import LinearIssuesDataType + + return { + "attributes": (AttachLinearIssueRequestDataAttributes,), + "relationships": (AttachLinearIssueRequestDataRelationships,), + "type": (LinearIssuesDataType,), + } + + attribute_map = { + "attributes": "attributes", + "relationships": "relationships", + "type": "type", + } + + def __init__( + self_, + attributes: AttachLinearIssueRequestDataAttributes, + relationships: AttachLinearIssueRequestDataRelationships, + type: LinearIssuesDataType, + **kwargs, + ): + """ + Data of the Linear issue to attach security findings to. + + :param attributes: Attributes of the Linear issue to attach security findings to. + :type attributes: AttachLinearIssueRequestDataAttributes + + :param relationships: Relationships of the Linear issue to attach security findings to. + :type relationships: AttachLinearIssueRequestDataRelationships + + :param type: Linear issues resource type. + :type type: LinearIssuesDataType + """ + super().__init__(kwargs) + + self_.attributes = attributes + self_.relationships = relationships + self_.type = type diff --git a/src/datadog_api_client/v2/model/attach_linear_issue_request_data_attributes.py b/src/datadog_api_client/v2/model/attach_linear_issue_request_data_attributes.py new file mode 100644 index 0000000000..4f70d48be0 --- /dev/null +++ b/src/datadog_api_client/v2/model/attach_linear_issue_request_data_attributes.py @@ -0,0 +1,33 @@ +# Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019-Present Datadog, Inc. +from __future__ import annotations + + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, +) + + +class AttachLinearIssueRequestDataAttributes(ModelNormal): + @cached_property + def openapi_types(_): + return { + "linear_issue_url": (str,), + } + + attribute_map = { + "linear_issue_url": "linear_issue_url", + } + + def __init__(self_, linear_issue_url: str, **kwargs): + """ + Attributes of the Linear issue to attach security findings to. + + :param linear_issue_url: URL of the Linear issue to attach security findings to. + :type linear_issue_url: str + """ + super().__init__(kwargs) + + self_.linear_issue_url = linear_issue_url diff --git a/src/datadog_api_client/v2/model/attach_linear_issue_request_data_relationships.py b/src/datadog_api_client/v2/model/attach_linear_issue_request_data_relationships.py new file mode 100644 index 0000000000..ba666c9131 --- /dev/null +++ b/src/datadog_api_client/v2/model/attach_linear_issue_request_data_relationships.py @@ -0,0 +1,48 @@ +# 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.findings import Findings + from datadog_api_client.v2.model.case_management_project import CaseManagementProject + + +class AttachLinearIssueRequestDataRelationships(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.findings import Findings + from datadog_api_client.v2.model.case_management_project import CaseManagementProject + + return { + "findings": (Findings,), + "project": (CaseManagementProject,), + } + + attribute_map = { + "findings": "findings", + "project": "project", + } + + def __init__(self_, findings: Findings, project: CaseManagementProject, **kwargs): + """ + Relationships of the Linear issue to attach security findings to. + + :param findings: A list of security findings. + :type findings: Findings + + :param project: Case management project. + :type project: CaseManagementProject + """ + super().__init__(kwargs) + + self_.findings = findings + self_.project = project diff --git a/src/datadog_api_client/v2/model/create_linear_issue_request_array.py b/src/datadog_api_client/v2/model/create_linear_issue_request_array.py new file mode 100644 index 0000000000..58b1847390 --- /dev/null +++ b/src/datadog_api_client/v2/model/create_linear_issue_request_array.py @@ -0,0 +1,40 @@ +# Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019-Present Datadog, Inc. +from __future__ import annotations + +from typing import List, TYPE_CHECKING + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, +) + + +if TYPE_CHECKING: + from datadog_api_client.v2.model.create_linear_issue_request_data import CreateLinearIssueRequestData + + +class CreateLinearIssueRequestArray(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.create_linear_issue_request_data import CreateLinearIssueRequestData + + return { + "data": ([CreateLinearIssueRequestData],), + } + + attribute_map = { + "data": "data", + } + + def __init__(self_, data: List[CreateLinearIssueRequestData], **kwargs): + """ + List of requests to create Linear issues for security findings. + + :param data: Array of Linear issue creation request data objects. + :type data: [CreateLinearIssueRequestData] + """ + super().__init__(kwargs) + + self_.data = data diff --git a/src/datadog_api_client/v2/model/create_linear_issue_request_data.py b/src/datadog_api_client/v2/model/create_linear_issue_request_data.py new file mode 100644 index 0000000000..f6fc48a6ad --- /dev/null +++ b/src/datadog_api_client/v2/model/create_linear_issue_request_data.py @@ -0,0 +1,74 @@ +# Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019-Present Datadog, Inc. +from __future__ import annotations + +from typing import Union, TYPE_CHECKING + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, + unset, + UnsetType, +) + + +if TYPE_CHECKING: + from datadog_api_client.v2.model.create_linear_issue_request_data_attributes import ( + CreateLinearIssueRequestDataAttributes, + ) + from datadog_api_client.v2.model.create_linear_issue_request_data_relationships import ( + CreateLinearIssueRequestDataRelationships, + ) + from datadog_api_client.v2.model.linear_issues_data_type import LinearIssuesDataType + + +class CreateLinearIssueRequestData(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.create_linear_issue_request_data_attributes import ( + CreateLinearIssueRequestDataAttributes, + ) + from datadog_api_client.v2.model.create_linear_issue_request_data_relationships import ( + CreateLinearIssueRequestDataRelationships, + ) + from datadog_api_client.v2.model.linear_issues_data_type import LinearIssuesDataType + + return { + "attributes": (CreateLinearIssueRequestDataAttributes,), + "relationships": (CreateLinearIssueRequestDataRelationships,), + "type": (LinearIssuesDataType,), + } + + attribute_map = { + "attributes": "attributes", + "relationships": "relationships", + "type": "type", + } + + def __init__( + self_, + type: LinearIssuesDataType, + attributes: Union[CreateLinearIssueRequestDataAttributes, UnsetType] = unset, + relationships: Union[CreateLinearIssueRequestDataRelationships, UnsetType] = unset, + **kwargs, + ): + """ + Data of the Linear issue to create. + + :param attributes: Attributes of the Linear issue to create. + :type attributes: CreateLinearIssueRequestDataAttributes, optional + + :param relationships: Relationships of the Linear issue to create. + :type relationships: CreateLinearIssueRequestDataRelationships, optional + + :param type: Linear issues resource type. + :type type: LinearIssuesDataType + """ + if attributes is not unset: + kwargs["attributes"] = attributes + if relationships is not unset: + kwargs["relationships"] = relationships + super().__init__(kwargs) + + self_.type = type diff --git a/src/datadog_api_client/v2/model/create_linear_issue_request_data_attributes.py b/src/datadog_api_client/v2/model/create_linear_issue_request_data_attributes.py new file mode 100644 index 0000000000..491c7d5588 --- /dev/null +++ b/src/datadog_api_client/v2/model/create_linear_issue_request_data_attributes.py @@ -0,0 +1,86 @@ +# 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.case_priority import CasePriority + + +class CreateLinearIssueRequestDataAttributes(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.case_priority import CasePriority + + return { + "assignee_id": (str,), + "description": (str,), + "label_ids": ([str],), + "linear_project_id": (str,), + "priority": (CasePriority,), + "title": (str,), + } + + attribute_map = { + "assignee_id": "assignee_id", + "description": "description", + "label_ids": "label_ids", + "linear_project_id": "linear_project_id", + "priority": "priority", + "title": "title", + } + + def __init__( + self_, + assignee_id: Union[str, UnsetType] = unset, + description: Union[str, UnsetType] = unset, + label_ids: Union[List[str], UnsetType] = unset, + linear_project_id: Union[str, UnsetType] = unset, + priority: Union[CasePriority, UnsetType] = unset, + title: Union[str, UnsetType] = unset, + **kwargs, + ): + """ + Attributes of the Linear issue to create. + + :param assignee_id: Unique identifier of the Datadog user assigned to the Linear issue. + :type assignee_id: str, optional + + :param description: Description of the Linear issue. If not provided, the description will be automatically generated. + :type description: str, optional + + :param label_ids: Linear label IDs to set on the created issue. + :type label_ids: [str], optional + + :param linear_project_id: Unique identifier of the Linear project to pin the issue to. If not provided, the issue is not associated with a Linear project. + :type linear_project_id: str, optional + + :param priority: Case priority + :type priority: CasePriority, optional + + :param title: Title of the Linear issue. If not provided, the title will be automatically generated. + :type title: str, optional + """ + if assignee_id is not unset: + kwargs["assignee_id"] = assignee_id + if description is not unset: + kwargs["description"] = description + if label_ids is not unset: + kwargs["label_ids"] = label_ids + if linear_project_id is not unset: + kwargs["linear_project_id"] = linear_project_id + if priority is not unset: + kwargs["priority"] = priority + if title is not unset: + kwargs["title"] = title + super().__init__(kwargs) diff --git a/src/datadog_api_client/v2/model/create_linear_issue_request_data_relationships.py b/src/datadog_api_client/v2/model/create_linear_issue_request_data_relationships.py new file mode 100644 index 0000000000..53242ce149 --- /dev/null +++ b/src/datadog_api_client/v2/model/create_linear_issue_request_data_relationships.py @@ -0,0 +1,48 @@ +# 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.findings import Findings + from datadog_api_client.v2.model.case_management_project import CaseManagementProject + + +class CreateLinearIssueRequestDataRelationships(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.findings import Findings + from datadog_api_client.v2.model.case_management_project import CaseManagementProject + + return { + "findings": (Findings,), + "project": (CaseManagementProject,), + } + + attribute_map = { + "findings": "findings", + "project": "project", + } + + def __init__(self_, findings: Findings, project: CaseManagementProject, **kwargs): + """ + Relationships of the Linear issue to create. + + :param findings: A list of security findings. + :type findings: Findings + + :param project: Case management project. + :type project: CaseManagementProject + """ + super().__init__(kwargs) + + self_.findings = findings + self_.project = project diff --git a/src/datadog_api_client/v2/model/finding_case_response_data_attributes.py b/src/datadog_api_client/v2/model/finding_case_response_data_attributes.py index 68707b36a0..0c40ac95fc 100644 --- a/src/datadog_api_client/v2/model/finding_case_response_data_attributes.py +++ b/src/datadog_api_client/v2/model/finding_case_response_data_attributes.py @@ -18,6 +18,7 @@ from datadog_api_client.v2.model.relationship_to_user import RelationshipToUser from datadog_api_client.v2.model.case_insights_items import CaseInsightsItems from datadog_api_client.v2.model.finding_jira_issue import FindingJiraIssue + from datadog_api_client.v2.model.finding_linear_issue import FindingLinearIssue from datadog_api_client.v2.model.finding_service_now_ticket import FindingServiceNowTicket @@ -27,6 +28,7 @@ def openapi_types(_): from datadog_api_client.v2.model.relationship_to_user import RelationshipToUser from datadog_api_client.v2.model.case_insights_items import CaseInsightsItems from datadog_api_client.v2.model.finding_jira_issue import FindingJiraIssue + from datadog_api_client.v2.model.finding_linear_issue import FindingLinearIssue from datadog_api_client.v2.model.finding_service_now_ticket import FindingServiceNowTicket return { @@ -41,6 +43,7 @@ def openapi_types(_): "insights": ([CaseInsightsItems],), "jira_issue": (FindingJiraIssue,), "key": (str,), + "linear_issue": (FindingLinearIssue,), "modified_at": (datetime,), "priority": (str,), "servicenow_ticket": (FindingServiceNowTicket,), @@ -63,6 +66,7 @@ def openapi_types(_): "insights": "insights", "jira_issue": "jira_issue", "key": "key", + "linear_issue": "linear_issue", "modified_at": "modified_at", "priority": "priority", "servicenow_ticket": "servicenow_ticket", @@ -86,6 +90,7 @@ def __init__( insights: Union[List[CaseInsightsItems], UnsetType] = unset, jira_issue: Union[FindingJiraIssue, UnsetType] = unset, key: Union[str, UnsetType] = unset, + linear_issue: Union[FindingLinearIssue, UnsetType] = unset, modified_at: Union[datetime, UnsetType] = unset, priority: Union[str, UnsetType] = unset, servicenow_ticket: Union[FindingServiceNowTicket, UnsetType] = unset, @@ -132,6 +137,9 @@ def __init__( :param key: Key of the case. :type key: str, optional + :param linear_issue: Linear issue associated with the case. + :type linear_issue: FindingLinearIssue, optional + :param modified_at: Timestamp of when the case was last modified. :type modified_at: datetime, optional @@ -178,6 +186,8 @@ def __init__( kwargs["jira_issue"] = jira_issue if key is not unset: kwargs["key"] = key + if linear_issue is not unset: + kwargs["linear_issue"] = linear_issue if modified_at is not unset: kwargs["modified_at"] = modified_at if priority is not unset: diff --git a/src/datadog_api_client/v2/model/finding_linear_issue.py b/src/datadog_api_client/v2/model/finding_linear_issue.py new file mode 100644 index 0000000000..5e5d444910 --- /dev/null +++ b/src/datadog_api_client/v2/model/finding_linear_issue.py @@ -0,0 +1,62 @@ +# 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.finding_linear_issue_result import FindingLinearIssueResult + + +class FindingLinearIssue(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.finding_linear_issue_result import FindingLinearIssueResult + + return { + "error_message": (str,), + "result": (FindingLinearIssueResult,), + "status": (str,), + } + + attribute_map = { + "error_message": "error_message", + "result": "result", + "status": "status", + } + + def __init__( + self_, + error_message: Union[str, UnsetType] = unset, + result: Union[FindingLinearIssueResult, UnsetType] = unset, + status: Union[str, UnsetType] = unset, + **kwargs, + ): + """ + Linear issue associated with the case. + + :param error_message: Error message if the Linear issue creation failed. + :type error_message: str, optional + + :param result: Result of the Linear issue creation. + :type result: FindingLinearIssueResult, optional + + :param status: Status of the Linear issue creation. Can be "COMPLETED" if the Linear issue was created successfully, or "FAILED" if the Linear issue creation failed. + :type status: str, optional + """ + if error_message is not unset: + kwargs["error_message"] = error_message + if result is not unset: + kwargs["result"] = result + if status is not unset: + kwargs["status"] = status + super().__init__(kwargs) diff --git a/src/datadog_api_client/v2/model/finding_linear_issue_result.py b/src/datadog_api_client/v2/model/finding_linear_issue_result.py new file mode 100644 index 0000000000..3369321152 --- /dev/null +++ b/src/datadog_api_client/v2/model/finding_linear_issue_result.py @@ -0,0 +1,72 @@ +# Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019-Present Datadog, Inc. +from __future__ import annotations + +from typing import Union + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, + unset, + UnsetType, +) + + +class FindingLinearIssueResult(ModelNormal): + @cached_property + def openapi_types(_): + return { + "account_id": (str,), + "issue_id": (str,), + "issue_key": (str,), + "team_id": (str,), + "url": (str,), + } + + attribute_map = { + "account_id": "account_id", + "issue_id": "issue_id", + "issue_key": "issue_key", + "team_id": "team_id", + "url": "url", + } + + def __init__( + self_, + account_id: Union[str, UnsetType] = unset, + issue_id: Union[str, UnsetType] = unset, + issue_key: Union[str, UnsetType] = unset, + team_id: Union[str, UnsetType] = unset, + url: Union[str, UnsetType] = unset, + **kwargs, + ): + """ + Result of the Linear issue creation. + + :param account_id: Account ID of the Linear workspace. + :type account_id: str, optional + + :param issue_id: Unique identifier of the Linear issue. + :type issue_id: str, optional + + :param issue_key: Key of the Linear issue. + :type issue_key: str, optional + + :param team_id: Team ID of the Linear issue. + :type team_id: str, optional + + :param url: URL of the Linear issue. + :type url: str, optional + """ + if account_id is not unset: + kwargs["account_id"] = account_id + if issue_id is not unset: + kwargs["issue_id"] = issue_id + if issue_key is not unset: + kwargs["issue_key"] = issue_key + if team_id is not unset: + kwargs["team_id"] = team_id + if url is not unset: + kwargs["url"] = url + super().__init__(kwargs) diff --git a/src/datadog_api_client/v2/model/linear_issues_data_type.py b/src/datadog_api_client/v2/model/linear_issues_data_type.py new file mode 100644 index 0000000000..f9830e2670 --- /dev/null +++ b/src/datadog_api_client/v2/model/linear_issues_data_type.py @@ -0,0 +1,35 @@ +# Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019-Present Datadog, Inc. +from __future__ import annotations + + +from datadog_api_client.model_utils import ( + ModelSimple, + cached_property, +) + +from typing import ClassVar + + +class LinearIssuesDataType(ModelSimple): + """ + Linear issues resource type. + + :param value: If omitted defaults to "linear_issues". Must be one of ["linear_issues"]. + :type value: str + """ + + allowed_values = { + "linear_issues", + } + LINEAR_ISSUES: ClassVar["LinearIssuesDataType"] + + @cached_property + def openapi_types(_): + return { + "value": (str,), + } + + +LinearIssuesDataType.LINEAR_ISSUES = LinearIssuesDataType("linear_issues") diff --git a/src/datadog_api_client/v2/models/__init__.py b/src/datadog_api_client/v2/models/__init__.py index 4cfffe4e86..42f3a26f60 100644 --- a/src/datadog_api_client/v2/models/__init__.py +++ b/src/datadog_api_client/v2/models/__init__.py @@ -626,6 +626,14 @@ from datadog_api_client.v2.model.attach_jira_issue_request_data_relationships import ( AttachJiraIssueRequestDataRelationships, ) +from datadog_api_client.v2.model.attach_linear_issue_request import AttachLinearIssueRequest +from datadog_api_client.v2.model.attach_linear_issue_request_data import AttachLinearIssueRequestData +from datadog_api_client.v2.model.attach_linear_issue_request_data_attributes import ( + AttachLinearIssueRequestDataAttributes, +) +from datadog_api_client.v2.model.attach_linear_issue_request_data_relationships import ( + AttachLinearIssueRequestDataRelationships, +) from datadog_api_client.v2.model.attach_service_now_ticket_request import AttachServiceNowTicketRequest from datadog_api_client.v2.model.attach_service_now_ticket_request_data import AttachServiceNowTicketRequestData from datadog_api_client.v2.model.attach_service_now_ticket_request_data_attributes import ( @@ -1684,6 +1692,14 @@ from datadog_api_client.v2.model.create_jira_issue_request_data_relationships import ( CreateJiraIssueRequestDataRelationships, ) +from datadog_api_client.v2.model.create_linear_issue_request_array import CreateLinearIssueRequestArray +from datadog_api_client.v2.model.create_linear_issue_request_data import CreateLinearIssueRequestData +from datadog_api_client.v2.model.create_linear_issue_request_data_attributes import ( + CreateLinearIssueRequestDataAttributes, +) +from datadog_api_client.v2.model.create_linear_issue_request_data_relationships import ( + CreateLinearIssueRequestDataRelationships, +) from datadog_api_client.v2.model.create_maintenance_request import CreateMaintenanceRequest from datadog_api_client.v2.model.create_maintenance_request_data import CreateMaintenanceRequestData from datadog_api_client.v2.model.create_maintenance_request_data_attributes import ( @@ -2799,6 +2815,8 @@ from datadog_api_client.v2.model.finding_evaluation import FindingEvaluation from datadog_api_client.v2.model.finding_jira_issue import FindingJiraIssue from datadog_api_client.v2.model.finding_jira_issue_result import FindingJiraIssueResult +from datadog_api_client.v2.model.finding_linear_issue import FindingLinearIssue +from datadog_api_client.v2.model.finding_linear_issue_result import FindingLinearIssueResult from datadog_api_client.v2.model.finding_mute import FindingMute from datadog_api_client.v2.model.finding_mute_reason import FindingMuteReason from datadog_api_client.v2.model.finding_rule import FindingRule @@ -4297,6 +4315,7 @@ LicensesListResponseDataAttributesLicensesItems, ) from datadog_api_client.v2.model.licenses_list_response_data_type import LicensesListResponseDataType +from datadog_api_client.v2.model.linear_issues_data_type import LinearIssuesDataType from datadog_api_client.v2.model.links import Links from datadog_api_client.v2.model.list_apis_response import ListAPIsResponse from datadog_api_client.v2.model.list_apis_response_data import ListAPIsResponseData @@ -10015,6 +10034,10 @@ "AttachJiraIssueRequestData", "AttachJiraIssueRequestDataAttributes", "AttachJiraIssueRequestDataRelationships", + "AttachLinearIssueRequest", + "AttachLinearIssueRequestData", + "AttachLinearIssueRequestDataAttributes", + "AttachLinearIssueRequestDataRelationships", "AttachServiceNowTicketRequest", "AttachServiceNowTicketRequestData", "AttachServiceNowTicketRequestDataAttributes", @@ -10855,6 +10878,10 @@ "CreateJiraIssueRequestData", "CreateJiraIssueRequestDataAttributes", "CreateJiraIssueRequestDataRelationships", + "CreateLinearIssueRequestArray", + "CreateLinearIssueRequestData", + "CreateLinearIssueRequestDataAttributes", + "CreateLinearIssueRequestDataRelationships", "CreateMaintenanceRequest", "CreateMaintenanceRequestData", "CreateMaintenanceRequestDataAttributes", @@ -11668,6 +11695,8 @@ "FindingEvaluation", "FindingJiraIssue", "FindingJiraIssueResult", + "FindingLinearIssue", + "FindingLinearIssueResult", "FindingMute", "FindingMuteReason", "FindingRule", @@ -12816,6 +12845,7 @@ "LicensesListResponseDataAttributes", "LicensesListResponseDataAttributesLicensesItems", "LicensesListResponseDataType", + "LinearIssuesDataType", "Links", "ListAPIsResponse", "ListAPIsResponseData", diff --git a/tests/v2/features/security_monitoring.feature b/tests/v2/features/security_monitoring.feature index da7e67cad5..17760225c5 100644 --- a/tests/v2/features/security_monitoring.feature +++ b/tests/v2/features/security_monitoring.feature @@ -111,6 +111,30 @@ Feature: Security Monitoring And the response "data.attributes.insights" has item with field "resource_id" with value "MTNjN2ZmYWMzMDIxYmU1ZDFiZDRjNWUwN2I1NzVmY2F-YTA3MzllMTUzNWM3NmEyZjdiNzEzOWM5YmViZTMzOGM=" And the response "data.attributes.jira_issue.result.issue_url" is equal to "https://datadoghq-sandbox-538.atlassian.net/browse/CSMSEC-105476" + @generated @skip @team:DataDog/k9-investigation + Scenario: Attach security findings to a Linear issue returns "Bad Request" response + Given operation "AttachLinearIssue" enabled + And new "AttachLinearIssue" request + And body with value {"data": {"attributes": {"linear_issue_url": "https://linear.app/your-workspace/issue/ENG-123"}, "relationships": {"findings": {"data": [{"id": "ZGVmLTAwcC1pZXJ-aS0wZjhjNjMyZDNmMzRlZTgzNw==", "type": "findings"}]}, "project": {"data": {"id": "aeadc05e-98a8-11ec-ac2c-da7ad0900001", "type": "projects"}}}, "type": "linear_issues"}} + When the request is sent + Then the response status is 400 Bad Request + + @generated @skip @team:DataDog/k9-investigation + Scenario: Attach security findings to a Linear issue returns "Not Found" response + Given operation "AttachLinearIssue" enabled + And new "AttachLinearIssue" request + And body with value {"data": {"attributes": {"linear_issue_url": "https://linear.app/your-workspace/issue/ENG-123"}, "relationships": {"findings": {"data": [{"id": "ZGVmLTAwcC1pZXJ-aS0wZjhjNjMyZDNmMzRlZTgzNw==", "type": "findings"}]}, "project": {"data": {"id": "aeadc05e-98a8-11ec-ac2c-da7ad0900001", "type": "projects"}}}, "type": "linear_issues"}} + When the request is sent + Then the response status is 404 Not Found + + @generated @skip @team:DataDog/k9-investigation + Scenario: Attach security findings to a Linear issue returns "OK" response + Given operation "AttachLinearIssue" enabled + And new "AttachLinearIssue" request + And body with value {"data": {"attributes": {"linear_issue_url": "https://linear.app/your-workspace/issue/ENG-123"}, "relationships": {"findings": {"data": [{"id": "ZGVmLTAwcC1pZXJ-aS0wZjhjNjMyZDNmMzRlZTgzNw==", "type": "findings"}]}, "project": {"data": {"id": "aeadc05e-98a8-11ec-ac2c-da7ad0900001", "type": "projects"}}}, "type": "linear_issues"}} + When the request is sent + Then the response status is 200 OK + @generated @skip @team:DataDog/k9-investigation Scenario: Attach security findings to a ServiceNow ticket returns "Bad Request" response Given new "AttachServiceNowTicket" request @@ -527,6 +551,30 @@ Feature: Security Monitoring When the request is sent Then the response status is 404 Not Found + @generated @skip @team:DataDog/k9-investigation + Scenario: Create Linear issues for security findings returns "Bad Request" response + Given operation "CreateLinearIssues" enabled + And new "CreateLinearIssues" request + And body with value {"data": [{"attributes": {"assignee_id": "f315bdaf-9ee7-4808-a9c1-99c15bf0f4d0", "description": "A description of the Linear issue.", "label_ids": ["a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d"], "linear_project_id": "d4c3b2a1-6f5e-8b7a-0d9c-2f1e4a3b6c5d", "priority": "NOT_DEFINED", "title": "A title for the Linear issue."}, "relationships": {"findings": {"data": [{"id": "ZGVmLTAwcC1pZXJ-aS0wZjhjNjMyZDNmMzRlZTgzNw==", "type": "findings"}]}, "project": {"data": {"id": "aeadc05e-98a8-11ec-ac2c-da7ad0900001", "type": "projects"}}}, "type": "linear_issues"}]} + When the request is sent + Then the response status is 400 Bad Request + + @generated @skip @team:DataDog/k9-investigation + Scenario: Create Linear issues for security findings returns "Created" response + Given operation "CreateLinearIssues" enabled + And new "CreateLinearIssues" request + And body with value {"data": [{"attributes": {"assignee_id": "f315bdaf-9ee7-4808-a9c1-99c15bf0f4d0", "description": "A description of the Linear issue.", "label_ids": ["a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d"], "linear_project_id": "d4c3b2a1-6f5e-8b7a-0d9c-2f1e4a3b6c5d", "priority": "NOT_DEFINED", "title": "A title for the Linear issue."}, "relationships": {"findings": {"data": [{"id": "ZGVmLTAwcC1pZXJ-aS0wZjhjNjMyZDNmMzRlZTgzNw==", "type": "findings"}]}, "project": {"data": {"id": "aeadc05e-98a8-11ec-ac2c-da7ad0900001", "type": "projects"}}}, "type": "linear_issues"}]} + When the request is sent + Then the response status is 201 Created + + @generated @skip @team:DataDog/k9-investigation + Scenario: Create Linear issues for security findings returns "Not Found" response + Given operation "CreateLinearIssues" enabled + And new "CreateLinearIssues" request + And body with value {"data": [{"attributes": {"assignee_id": "f315bdaf-9ee7-4808-a9c1-99c15bf0f4d0", "description": "A description of the Linear issue.", "label_ids": ["a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d"], "linear_project_id": "d4c3b2a1-6f5e-8b7a-0d9c-2f1e4a3b6c5d", "priority": "NOT_DEFINED", "title": "A title for the Linear issue."}, "relationships": {"findings": {"data": [{"id": "ZGVmLTAwcC1pZXJ-aS0wZjhjNjMyZDNmMzRlZTgzNw==", "type": "findings"}]}, "project": {"data": {"id": "aeadc05e-98a8-11ec-ac2c-da7ad0900001", "type": "projects"}}}, "type": "linear_issues"}]} + When the request is sent + Then the response status is 404 Not Found + @generated @skip @team:DataDog/k9-investigation Scenario: Create ServiceNow tickets for security findings returns "Bad Request" response Given new "CreateServiceNowTickets" request diff --git a/tests/v2/features/undo.json b/tests/v2/features/undo.json index 37f5bce7a2..54671118bc 100644 --- a/tests/v2/features/undo.json +++ b/tests/v2/features/undo.json @@ -7184,6 +7184,25 @@ "type": "unsafe" } }, + "AttachLinearIssue": { + "tag": "Security Monitoring", + "undo": { + "type": "idempotent" + } + }, + "CreateLinearIssues": { + "tag": "Security Monitoring", + "undo": { + "operationId": "DetachCase", + "parameters": [ + { + "name": "body", + "template": "{\n \"data\": {\n \"type\": \"cases\",\n \"relationships\": {\n \"findings\": {\n \"data\": [\n {\n \"type\": \"findings\",\n \"id\": \"{{data[0].attributes.insights[0].resource_id}}\"\n }\n ]\n }\n }\n }\n}" + } + ], + "type": "unsafe" + } + }, "MuteSecurityFindings": { "tag": "Security Monitoring", "undo": {