diff --git a/.generator/schemas/v2/openapi.yaml b/.generator/schemas/v2/openapi.yaml index 011c51ec120..b915e9a8850 100644 --- a/.generator/schemas/v2/openapi.yaml +++ b/.generator/schemas/v2/openapi.yaml @@ -5994,7 +5994,7 @@ components: description: Request object. properties: data: - $ref: '#/components/schemas/CIAppCreatePipelineEventRequestData' + $ref: '#/components/schemas/CIAppCreatePipelineEventRequestDataSingleOrArray' type: object CIAppCreatePipelineEventRequestAttributes: description: Attributes of the pipeline event to create. @@ -6030,6 +6030,16 @@ components: type: $ref: '#/components/schemas/CIAppCreatePipelineEventRequestDataType' type: object + CIAppCreatePipelineEventRequestDataArray: + description: Array of pipeline events to create in batch. + items: + $ref: '#/components/schemas/CIAppCreatePipelineEventRequestData' + type: array + CIAppCreatePipelineEventRequestDataSingleOrArray: + description: Data of the pipeline events to create. + oneOf: + - $ref: '#/components/schemas/CIAppCreatePipelineEventRequestData' + - $ref: '#/components/schemas/CIAppCreatePipelineEventRequestDataArray' CIAppCreatePipelineEventRequestDataType: default: cipipeline_resource_request description: Type of the event. @@ -51718,6 +51728,9 @@ paths: we support, see [Pipeline Data Model And Execution Types](https://docs.datadoghq.com/continuous_integration/guides/pipeline_data_model/). + Multiple events can be sent in an array (up to 1000). + + Pipeline events can be submitted with a timestamp that is up to 18 hours in the past.' operationId: CreateCIAppPipelineEvent diff --git a/examples/v2/ci-visibility-pipelines/CreateCIAppPipelineEvent.java b/examples/v2/ci-visibility-pipelines/CreateCIAppPipelineEvent.java index d208e112ab5..04dcee36599 100644 --- a/examples/v2/ci-visibility-pipelines/CreateCIAppPipelineEvent.java +++ b/examples/v2/ci-visibility-pipelines/CreateCIAppPipelineEvent.java @@ -6,6 +6,7 @@ import com.datadog.api.client.v2.model.CIAppCreatePipelineEventRequestAttributes; import com.datadog.api.client.v2.model.CIAppCreatePipelineEventRequestAttributesResource; import com.datadog.api.client.v2.model.CIAppCreatePipelineEventRequestData; +import com.datadog.api.client.v2.model.CIAppCreatePipelineEventRequestDataSingleOrArray; import com.datadog.api.client.v2.model.CIAppCreatePipelineEventRequestDataType; import com.datadog.api.client.v2.model.CIAppGitInfo; import com.datadog.api.client.v2.model.CIAppPipelineEventFinishedPipeline; @@ -22,29 +23,32 @@ public static void main(String[] args) { CIAppCreatePipelineEventRequest body = new CIAppCreatePipelineEventRequest() .data( - new CIAppCreatePipelineEventRequestData() - .attributes( - new CIAppCreatePipelineEventRequestAttributes() - .resource( - new CIAppCreatePipelineEventRequestAttributesResource( - new CIAppPipelineEventPipeline( - new CIAppPipelineEventFinishedPipeline() - .level(CIAppPipelineEventPipelineLevel.PIPELINE) - .uniqueId("3eacb6f3-ff04-4e10-8a9c-46e6d054024a") - .name("Deploy to AWS") - .url( - "https://my-ci-provider.example/pipelines/my-pipeline/run/1") - .start(OffsetDateTime.now().plusSeconds(-120)) - .end(OffsetDateTime.now().plusSeconds(-30)) - .status(CIAppPipelineEventPipelineStatus.SUCCESS) - .partialRetry(false) - .git( - new CIAppGitInfo() - .repositoryUrl( - "https://github.com/DataDog/datadog-agent") - .sha("7f263865994b76066c4612fd1965215e7dcb4cd2") - .authorEmail("john.doe@email.com")))))) - .type(CIAppCreatePipelineEventRequestDataType.CIPIPELINE_RESOURCE_REQUEST)); + new CIAppCreatePipelineEventRequestDataSingleOrArray( + new CIAppCreatePipelineEventRequestData() + .attributes( + new CIAppCreatePipelineEventRequestAttributes() + .resource( + new CIAppCreatePipelineEventRequestAttributesResource( + new CIAppPipelineEventPipeline( + new CIAppPipelineEventFinishedPipeline() + .level(CIAppPipelineEventPipelineLevel.PIPELINE) + .uniqueId("3eacb6f3-ff04-4e10-8a9c-46e6d054024a") + .name("Deploy to AWS") + .url( + "https://my-ci-provider.example/pipelines/my-pipeline/run/1") + .start(OffsetDateTime.now().plusSeconds(-120)) + .end(OffsetDateTime.now().plusSeconds(-30)) + .status(CIAppPipelineEventPipelineStatus.SUCCESS) + .partialRetry(false) + .git( + new CIAppGitInfo() + .repositoryUrl( + "https://github.com/DataDog/datadog-agent") + .sha( + "7f263865994b76066c4612fd1965215e7dcb4cd2") + .authorEmail("john.doe@email.com")))))) + .type( + CIAppCreatePipelineEventRequestDataType.CIPIPELINE_RESOURCE_REQUEST))); try { apiInstance.createCIAppPipelineEvent(body); diff --git a/examples/v2/ci-visibility-pipelines/CreateCIAppPipelineEvent_129899466.java b/examples/v2/ci-visibility-pipelines/CreateCIAppPipelineEvent_129899466.java index 29c8ed928c8..cab553182f1 100644 --- a/examples/v2/ci-visibility-pipelines/CreateCIAppPipelineEvent_129899466.java +++ b/examples/v2/ci-visibility-pipelines/CreateCIAppPipelineEvent_129899466.java @@ -6,6 +6,7 @@ import com.datadog.api.client.v2.model.CIAppCreatePipelineEventRequestAttributes; import com.datadog.api.client.v2.model.CIAppCreatePipelineEventRequestAttributesResource; import com.datadog.api.client.v2.model.CIAppCreatePipelineEventRequestData; +import com.datadog.api.client.v2.model.CIAppCreatePipelineEventRequestDataSingleOrArray; import com.datadog.api.client.v2.model.CIAppCreatePipelineEventRequestDataType; import com.datadog.api.client.v2.model.CIAppPipelineEventJob; import com.datadog.api.client.v2.model.CIAppPipelineEventJobLevel; @@ -20,22 +21,26 @@ public static void main(String[] args) { CIAppCreatePipelineEventRequest body = new CIAppCreatePipelineEventRequest() .data( - new CIAppCreatePipelineEventRequestData() - .attributes( - new CIAppCreatePipelineEventRequestAttributes() - .resource( - new CIAppCreatePipelineEventRequestAttributesResource( - new CIAppPipelineEventJob() - .level(CIAppPipelineEventJobLevel.JOB) - .id("cf9456de-8b9e-4c27-aa79-27b1e78c1a33") - .name("Build image") - .pipelineUniqueId("3eacb6f3-ff04-4e10-8a9c-46e6d054024a") - .pipelineName("Deploy to AWS") - .start(OffsetDateTime.now().plusSeconds(-120)) - .end(OffsetDateTime.now().plusSeconds(-30)) - .status(CIAppPipelineEventJobStatus.ERROR) - .url("https://my-ci-provider.example/jobs/my-jobs/run/1")))) - .type(CIAppCreatePipelineEventRequestDataType.CIPIPELINE_RESOURCE_REQUEST)); + new CIAppCreatePipelineEventRequestDataSingleOrArray( + new CIAppCreatePipelineEventRequestData() + .attributes( + new CIAppCreatePipelineEventRequestAttributes() + .resource( + new CIAppCreatePipelineEventRequestAttributesResource( + new CIAppPipelineEventJob() + .level(CIAppPipelineEventJobLevel.JOB) + .id("cf9456de-8b9e-4c27-aa79-27b1e78c1a33") + .name("Build image") + .pipelineUniqueId( + "3eacb6f3-ff04-4e10-8a9c-46e6d054024a") + .pipelineName("Deploy to AWS") + .start(OffsetDateTime.now().plusSeconds(-120)) + .end(OffsetDateTime.now().plusSeconds(-30)) + .status(CIAppPipelineEventJobStatus.ERROR) + .url( + "https://my-ci-provider.example/jobs/my-jobs/run/1")))) + .type( + CIAppCreatePipelineEventRequestDataType.CIPIPELINE_RESOURCE_REQUEST))); try { apiInstance.createCIAppPipelineEvent(body); diff --git a/examples/v2/ci-visibility-pipelines/CreateCIAppPipelineEvent_2341150096.java b/examples/v2/ci-visibility-pipelines/CreateCIAppPipelineEvent_2341150096.java index f7423da2028..9334e109611 100644 --- a/examples/v2/ci-visibility-pipelines/CreateCIAppPipelineEvent_2341150096.java +++ b/examples/v2/ci-visibility-pipelines/CreateCIAppPipelineEvent_2341150096.java @@ -6,6 +6,7 @@ import com.datadog.api.client.v2.model.CIAppCreatePipelineEventRequestAttributes; import com.datadog.api.client.v2.model.CIAppCreatePipelineEventRequestAttributesResource; import com.datadog.api.client.v2.model.CIAppCreatePipelineEventRequestData; +import com.datadog.api.client.v2.model.CIAppCreatePipelineEventRequestDataSingleOrArray; import com.datadog.api.client.v2.model.CIAppCreatePipelineEventRequestDataType; import com.datadog.api.client.v2.model.CIAppGitInfo; import com.datadog.api.client.v2.model.CIAppPipelineEventInProgressPipeline; @@ -22,29 +23,33 @@ public static void main(String[] args) { CIAppCreatePipelineEventRequest body = new CIAppCreatePipelineEventRequest() .data( - new CIAppCreatePipelineEventRequestData() - .attributes( - new CIAppCreatePipelineEventRequestAttributes() - .resource( - new CIAppCreatePipelineEventRequestAttributesResource( - new CIAppPipelineEventPipeline( - new CIAppPipelineEventInProgressPipeline() - .level(CIAppPipelineEventPipelineLevel.PIPELINE) - .uniqueId("3eacb6f3-ff04-4e10-8a9c-46e6d054024a") - .name("Deploy to AWS") - .url( - "https://my-ci-provider.example/pipelines/my-pipeline/run/1") - .start(OffsetDateTime.now().plusSeconds(-120)) - .status( - CIAppPipelineEventPipelineInProgressStatus.RUNNING) - .partialRetry(false) - .git( - new CIAppGitInfo() - .repositoryUrl( - "https://github.com/DataDog/datadog-agent") - .sha("7f263865994b76066c4612fd1965215e7dcb4cd2") - .authorEmail("john.doe@email.com")))))) - .type(CIAppCreatePipelineEventRequestDataType.CIPIPELINE_RESOURCE_REQUEST)); + new CIAppCreatePipelineEventRequestDataSingleOrArray( + new CIAppCreatePipelineEventRequestData() + .attributes( + new CIAppCreatePipelineEventRequestAttributes() + .resource( + new CIAppCreatePipelineEventRequestAttributesResource( + new CIAppPipelineEventPipeline( + new CIAppPipelineEventInProgressPipeline() + .level(CIAppPipelineEventPipelineLevel.PIPELINE) + .uniqueId("3eacb6f3-ff04-4e10-8a9c-46e6d054024a") + .name("Deploy to AWS") + .url( + "https://my-ci-provider.example/pipelines/my-pipeline/run/1") + .start(OffsetDateTime.now().plusSeconds(-120)) + .status( + CIAppPipelineEventPipelineInProgressStatus + .RUNNING) + .partialRetry(false) + .git( + new CIAppGitInfo() + .repositoryUrl( + "https://github.com/DataDog/datadog-agent") + .sha( + "7f263865994b76066c4612fd1965215e7dcb4cd2") + .authorEmail("john.doe@email.com")))))) + .type( + CIAppCreatePipelineEventRequestDataType.CIPIPELINE_RESOURCE_REQUEST))); try { apiInstance.createCIAppPipelineEvent(body); diff --git a/examples/v2/ci-visibility-pipelines/CreateCIAppPipelineEvent_2836340212.java b/examples/v2/ci-visibility-pipelines/CreateCIAppPipelineEvent_2836340212.java new file mode 100644 index 00000000000..e445babed9a --- /dev/null +++ b/examples/v2/ci-visibility-pipelines/CreateCIAppPipelineEvent_2836340212.java @@ -0,0 +1,100 @@ +// Send several pipeline events returns "Request accepted for processing" response +import com.datadog.api.client.ApiClient; +import com.datadog.api.client.ApiException; +import com.datadog.api.client.v2.api.CiVisibilityPipelinesApi; +import com.datadog.api.client.v2.model.CIAppCreatePipelineEventRequest; +import com.datadog.api.client.v2.model.CIAppCreatePipelineEventRequestAttributes; +import com.datadog.api.client.v2.model.CIAppCreatePipelineEventRequestAttributesResource; +import com.datadog.api.client.v2.model.CIAppCreatePipelineEventRequestData; +import com.datadog.api.client.v2.model.CIAppCreatePipelineEventRequestDataSingleOrArray; +import com.datadog.api.client.v2.model.CIAppCreatePipelineEventRequestDataType; +import com.datadog.api.client.v2.model.CIAppGitInfo; +import com.datadog.api.client.v2.model.CIAppPipelineEventFinishedPipeline; +import com.datadog.api.client.v2.model.CIAppPipelineEventPipeline; +import com.datadog.api.client.v2.model.CIAppPipelineEventPipelineLevel; +import com.datadog.api.client.v2.model.CIAppPipelineEventPipelineStatus; +import java.time.OffsetDateTime; +import java.util.Arrays; + +public class Example { + public static void main(String[] args) { + ApiClient defaultClient = ApiClient.getDefaultApiClient(); + CiVisibilityPipelinesApi apiInstance = new CiVisibilityPipelinesApi(defaultClient); + + CIAppCreatePipelineEventRequest body = + new CIAppCreatePipelineEventRequest() + .data( + new CIAppCreatePipelineEventRequestDataSingleOrArray( + Arrays.asList( + new CIAppCreatePipelineEventRequestData() + .attributes( + new CIAppCreatePipelineEventRequestAttributes() + .providerName("example-provider") + .resource( + new CIAppCreatePipelineEventRequestAttributesResource( + new CIAppPipelineEventPipeline( + new CIAppPipelineEventFinishedPipeline() + .level(CIAppPipelineEventPipelineLevel.PIPELINE) + .uniqueId( + "3eacb6f3-ff04-4e10-8a9c-46e6d054024a") + .name("Deploy to AWS") + .url( + "https://my-ci-provider.example/pipelines/my-pipeline/run/1") + .start(OffsetDateTime.now().plusSeconds(-120)) + .end(OffsetDateTime.now().plusSeconds(-30)) + .status( + CIAppPipelineEventPipelineStatus.SUCCESS) + .partialRetry(false) + .git( + new CIAppGitInfo() + .repositoryUrl( + "https://github.com/DataDog/datadog-agent") + .sha( + "7f263865994b76066c4612fd1965215e7dcb4cd2") + .authorEmail("john.doe@email.com")))))) + .type( + CIAppCreatePipelineEventRequestDataType + .CIPIPELINE_RESOURCE_REQUEST), + new CIAppCreatePipelineEventRequestData() + .attributes( + new CIAppCreatePipelineEventRequestAttributes() + .providerName("example-provider") + .resource( + new CIAppCreatePipelineEventRequestAttributesResource( + new CIAppPipelineEventPipeline( + new CIAppPipelineEventFinishedPipeline() + .level(CIAppPipelineEventPipelineLevel.PIPELINE) + .uniqueId( + "7b2c8f9e-aa15-4d22-9c7d-83f4e065138b") + .name("Deploy to Production") + .url( + "https://my-ci-provider.example/pipelines/prod-pipeline/run/2") + .start(OffsetDateTime.now().plusSeconds(-180)) + .end(OffsetDateTime.now().plusSeconds(-45)) + .status( + CIAppPipelineEventPipelineStatus.SUCCESS) + .partialRetry(false) + .git( + new CIAppGitInfo() + .repositoryUrl( + "https://github.com/DataDog/datadog-agent") + .sha( + "9a4f7c28b3e5d12f8e6c9b2a5d8f3e1c7b4a6d9e") + .authorEmail( + "jane.smith@email.com")))))) + .type( + CIAppCreatePipelineEventRequestDataType + .CIPIPELINE_RESOURCE_REQUEST)))); + + try { + apiInstance.createCIAppPipelineEvent(body); + } catch (ApiException e) { + System.err.println( + "Exception when calling CiVisibilityPipelinesApi#createCIAppPipelineEvent"); + System.err.println("Status code: " + e.getCode()); + System.err.println("Reason: " + e.getResponseBody()); + System.err.println("Response headers: " + e.getResponseHeaders()); + e.printStackTrace(); + } + } +} diff --git a/examples/v2/ci-visibility-pipelines/CreateCIAppPipelineEvent_819339921.java b/examples/v2/ci-visibility-pipelines/CreateCIAppPipelineEvent_819339921.java index d8ef10c0f73..8c6bc757a33 100644 --- a/examples/v2/ci-visibility-pipelines/CreateCIAppPipelineEvent_819339921.java +++ b/examples/v2/ci-visibility-pipelines/CreateCIAppPipelineEvent_819339921.java @@ -6,6 +6,7 @@ import com.datadog.api.client.v2.model.CIAppCreatePipelineEventRequestAttributes; import com.datadog.api.client.v2.model.CIAppCreatePipelineEventRequestAttributesResource; import com.datadog.api.client.v2.model.CIAppCreatePipelineEventRequestData; +import com.datadog.api.client.v2.model.CIAppCreatePipelineEventRequestDataSingleOrArray; import com.datadog.api.client.v2.model.CIAppCreatePipelineEventRequestDataType; import com.datadog.api.client.v2.model.CIAppGitInfo; import com.datadog.api.client.v2.model.CIAppPipelineEventFinishedPipeline; @@ -22,30 +23,33 @@ public static void main(String[] args) { CIAppCreatePipelineEventRequest body = new CIAppCreatePipelineEventRequest() .data( - new CIAppCreatePipelineEventRequestData() - .attributes( - new CIAppCreatePipelineEventRequestAttributes() - .providerName("example-provider") - .resource( - new CIAppCreatePipelineEventRequestAttributesResource( - new CIAppPipelineEventPipeline( - new CIAppPipelineEventFinishedPipeline() - .level(CIAppPipelineEventPipelineLevel.PIPELINE) - .uniqueId("3eacb6f3-ff04-4e10-8a9c-46e6d054024a") - .name("Deploy to AWS") - .url( - "https://my-ci-provider.example/pipelines/my-pipeline/run/1") - .start(OffsetDateTime.now().plusSeconds(-120)) - .end(OffsetDateTime.now().plusSeconds(-30)) - .status(CIAppPipelineEventPipelineStatus.SUCCESS) - .partialRetry(false) - .git( - new CIAppGitInfo() - .repositoryUrl( - "https://github.com/DataDog/datadog-agent") - .sha("7f263865994b76066c4612fd1965215e7dcb4cd2") - .authorEmail("john.doe@email.com")))))) - .type(CIAppCreatePipelineEventRequestDataType.CIPIPELINE_RESOURCE_REQUEST)); + new CIAppCreatePipelineEventRequestDataSingleOrArray( + new CIAppCreatePipelineEventRequestData() + .attributes( + new CIAppCreatePipelineEventRequestAttributes() + .providerName("example-provider") + .resource( + new CIAppCreatePipelineEventRequestAttributesResource( + new CIAppPipelineEventPipeline( + new CIAppPipelineEventFinishedPipeline() + .level(CIAppPipelineEventPipelineLevel.PIPELINE) + .uniqueId("3eacb6f3-ff04-4e10-8a9c-46e6d054024a") + .name("Deploy to AWS") + .url( + "https://my-ci-provider.example/pipelines/my-pipeline/run/1") + .start(OffsetDateTime.now().plusSeconds(-120)) + .end(OffsetDateTime.now().plusSeconds(-30)) + .status(CIAppPipelineEventPipelineStatus.SUCCESS) + .partialRetry(false) + .git( + new CIAppGitInfo() + .repositoryUrl( + "https://github.com/DataDog/datadog-agent") + .sha( + "7f263865994b76066c4612fd1965215e7dcb4cd2") + .authorEmail("john.doe@email.com")))))) + .type( + CIAppCreatePipelineEventRequestDataType.CIPIPELINE_RESOURCE_REQUEST))); try { apiInstance.createCIAppPipelineEvent(body); diff --git a/src/main/java/com/datadog/api/client/v2/api/CiVisibilityPipelinesApi.java b/src/main/java/com/datadog/api/client/v2/api/CiVisibilityPipelinesApi.java index 7d2b2461def..3bcc07e703b 100644 --- a/src/main/java/com/datadog/api/client/v2/api/CiVisibilityPipelinesApi.java +++ b/src/main/java/com/datadog/api/client/v2/api/CiVisibilityPipelinesApi.java @@ -228,6 +228,8 @@ public CompletableFuture createCIAppPipelineEventAsync( * href="https://docs.datadoghq.com/continuous_integration/guides/pipeline_data_model/">Pipeline * Data Model And Execution Types. * + *

Multiple events can be sent in an array (up to 1000). + * *

Pipeline events can be submitted with a timestamp that is up to 18 hours in the past. * * @param body (required) diff --git a/src/main/java/com/datadog/api/client/v2/model/CIAppCreatePipelineEventRequest.java b/src/main/java/com/datadog/api/client/v2/model/CIAppCreatePipelineEventRequest.java index 857fb875fbb..2f58499c49a 100644 --- a/src/main/java/com/datadog/api/client/v2/model/CIAppCreatePipelineEventRequest.java +++ b/src/main/java/com/datadog/api/client/v2/model/CIAppCreatePipelineEventRequest.java @@ -23,27 +23,28 @@ public class CIAppCreatePipelineEventRequest { @JsonIgnore public boolean unparsed = false; public static final String JSON_PROPERTY_DATA = "data"; - private CIAppCreatePipelineEventRequestData data; + private CIAppCreatePipelineEventRequestDataSingleOrArray data; - public CIAppCreatePipelineEventRequest data(CIAppCreatePipelineEventRequestData data) { + public CIAppCreatePipelineEventRequest data( + CIAppCreatePipelineEventRequestDataSingleOrArray data) { this.data = data; this.unparsed |= data.unparsed; return this; } /** - * Data of the pipeline event to create. + * Data of the pipeline events to create. * * @return data */ @jakarta.annotation.Nullable @JsonProperty(JSON_PROPERTY_DATA) @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) - public CIAppCreatePipelineEventRequestData getData() { + public CIAppCreatePipelineEventRequestDataSingleOrArray getData() { return data; } - public void setData(CIAppCreatePipelineEventRequestData data) { + public void setData(CIAppCreatePipelineEventRequestDataSingleOrArray data) { this.data = data; } diff --git a/src/main/java/com/datadog/api/client/v2/model/CIAppCreatePipelineEventRequestDataSingleOrArray.java b/src/main/java/com/datadog/api/client/v2/model/CIAppCreatePipelineEventRequestDataSingleOrArray.java new file mode 100644 index 00000000000..c3e7ea042c2 --- /dev/null +++ b/src/main/java/com/datadog/api/client/v2/model/CIAppCreatePipelineEventRequestDataSingleOrArray.java @@ -0,0 +1,306 @@ +/* + * 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. + */ + +package com.datadog.api.client.v2.model; + +import com.datadog.api.client.AbstractOpenApiSchema; +import com.datadog.api.client.JSON; +import com.datadog.api.client.UnparsedObject; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.JsonToken; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.MapperFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; +import jakarta.ws.rs.core.GenericType; +import java.io.IOException; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; + +@jakarta.annotation.Generated( + value = "https://github.com/DataDog/datadog-api-client-java/blob/master/.generator") +@JsonDeserialize( + using = + CIAppCreatePipelineEventRequestDataSingleOrArray + .CIAppCreatePipelineEventRequestDataSingleOrArrayDeserializer.class) +@JsonSerialize( + using = + CIAppCreatePipelineEventRequestDataSingleOrArray + .CIAppCreatePipelineEventRequestDataSingleOrArraySerializer.class) +public class CIAppCreatePipelineEventRequestDataSingleOrArray extends AbstractOpenApiSchema { + private static final Logger log = + Logger.getLogger(CIAppCreatePipelineEventRequestDataSingleOrArray.class.getName()); + + @JsonIgnore public boolean unparsed = false; + + public static class CIAppCreatePipelineEventRequestDataSingleOrArraySerializer + extends StdSerializer { + public CIAppCreatePipelineEventRequestDataSingleOrArraySerializer( + Class t) { + super(t); + } + + public CIAppCreatePipelineEventRequestDataSingleOrArraySerializer() { + this(null); + } + + @Override + public void serialize( + CIAppCreatePipelineEventRequestDataSingleOrArray value, + JsonGenerator jgen, + SerializerProvider provider) + throws IOException, JsonProcessingException { + jgen.writeObject(value.getActualInstance()); + } + } + + public static class CIAppCreatePipelineEventRequestDataSingleOrArrayDeserializer + extends StdDeserializer { + public CIAppCreatePipelineEventRequestDataSingleOrArrayDeserializer() { + this(CIAppCreatePipelineEventRequestDataSingleOrArray.class); + } + + public CIAppCreatePipelineEventRequestDataSingleOrArrayDeserializer(Class vc) { + super(vc); + } + + @Override + public CIAppCreatePipelineEventRequestDataSingleOrArray deserialize( + JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { + JsonNode tree = jp.readValueAsTree(); + Object deserialized = null; + Object tmp = null; + boolean typeCoercion = ctxt.isEnabled(MapperFeature.ALLOW_COERCION_OF_SCALARS); + int match = 0; + JsonToken token = tree.traverse(jp.getCodec()).nextToken(); + // deserialize CIAppCreatePipelineEventRequestData + try { + boolean attemptParsing = true; + // ensure that we respect type coercion as set on the client ObjectMapper + if (CIAppCreatePipelineEventRequestData.class.equals(Integer.class) + || CIAppCreatePipelineEventRequestData.class.equals(Long.class) + || CIAppCreatePipelineEventRequestData.class.equals(Float.class) + || CIAppCreatePipelineEventRequestData.class.equals(Double.class) + || CIAppCreatePipelineEventRequestData.class.equals(Boolean.class) + || CIAppCreatePipelineEventRequestData.class.equals(String.class)) { + attemptParsing = typeCoercion; + if (!attemptParsing) { + attemptParsing |= + ((CIAppCreatePipelineEventRequestData.class.equals(Integer.class) + || CIAppCreatePipelineEventRequestData.class.equals(Long.class)) + && token == JsonToken.VALUE_NUMBER_INT); + attemptParsing |= + ((CIAppCreatePipelineEventRequestData.class.equals(Float.class) + || CIAppCreatePipelineEventRequestData.class.equals(Double.class)) + && (token == JsonToken.VALUE_NUMBER_FLOAT + || token == JsonToken.VALUE_NUMBER_INT)); + attemptParsing |= + (CIAppCreatePipelineEventRequestData.class.equals(Boolean.class) + && (token == JsonToken.VALUE_FALSE || token == JsonToken.VALUE_TRUE)); + attemptParsing |= + (CIAppCreatePipelineEventRequestData.class.equals(String.class) + && token == JsonToken.VALUE_STRING); + } + } + if (attemptParsing) { + tmp = tree.traverse(jp.getCodec()).readValueAs(CIAppCreatePipelineEventRequestData.class); + // TODO: there is no validation against JSON schema constraints + // (min, max, enum, pattern...), this does not perform a strict JSON + // validation, which means the 'match' count may be higher than it should be. + if (!((CIAppCreatePipelineEventRequestData) tmp).unparsed) { + deserialized = tmp; + match++; + } + log.log(Level.FINER, "Input data matches schema 'CIAppCreatePipelineEventRequestData'"); + } + } catch (Exception e) { + // deserialization failed, continue + log.log( + Level.FINER, + "Input data does not match schema 'CIAppCreatePipelineEventRequestData'", + e); + } + + // deserialize List + try { + boolean attemptParsing = true; + // ensure that we respect type coercion as set on the client ObjectMapper + if (List.class.equals(Integer.class) + || List.class.equals(Long.class) + || List.class.equals(Float.class) + || List.class.equals(Double.class) + || List.class.equals(Boolean.class) + || List.class.equals(String.class)) { + attemptParsing = typeCoercion; + if (!attemptParsing) { + attemptParsing |= + ((List.class.equals(Integer.class) || List.class.equals(Long.class)) + && token == JsonToken.VALUE_NUMBER_INT); + attemptParsing |= + ((List.class.equals(Float.class) || List.class.equals(Double.class)) + && (token == JsonToken.VALUE_NUMBER_FLOAT + || token == JsonToken.VALUE_NUMBER_INT)); + attemptParsing |= + (List.class.equals(Boolean.class) + && (token == JsonToken.VALUE_FALSE || token == JsonToken.VALUE_TRUE)); + attemptParsing |= (List.class.equals(String.class) && token == JsonToken.VALUE_STRING); + } + } + if (attemptParsing) { + tmp = tree.traverse(jp.getCodec()).readValueAs(List.class); + // TODO: there is no validation against JSON schema constraints + // (min, max, enum, pattern...), this does not perform a strict JSON + // validation, which means the 'match' count may be higher than it should be. + deserialized = tmp; + match++; + + log.log(Level.FINER, "Input data matches schema 'List'"); + } + } catch (Exception e) { + // deserialization failed, continue + log.log(Level.FINER, "Input data does not match schema 'List'", e); + } + + CIAppCreatePipelineEventRequestDataSingleOrArray ret = + new CIAppCreatePipelineEventRequestDataSingleOrArray(); + if (match == 1) { + ret.setActualInstance(deserialized); + } else { + Map res = + new ObjectMapper() + .readValue( + tree.traverse(jp.getCodec()).readValueAsTree().toString(), + new TypeReference>() {}); + ret.setActualInstance(new UnparsedObject(res)); + } + return ret; + } + + /** Handle deserialization of the 'null' value. */ + @Override + public CIAppCreatePipelineEventRequestDataSingleOrArray getNullValue( + DeserializationContext ctxt) throws JsonMappingException { + throw new JsonMappingException( + ctxt.getParser(), "CIAppCreatePipelineEventRequestDataSingleOrArray cannot be null"); + } + } + + // store a list of schema names defined in oneOf + public static final Map schemas = new HashMap(); + + public CIAppCreatePipelineEventRequestDataSingleOrArray() { + super("oneOf", Boolean.FALSE); + } + + public CIAppCreatePipelineEventRequestDataSingleOrArray(CIAppCreatePipelineEventRequestData o) { + super("oneOf", Boolean.FALSE); + setActualInstance(o); + } + + public CIAppCreatePipelineEventRequestDataSingleOrArray( + List o) { + super("oneOf", Boolean.FALSE); + setActualInstance(o); + } + + static { + schemas.put( + "CIAppCreatePipelineEventRequestData", + new GenericType() {}); + schemas.put( + "List", + new GenericType>() {}); + JSON.registerDescendants( + CIAppCreatePipelineEventRequestDataSingleOrArray.class, + Collections.unmodifiableMap(schemas)); + } + + @Override + public Map getSchemas() { + return CIAppCreatePipelineEventRequestDataSingleOrArray.schemas; + } + + /** + * Set the instance that matches the oneOf child schema, check the instance parameter is valid + * against the oneOf child schemas: CIAppCreatePipelineEventRequestData, + * List<CIAppCreatePipelineEventRequestData> + * + *

It could be an instance of the 'oneOf' schemas. The oneOf child schemas may themselves be a + * composed schema (allOf, anyOf, oneOf). + */ + @Override + public void setActualInstance(Object instance) { + if (JSON.isInstanceOf( + CIAppCreatePipelineEventRequestData.class, instance, new HashSet>())) { + super.setActualInstance(instance); + return; + } + if (JSON.isInstanceOf(List.class, instance, new HashSet>())) { + super.setActualInstance(instance); + return; + } + + if (JSON.isInstanceOf(UnparsedObject.class, instance, new HashSet>())) { + super.setActualInstance(instance); + return; + } + throw new RuntimeException( + "Invalid instance type. Must be CIAppCreatePipelineEventRequestData," + + " List"); + } + + /** + * Get the actual instance, which can be the following: CIAppCreatePipelineEventRequestData, + * List<CIAppCreatePipelineEventRequestData> + * + * @return The actual instance (CIAppCreatePipelineEventRequestData, + * List<CIAppCreatePipelineEventRequestData>) + */ + @Override + public Object getActualInstance() { + return super.getActualInstance(); + } + + /** + * Get the actual instance of `CIAppCreatePipelineEventRequestData`. If the actual instance is not + * `CIAppCreatePipelineEventRequestData`, the ClassCastException will be thrown. + * + * @return The actual instance of `CIAppCreatePipelineEventRequestData` + * @throws ClassCastException if the instance is not `CIAppCreatePipelineEventRequestData` + */ + public CIAppCreatePipelineEventRequestData getCIAppCreatePipelineEventRequestData() + throws ClassCastException { + return (CIAppCreatePipelineEventRequestData) super.getActualInstance(); + } + + /** + * Get the actual instance of `List<CIAppCreatePipelineEventRequestData>`. If the actual + * instance is not `List<CIAppCreatePipelineEventRequestData>`, the ClassCastException will + * be thrown. + * + * @return The actual instance of `List<CIAppCreatePipelineEventRequestData>` + * @throws ClassCastException if the instance is not + * `List<CIAppCreatePipelineEventRequestData>` + */ + public List getList() throws ClassCastException { + return (List) super.getActualInstance(); + } +} diff --git a/src/test/resources/cassettes/features/v2/Send_several_pipeline_events_returns_Request_accepted_for_processing_response.freeze b/src/test/resources/cassettes/features/v2/Send_several_pipeline_events_returns_Request_accepted_for_processing_response.freeze new file mode 100644 index 00000000000..8404e45ce42 --- /dev/null +++ b/src/test/resources/cassettes/features/v2/Send_several_pipeline_events_returns_Request_accepted_for_processing_response.freeze @@ -0,0 +1 @@ +2025-09-02T15:10:26.479Z \ No newline at end of file diff --git a/src/test/resources/cassettes/features/v2/Send_several_pipeline_events_returns_Request_accepted_for_processing_response.json b/src/test/resources/cassettes/features/v2/Send_several_pipeline_events_returns_Request_accepted_for_processing_response.json new file mode 100644 index 00000000000..a5a58180008 --- /dev/null +++ b/src/test/resources/cassettes/features/v2/Send_several_pipeline_events_returns_Request_accepted_for_processing_response.json @@ -0,0 +1,32 @@ +[ + { + "httpRequest": { + "body": { + "type": "JSON", + "json": "{\"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 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 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\"}]}" + }, + "headers": {}, + "method": "POST", + "path": "/api/v2/ci/pipeline", + "keepAlive": false, + "secure": true + }, + "httpResponse": { + "body": "{\"data\":null}", + "headers": { + "Content-Type": [ + "application/vnd.api+json" + ] + }, + "statusCode": 202, + "reasonPhrase": "Accepted" + }, + "times": { + "remainingTimes": 1 + }, + "timeToLive": { + "unlimited": true + }, + "id": "07298831-5f64-383f-647b-df106bca8593" + } +] \ No newline at end of file diff --git a/src/test/resources/com/datadog/api/client/v2/api/ci_visibility_pipelines.feature b/src/test/resources/com/datadog/api/client/v2/api/ci_visibility_pipelines.feature index fa0a20d1d5f..3c52a30f4b7 100644 --- a/src/test/resources/com/datadog/api/client/v2/api/ci_visibility_pipelines.feature +++ b/src/test/resources/com/datadog/api/client/v2/api/ci_visibility_pipelines.feature @@ -17,7 +17,7 @@ Feature: CI Visibility Pipelines When the request is sent Then the response status is 400 Bad Request - @team:DataDog/ci-app-backend + @skip-java @skip-python @skip-typescript @team:DataDog/ci-app-backend Scenario: Aggregate pipelines events returns "OK" response Given a valid "appKeyAuth" key in the system And new "AggregateCIAppPipelineEvents" request @@ -33,7 +33,7 @@ Feature: CI Visibility Pipelines When the request is sent Then the response status is 400 Bad Request - @team:DataDog/ci-app-backend + @skip-java @skip-python @skip-typescript @team:DataDog/ci-app-backend Scenario: Get a list of pipelines events returns "OK" response Given a valid "appKeyAuth" key in the system And new "ListCIAppPipelineEvents" request @@ -44,7 +44,7 @@ Feature: CI Visibility Pipelines When the request is sent Then the response status is 200 OK - @replay-only @skip-validation @team:DataDog/ci-app-backend @with-pagination + @replay-only @skip-java @skip-python @skip-typescript @skip-validation @team:DataDog/ci-app-backend @with-pagination Scenario: Get a list of pipelines events returns "OK" response with pagination Given a valid "appKeyAuth" key in the system And new "ListCIAppPipelineEvents" request @@ -63,7 +63,7 @@ Feature: CI Visibility Pipelines When the request is sent Then the response status is 400 Bad Request - @team:DataDog/ci-app-backend + @skip-java @skip-python @skip-typescript @team:DataDog/ci-app-backend Scenario: Search pipelines events returns "OK" response Given a valid "appKeyAuth" key in the system And new "SearchCIAppPipelineEvents" request @@ -71,7 +71,7 @@ Feature: CI Visibility Pipelines When the request is sent Then the response status is 200 OK - @replay-only @skip-validation @team:DataDog/ci-app-backend @with-pagination + @replay-only @skip-java @skip-python @skip-typescript @skip-validation @team:DataDog/ci-app-backend @with-pagination Scenario: Search pipelines events returns "OK" response with pagination Given a valid "appKeyAuth" key in the system And new "SearchCIAppPipelineEvents" request @@ -101,30 +101,37 @@ Feature: CI Visibility Pipelines When the request is sent Then the response status is 408 Request Timeout - @team:DataDog/ci-app-backend + @skip-java @skip-python @skip-typescript @team:DataDog/ci-app-backend Scenario: Send pipeline event returns "Request accepted for processing" response Given new "CreateCIAppPipelineEvent" request 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"}} When the request is sent Then the response status is 202 Request accepted for processing - @team:DataDog/ci-app-backend + @skip-java @skip-python @skip-typescript @team:DataDog/ci-app-backend Scenario: Send pipeline event with custom provider returns "Request accepted for processing" response Given new "CreateCIAppPipelineEvent" request 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"}} When the request is sent Then the response status is 202 Request accepted for processing - @skip @team:DataDog/ci-app-backend + @skip @skip-java @skip-python @skip-typescript @team:DataDog/ci-app-backend Scenario: Send pipeline job event returns "Request accepted for processing" response Given new "CreateCIAppPipelineEvent" request 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"}} When the request is sent Then the response status is 202 Request accepted for processing - @team:DataDog/ci-app-backend + @skip-java @skip-python @skip-typescript @team:DataDog/ci-app-backend Scenario: Send running pipeline event returns "Request accepted for processing" response Given new "CreateCIAppPipelineEvent" request 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"}} When the request is sent Then the response status is 202 Request accepted for processing + + @skip-java @skip-python @skip-typescript @team:DataDog/ci-app-backend + Scenario: Send several pipeline events returns "Request accepted for processing" response + Given new "CreateCIAppPipelineEvent" request + 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"}]} + When the request is sent + Then the response status is 202 Request accepted for processing