Skip to content

Commit 0ef02b3

Browse files
api-clients-generation-pipeline[bot]ci.datadog-api-spec
andauthored
Allow to send batches of events in pipelines API (#2807)
Co-authored-by: ci.datadog-api-spec <packages@datadoghq.com>
1 parent 4cf2076 commit 0ef02b3

10 files changed

+206
-17
lines changed

.generator/schemas/v2/openapi.yaml

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5994,7 +5994,7 @@ components:
59945994
description: Request object.
59955995
properties:
59965996
data:
5997-
$ref: '#/components/schemas/CIAppCreatePipelineEventRequestData'
5997+
$ref: '#/components/schemas/CIAppCreatePipelineEventRequestDataSingleOrArray'
59985998
type: object
59995999
CIAppCreatePipelineEventRequestAttributes:
60006000
description: Attributes of the pipeline event to create.
@@ -6030,6 +6030,16 @@ components:
60306030
type:
60316031
$ref: '#/components/schemas/CIAppCreatePipelineEventRequestDataType'
60326032
type: object
6033+
CIAppCreatePipelineEventRequestDataArray:
6034+
description: Array of pipeline events to create in batch.
6035+
items:
6036+
$ref: '#/components/schemas/CIAppCreatePipelineEventRequestData'
6037+
type: array
6038+
CIAppCreatePipelineEventRequestDataSingleOrArray:
6039+
description: Data of the pipeline events to create.
6040+
oneOf:
6041+
- $ref: '#/components/schemas/CIAppCreatePipelineEventRequestData'
6042+
- $ref: '#/components/schemas/CIAppCreatePipelineEventRequestDataArray'
60336043
CIAppCreatePipelineEventRequestDataType:
60346044
default: cipipeline_resource_request
60356045
description: Type of the event.
@@ -51718,6 +51728,9 @@ paths:
5171851728
we support, see [Pipeline Data Model And Execution Types](https://docs.datadoghq.com/continuous_integration/guides/pipeline_data_model/).
5171951729

5172051730

51731+
Multiple events can be sent in an array (up to 1000).
51732+
51733+
5172151734
Pipeline events can be submitted with a timestamp that is up to 18 hours in
5172251735
the past.'
5172351736
operationId: CreateCIAppPipelineEvent

docs/datadog_api_client.v2.model.rst

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2692,6 +2692,13 @@ datadog\_api\_client.v2.model.ci\_app\_create\_pipeline\_event\_request\_data mo
26922692
:members:
26932693
:show-inheritance:
26942694

2695+
datadog\_api\_client.v2.model.ci\_app\_create\_pipeline\_event\_request\_data\_single\_or\_array module
2696+
-------------------------------------------------------------------------------------------------------
2697+
2698+
.. automodule:: datadog_api_client.v2.model.ci_app_create_pipeline_event_request_data_single_or_array
2699+
:members:
2700+
:show-inheritance:
2701+
26952702
datadog\_api\_client.v2.model.ci\_app\_create\_pipeline\_event\_request\_data\_type module
26962703
------------------------------------------------------------------------------------------
26972704

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
"""
2+
Send several pipeline events returns "Request accepted for processing" response
3+
"""
4+
5+
from datetime import datetime
6+
from dateutil.relativedelta import relativedelta
7+
from datadog_api_client import ApiClient, Configuration
8+
from datadog_api_client.v2.api.ci_visibility_pipelines_api import CIVisibilityPipelinesApi
9+
from datadog_api_client.v2.model.ci_app_create_pipeline_event_request import CIAppCreatePipelineEventRequest
10+
from datadog_api_client.v2.model.ci_app_create_pipeline_event_request_attributes import (
11+
CIAppCreatePipelineEventRequestAttributes,
12+
)
13+
from datadog_api_client.v2.model.ci_app_create_pipeline_event_request_data import CIAppCreatePipelineEventRequestData
14+
from datadog_api_client.v2.model.ci_app_create_pipeline_event_request_data_type import (
15+
CIAppCreatePipelineEventRequestDataType,
16+
)
17+
from datadog_api_client.v2.model.ci_app_git_info import CIAppGitInfo
18+
from datadog_api_client.v2.model.ci_app_pipeline_event_finished_pipeline import CIAppPipelineEventFinishedPipeline
19+
from datadog_api_client.v2.model.ci_app_pipeline_event_pipeline_level import CIAppPipelineEventPipelineLevel
20+
from datadog_api_client.v2.model.ci_app_pipeline_event_pipeline_status import CIAppPipelineEventPipelineStatus
21+
22+
body = CIAppCreatePipelineEventRequest(
23+
data=[
24+
CIAppCreatePipelineEventRequestData(
25+
attributes=CIAppCreatePipelineEventRequestAttributes(
26+
provider_name="example-provider",
27+
resource=CIAppPipelineEventFinishedPipeline(
28+
level=CIAppPipelineEventPipelineLevel.PIPELINE,
29+
unique_id="3eacb6f3-ff04-4e10-8a9c-46e6d054024a",
30+
name="Deploy to AWS",
31+
url="https://my-ci-provider.example/pipelines/my-pipeline/run/1",
32+
start=(datetime.now() + relativedelta(seconds=-120)),
33+
end=(datetime.now() + relativedelta(seconds=-30)),
34+
status=CIAppPipelineEventPipelineStatus.SUCCESS,
35+
partial_retry=False,
36+
git=CIAppGitInfo(
37+
repository_url="https://github.com/DataDog/datadog-agent",
38+
sha="7f263865994b76066c4612fd1965215e7dcb4cd2",
39+
author_email="john.doe@email.com",
40+
),
41+
),
42+
),
43+
type=CIAppCreatePipelineEventRequestDataType.CIPIPELINE_RESOURCE_REQUEST,
44+
),
45+
CIAppCreatePipelineEventRequestData(
46+
attributes=CIAppCreatePipelineEventRequestAttributes(
47+
provider_name="example-provider",
48+
resource=CIAppPipelineEventFinishedPipeline(
49+
level=CIAppPipelineEventPipelineLevel.PIPELINE,
50+
unique_id="7b2c8f9e-aa15-4d22-9c7d-83f4e065138b",
51+
name="Deploy to Production",
52+
url="https://my-ci-provider.example/pipelines/prod-pipeline/run/2",
53+
start=(datetime.now() + relativedelta(seconds=-180)),
54+
end=(datetime.now() + relativedelta(seconds=-45)),
55+
status=CIAppPipelineEventPipelineStatus.SUCCESS,
56+
partial_retry=False,
57+
git=CIAppGitInfo(
58+
repository_url="https://github.com/DataDog/datadog-agent",
59+
sha="9a4f7c28b3e5d12f8e6c9b2a5d8f3e1c7b4a6d9e",
60+
author_email="jane.smith@email.com",
61+
),
62+
),
63+
),
64+
type=CIAppCreatePipelineEventRequestDataType.CIPIPELINE_RESOURCE_REQUEST,
65+
),
66+
],
67+
)
68+
69+
configuration = Configuration()
70+
with ApiClient(configuration) as api_client:
71+
api_instance = CIVisibilityPipelinesApi(api_client)
72+
response = api_instance.create_ci_app_pipeline_event(body=body)
73+
74+
print(response)

src/datadog_api_client/v2/api/ci_visibility_pipelines_api.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,8 @@ def create_ci_app_pipeline_event(
169169
170170
Send your pipeline event to your Datadog platform over HTTP. For details about how pipeline executions are modeled and what execution types we support, see `Pipeline Data Model And Execution Types <https://docs.datadoghq.com/continuous_integration/guides/pipeline_data_model/>`_.
171171
172+
Multiple events can be sent in an array (up to 1000).
173+
172174
Pipeline events can be submitted with a timestamp that is up to 18 hours in the past.
173175
174176
:type body: CIAppCreatePipelineEventRequest

src/datadog_api_client/v2/model/ci_app_create_pipeline_event_request.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
# Copyright 2019-Present Datadog, Inc.
44
from __future__ import annotations
55

6-
from typing import Union, TYPE_CHECKING
6+
from typing import List, Union, TYPE_CHECKING
77

88
from datadog_api_client.model_utils import (
99
ModelNormal,
@@ -14,6 +14,9 @@
1414

1515

1616
if TYPE_CHECKING:
17+
from datadog_api_client.v2.model.ci_app_create_pipeline_event_request_data_single_or_array import (
18+
CIAppCreatePipelineEventRequestDataSingleOrArray,
19+
)
1720
from datadog_api_client.v2.model.ci_app_create_pipeline_event_request_data import (
1821
CIAppCreatePipelineEventRequestData,
1922
)
@@ -22,24 +25,33 @@
2225
class CIAppCreatePipelineEventRequest(ModelNormal):
2326
@cached_property
2427
def openapi_types(_):
25-
from datadog_api_client.v2.model.ci_app_create_pipeline_event_request_data import (
26-
CIAppCreatePipelineEventRequestData,
28+
from datadog_api_client.v2.model.ci_app_create_pipeline_event_request_data_single_or_array import (
29+
CIAppCreatePipelineEventRequestDataSingleOrArray,
2730
)
2831

2932
return {
30-
"data": (CIAppCreatePipelineEventRequestData,),
33+
"data": (CIAppCreatePipelineEventRequestDataSingleOrArray,),
3134
}
3235

3336
attribute_map = {
3437
"data": "data",
3538
}
3639

37-
def __init__(self_, data: Union[CIAppCreatePipelineEventRequestData, UnsetType] = unset, **kwargs):
40+
def __init__(
41+
self_,
42+
data: Union[
43+
CIAppCreatePipelineEventRequestDataSingleOrArray,
44+
CIAppCreatePipelineEventRequestData,
45+
List[CIAppCreatePipelineEventRequestData],
46+
UnsetType,
47+
] = unset,
48+
**kwargs,
49+
):
3850
"""
3951
Request object.
4052
41-
:param data: Data of the pipeline event to create.
42-
:type data: CIAppCreatePipelineEventRequestData, optional
53+
:param data: Data of the pipeline events to create.
54+
:type data: CIAppCreatePipelineEventRequestDataSingleOrArray, optional
4355
"""
4456
if data is not unset:
4557
kwargs["data"] = data
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License.
2+
# This product includes software developed at Datadog (https://www.datadoghq.com/).
3+
# Copyright 2019-Present Datadog, Inc.
4+
from __future__ import annotations
5+
6+
7+
from datadog_api_client.model_utils import (
8+
ModelComposed,
9+
cached_property,
10+
)
11+
12+
13+
class CIAppCreatePipelineEventRequestDataSingleOrArray(ModelComposed):
14+
def __init__(self, **kwargs):
15+
"""
16+
Data of the pipeline events to create.
17+
18+
:param attributes: Attributes of the pipeline event to create.
19+
:type attributes: CIAppCreatePipelineEventRequestAttributes, optional
20+
21+
:param type: Type of the event.
22+
:type type: CIAppCreatePipelineEventRequestDataType, optional
23+
"""
24+
super().__init__(kwargs)
25+
26+
@cached_property
27+
def _composed_schemas(_):
28+
# we need this here to make our import statements work
29+
# we must store _composed_schemas in here so the code is only run
30+
# when we invoke this method. If we kept this at the class
31+
# level we would get an error because the class level
32+
# code would be run when this module is imported, and these composed
33+
# classes don't exist yet because their module has not finished
34+
# loading
35+
from datadog_api_client.v2.model.ci_app_create_pipeline_event_request_data import (
36+
CIAppCreatePipelineEventRequestData,
37+
)
38+
from datadog_api_client.v2.model.ci_app_create_pipeline_event_request_data import (
39+
CIAppCreatePipelineEventRequestData,
40+
)
41+
42+
return {
43+
"oneOf": [
44+
CIAppCreatePipelineEventRequestData,
45+
[CIAppCreatePipelineEventRequestData],
46+
],
47+
}

src/datadog_api_client/v2/models/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,9 @@
427427
CIAppCreatePipelineEventRequestAttributesResource,
428428
)
429429
from datadog_api_client.v2.model.ci_app_create_pipeline_event_request_data import CIAppCreatePipelineEventRequestData
430+
from datadog_api_client.v2.model.ci_app_create_pipeline_event_request_data_single_or_array import (
431+
CIAppCreatePipelineEventRequestDataSingleOrArray,
432+
)
430433
from datadog_api_client.v2.model.ci_app_create_pipeline_event_request_data_type import (
431434
CIAppCreatePipelineEventRequestDataType,
432435
)
@@ -4506,6 +4509,7 @@
45064509
"CIAppCreatePipelineEventRequestAttributes",
45074510
"CIAppCreatePipelineEventRequestAttributesResource",
45084511
"CIAppCreatePipelineEventRequestData",
4512+
"CIAppCreatePipelineEventRequestDataSingleOrArray",
45094513
"CIAppCreatePipelineEventRequestDataType",
45104514
"CIAppEventAttributes",
45114515
"CIAppGitInfo",
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
2025-09-02T15:10:26.479Z
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
interactions:
2+
- request:
3+
body: '{"data":[{"attributes":{"provider_name":"example-provider","resource":{"end":"2025-09-02T15:09:56.479Z","git":{"author_email":"john.doe@email.com","repository_url":"https://github.com/DataDog/datadog-agent","sha":"7f263865994b76066c4612fd1965215e7dcb4cd2"},"level":"pipeline","name":"Deploy
4+
to AWS","partial_retry":false,"start":"2025-09-02T15:08:26.479Z","status":"success","unique_id":"3eacb6f3-ff04-4e10-8a9c-46e6d054024a","url":"https://my-ci-provider.example/pipelines/my-pipeline/run/1"}},"type":"cipipeline_resource_request"},{"attributes":{"provider_name":"example-provider","resource":{"end":"2025-09-02T15:09:41.479Z","git":{"author_email":"jane.smith@email.com","repository_url":"https://github.com/DataDog/datadog-agent","sha":"9a4f7c28b3e5d12f8e6c9b2a5d8f3e1c7b4a6d9e"},"level":"pipeline","name":"Deploy
5+
to Production","partial_retry":false,"start":"2025-09-02T15:07:26.479Z","status":"success","unique_id":"7b2c8f9e-aa15-4d22-9c7d-83f4e065138b","url":"https://my-ci-provider.example/pipelines/prod-pipeline/run/2"}},"type":"cipipeline_resource_request"}]}'
6+
headers:
7+
accept:
8+
- application/json
9+
content-type:
10+
- application/json
11+
method: POST
12+
uri: https://api.datadoghq.com/api/v2/ci/pipeline
13+
response:
14+
body:
15+
string: '{"data":null}'
16+
headers:
17+
content-type:
18+
- application/vnd.api+json
19+
status:
20+
code: 202
21+
message: Accepted
22+
version: 1

tests/v2/features/ci_visibility_pipelines.feature

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ Feature: CI Visibility Pipelines
1717
When the request is sent
1818
Then the response status is 400 Bad Request
1919

20-
@team:DataDog/ci-app-backend
20+
@skip-java @skip-python @skip-typescript @team:DataDog/ci-app-backend
2121
Scenario: Aggregate pipelines events returns "OK" response
2222
Given a valid "appKeyAuth" key in the system
2323
And new "AggregateCIAppPipelineEvents" request
@@ -33,7 +33,7 @@ Feature: CI Visibility Pipelines
3333
When the request is sent
3434
Then the response status is 400 Bad Request
3535

36-
@team:DataDog/ci-app-backend
36+
@skip-java @skip-python @skip-typescript @team:DataDog/ci-app-backend
3737
Scenario: Get a list of pipelines events returns "OK" response
3838
Given a valid "appKeyAuth" key in the system
3939
And new "ListCIAppPipelineEvents" request
@@ -44,7 +44,7 @@ Feature: CI Visibility Pipelines
4444
When the request is sent
4545
Then the response status is 200 OK
4646

47-
@replay-only @skip-validation @team:DataDog/ci-app-backend @with-pagination
47+
@replay-only @skip-java @skip-python @skip-typescript @skip-validation @team:DataDog/ci-app-backend @with-pagination
4848
Scenario: Get a list of pipelines events returns "OK" response with pagination
4949
Given a valid "appKeyAuth" key in the system
5050
And new "ListCIAppPipelineEvents" request
@@ -63,15 +63,15 @@ Feature: CI Visibility Pipelines
6363
When the request is sent
6464
Then the response status is 400 Bad Request
6565

66-
@team:DataDog/ci-app-backend
66+
@skip-java @skip-python @skip-typescript @team:DataDog/ci-app-backend
6767
Scenario: Search pipelines events returns "OK" response
6868
Given a valid "appKeyAuth" key in the system
6969
And new "SearchCIAppPipelineEvents" request
7070
And body with value {"filter": {"from": "now-15m", "query": "@ci.provider.name:github AND @ci.status:error", "to": "now"}, "options": {"timezone": "GMT"}, "page": {"limit": 5}, "sort": "timestamp"}
7171
When the request is sent
7272
Then the response status is 200 OK
7373

74-
@replay-only @skip-validation @team:DataDog/ci-app-backend @with-pagination
74+
@replay-only @skip-java @skip-python @skip-typescript @skip-validation @team:DataDog/ci-app-backend @with-pagination
7575
Scenario: Search pipelines events returns "OK" response with pagination
7676
Given a valid "appKeyAuth" key in the system
7777
And new "SearchCIAppPipelineEvents" request
@@ -101,30 +101,37 @@ Feature: CI Visibility Pipelines
101101
When the request is sent
102102
Then the response status is 408 Request Timeout
103103

104-
@team:DataDog/ci-app-backend
104+
@skip-java @skip-python @skip-typescript @team:DataDog/ci-app-backend
105105
Scenario: Send pipeline event returns "Request accepted for processing" response
106106
Given new "CreateCIAppPipelineEvent" request
107107
And body with value {"data": {"attributes": {"resource": {"level": "pipeline","unique_id": "3eacb6f3-ff04-4e10-8a9c-46e6d054024a","name": "Deploy to AWS","url": "https://my-ci-provider.example/pipelines/my-pipeline/run/1","start": "{{ timeISO('now - 120s') }}","end": "{{ timeISO('now - 30s') }}","status": "success","partial_retry": false,"git": {"repository_url": "https://github.com/DataDog/datadog-agent","sha": "7f263865994b76066c4612fd1965215e7dcb4cd2","author_email": "john.doe@email.com"}}},"type": "cipipeline_resource_request"}}
108108
When the request is sent
109109
Then the response status is 202 Request accepted for processing
110110

111-
@team:DataDog/ci-app-backend
111+
@skip-java @skip-python @skip-typescript @team:DataDog/ci-app-backend
112112
Scenario: Send pipeline event with custom provider returns "Request accepted for processing" response
113113
Given new "CreateCIAppPipelineEvent" request
114114
And body with value {"data": {"attributes": {"provider_name": "example-provider", "resource": {"level": "pipeline","unique_id": "3eacb6f3-ff04-4e10-8a9c-46e6d054024a","name": "Deploy to AWS","url": "https://my-ci-provider.example/pipelines/my-pipeline/run/1","start": "{{ timeISO('now - 120s') }}","end": "{{ timeISO('now - 30s') }}","status": "success","partial_retry": false,"git": {"repository_url": "https://github.com/DataDog/datadog-agent","sha": "7f263865994b76066c4612fd1965215e7dcb4cd2","author_email": "john.doe@email.com"}}},"type": "cipipeline_resource_request"}}
115115
When the request is sent
116116
Then the response status is 202 Request accepted for processing
117117

118-
@skip @team:DataDog/ci-app-backend
118+
@skip @skip-java @skip-python @skip-typescript @team:DataDog/ci-app-backend
119119
Scenario: Send pipeline job event returns "Request accepted for processing" response
120120
Given new "CreateCIAppPipelineEvent" request
121121
And body with value {"data": {"attributes": {"resource": {"level": "job", "id": "cf9456de-8b9e-4c27-aa79-27b1e78c1a33", "name": "Build image", "pipeline_unique_id": "3eacb6f3-ff04-4e10-8a9c-46e6d054024a", "pipeline_name": "Deploy to AWS", "start": "{{ timeISO('now - 120s') }}", "end": "{{ timeISO('now - 30s') }}", "status": "error", "url": "https://my-ci-provider.example/jobs/my-jobs/run/1"}}, "type": "cipipeline_resource_request"}}
122122
When the request is sent
123123
Then the response status is 202 Request accepted for processing
124124

125-
@team:DataDog/ci-app-backend
125+
@skip-java @skip-python @skip-typescript @team:DataDog/ci-app-backend
126126
Scenario: Send running pipeline event returns "Request accepted for processing" response
127127
Given new "CreateCIAppPipelineEvent" request
128128
And body with value {"data": {"attributes": {"resource": {"level": "pipeline","unique_id": "3eacb6f3-ff04-4e10-8a9c-46e6d054024a","name": "Deploy to AWS","url": "https://my-ci-provider.example/pipelines/my-pipeline/run/1","start": "{{ timeISO('now - 120s') }}","status": "running","partial_retry": false,"git": {"repository_url": "https://github.com/DataDog/datadog-agent","sha": "7f263865994b76066c4612fd1965215e7dcb4cd2","author_email": "john.doe@email.com"}}},"type": "cipipeline_resource_request"}}
129129
When the request is sent
130130
Then the response status is 202 Request accepted for processing
131+
132+
@skip-java @skip-python @skip-typescript @team:DataDog/ci-app-backend
133+
Scenario: Send several pipeline events returns "Request accepted for processing" response
134+
Given new "CreateCIAppPipelineEvent" request
135+
And body with value {"data": [{"attributes": {"provider_name": "example-provider", "resource": {"level": "pipeline","unique_id": "3eacb6f3-ff04-4e10-8a9c-46e6d054024a","name": "Deploy to AWS","url": "https://my-ci-provider.example/pipelines/my-pipeline/run/1","start": "{{ timeISO('now - 120s') }}","end": "{{ timeISO('now - 30s') }}","status": "success","partial_retry": false,"git": {"repository_url": "https://github.com/DataDog/datadog-agent","sha": "7f263865994b76066c4612fd1965215e7dcb4cd2","author_email": "john.doe@email.com"}}},"type": "cipipeline_resource_request"},{"attributes": {"provider_name": "example-provider", "resource": {"level": "pipeline","unique_id": "7b2c8f9e-aa15-4d22-9c7d-83f4e065138b","name": "Deploy to Production","url": "https://my-ci-provider.example/pipelines/prod-pipeline/run/2","start": "{{ timeISO('now - 180s') }}","end": "{{ timeISO('now - 45s') }}","status": "success","partial_retry": false,"git": {"repository_url": "https://github.com/DataDog/datadog-agent","sha": "9a4f7c28b3e5d12f8e6c9b2a5d8f3e1c7b4a6d9e","author_email": "jane.smith@email.com"}}},"type": "cipipeline_resource_request"}]}
136+
When the request is sent
137+
Then the response status is 202 Request accepted for processing

0 commit comments

Comments
 (0)