diff --git a/.generator/schemas/v2/openapi.yaml b/.generator/schemas/v2/openapi.yaml index 035a0b32780..63597e6891c 100644 --- a/.generator/schemas/v2/openapi.yaml +++ b/.generator/schemas/v2/openapi.yaml @@ -65653,6 +65653,8 @@ components: properties: frequency: $ref: "#/components/schemas/TeamSyncAttributesFrequency" + selection_state: + $ref: "#/components/schemas/TeamSyncAttributesSelectionState" source: $ref: "#/components/schemas/TeamSyncAttributesSource" sync_membership: @@ -65675,6 +65677,14 @@ components: - ONCE - CONTINUOUSLY - PAUSED + TeamSyncAttributesSelectionState: + description: |- + Specifies which teams or organizations to sync. When + provided, synchronization is limited to the specified + items and their subtrees. + items: + $ref: "#/components/schemas/TeamSyncSelectionStateItem" + type: array TeamSyncAttributesSource: description: The external source platform for team synchronization. Only "github" is supported. enum: @@ -65684,6 +65694,7 @@ components: x-enum-varnames: - GITHUB TeamSyncAttributesSyncMembership: + default: false description: Whether to sync members from the external team to the Datadog team. Defaults to `false` when not provided. example: true type: boolean @@ -65743,6 +65754,72 @@ components: $ref: "#/components/schemas/TeamSyncData" type: array type: object + TeamSyncSelectionStateExternalId: + description: The external identifier for a team or organization in the source platform. + properties: + type: + $ref: "#/components/schemas/TeamSyncSelectionStateExternalIdType" + value: + $ref: "#/components/schemas/TeamSyncSelectionStateExternalIdValue" + required: + - type + - value + type: object + TeamSyncSelectionStateExternalIdType: + description: |- + The type of external identifier for the selection state item. + For GitHub synchronization, the allowed values are `team` and + `organization`. + enum: + - team + - organization + example: team + type: string + x-enum-varnames: + - TEAM + - ORGANIZATION + TeamSyncSelectionStateExternalIdValue: + description: |- + The external identifier value from the source + platform. For GitHub, this is the string + representation of a GitHub organization ID or team + ID. + example: "1" + type: string + TeamSyncSelectionStateItem: + description: Identifies a team or organization hierarchy to include in synchronization. + properties: + external_id: + $ref: "#/components/schemas/TeamSyncSelectionStateExternalId" + operation: + $ref: "#/components/schemas/TeamSyncSelectionStateOperation" + scope: + $ref: "#/components/schemas/TeamSyncSelectionStateScope" + required: + - external_id + type: object + TeamSyncSelectionStateOperation: + description: |- + The operation to perform on the selected hierarchy. + When set to `include`, synchronization covers the + referenced teams or organizations. + enum: + - include + example: include + type: string + x-enum-varnames: + - INCLUDE + TeamSyncSelectionStateScope: + description: |- + The scope of the selection. When set to `subtree`, + synchronization includes the referenced team or + organization and everything nested under it. + enum: + - subtree + example: subtree + type: string + x-enum-varnames: + - SUBTREE TeamTarget: description: "Represents a team target for an escalation policy step, including the team's ID and resource type." properties: @@ -105047,12 +105124,6 @@ paths: description: OK "403": $ref: "#/components/responses/ForbiddenResponse" - "404": - content: - application/json: - schema: - $ref: "#/components/schemas/APIErrorResponse" - description: Team sync configurations not found "429": $ref: "#/components/responses/TooManyRequestsResponse" security: @@ -105069,13 +105140,17 @@ paths: - teams_read post: description: |- - This endpoint attempts to link your existing Datadog teams with GitHub teams by matching their names. + This endpoint configures synchronization between your existing Datadog teams and GitHub teams by matching their names. It evaluates all current Datadog teams and compares them against teams in the GitHub organization connected to your Datadog account, based on Datadog Team handle and GitHub Team slug (lowercased and kebab-cased). This operation is read-only on the GitHub side, no teams will be modified or created. + Optionally, provide `selection_state` to limit synchronization + to specific teams or organizations and their subtrees, instead + of syncing all teams. + [A GitHub organization must be connected to your Datadog account](https://docs.datadoghq.com/integrations/github/), and the GitHub App integrated with Datadog must have the `Members Read` permission. Matching is performed by comparing the Datadog team handle to the GitHub team slug using a normalized exact match; case is ignored and spaces are removed. No modifications are made @@ -105090,6 +105165,8 @@ paths: responses: "200": description: OK + "204": + description: No Content "403": $ref: "#/components/responses/ForbiddenResponse" "429": diff --git a/examples/v2/teams/SyncTeams_3215592344.java b/examples/v2/teams/SyncTeams_3215592344.java deleted file mode 100644 index a71b55edbff..00000000000 --- a/examples/v2/teams/SyncTeams_3215592344.java +++ /dev/null @@ -1,38 +0,0 @@ -// Sync teams returns "OK" response - -import com.datadog.api.client.ApiClient; -import com.datadog.api.client.ApiException; -import com.datadog.api.client.v2.api.TeamsApi; -import com.datadog.api.client.v2.model.TeamSyncAttributes; -import com.datadog.api.client.v2.model.TeamSyncAttributesSource; -import com.datadog.api.client.v2.model.TeamSyncAttributesType; -import com.datadog.api.client.v2.model.TeamSyncBulkType; -import com.datadog.api.client.v2.model.TeamSyncData; -import com.datadog.api.client.v2.model.TeamSyncRequest; - -public class Example { - public static void main(String[] args) { - ApiClient defaultClient = ApiClient.getDefaultApiClient(); - TeamsApi apiInstance = new TeamsApi(defaultClient); - - TeamSyncRequest body = - new TeamSyncRequest() - .data( - new TeamSyncData() - .attributes( - new TeamSyncAttributes() - .source(TeamSyncAttributesSource.GITHUB) - .type(TeamSyncAttributesType.LINK)) - .type(TeamSyncBulkType.TEAM_SYNC_BULK)); - - try { - apiInstance.syncTeams(body); - } catch (ApiException e) { - System.err.println("Exception when calling TeamsApi#syncTeams"); - 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/src/main/java/com/datadog/api/client/v2/api/TeamsApi.java b/src/main/java/com/datadog/api/client/v2/api/TeamsApi.java index 59ea3516b4b..19ab6c45265 100644 --- a/src/main/java/com/datadog/api/client/v2/api/TeamsApi.java +++ b/src/main/java/com/datadog/api/client/v2/api/TeamsApi.java @@ -3211,7 +3211,6 @@ public CompletableFuture getTeamSyncAsync( * Status Code Description Response Headers * 200 OK - * 403 Forbidden - - * 404 Team sync configurations not found - * 429 Too many requests - * */ @@ -5019,13 +5018,16 @@ public CompletableFuture syncTeamsAsync(TeamSyncRequest body) { } /** - * This endpoint attempts to link your existing Datadog teams with GitHub teams by matching their - * names. It evaluates all current Datadog teams and compares them against teams in the GitHub - * organization connected to your Datadog account, based on Datadog Team handle and GitHub Team - * slug (lowercased and kebab-cased). + * This endpoint configures synchronization between your existing Datadog teams and GitHub teams + * by matching their names. It evaluates all current Datadog teams and compares them against teams + * in the GitHub organization connected to your Datadog account, based on Datadog Team handle and + * GitHub Team slug (lowercased and kebab-cased). * *

This operation is read-only on the GitHub side, no teams will be modified or created. * + *

Optionally, provide selection_state to limit synchronization to specific teams + * or organizations and their subtrees, instead of syncing all teams. + * *

A GitHub organization must be * connected to your Datadog account, and the GitHub App integrated with Datadog must have the * Members Read permission. Matching is performed by comparing the Datadog team @@ -5041,6 +5043,7 @@ public CompletableFuture syncTeamsAsync(TeamSyncRequest body) { * Response details * Status Code Description Response Headers * 200 OK - + * 204 No Content - * 403 Forbidden - * 429 Too many requests - * 500 Internal Server Error - Unexpected error during linking. - diff --git a/src/main/java/com/datadog/api/client/v2/model/TeamSyncAttributes.java b/src/main/java/com/datadog/api/client/v2/model/TeamSyncAttributes.java index 54697890ee4..4a33c374453 100644 --- a/src/main/java/com/datadog/api/client/v2/model/TeamSyncAttributes.java +++ b/src/main/java/com/datadog/api/client/v2/model/TeamSyncAttributes.java @@ -13,13 +13,16 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Objects; /** Team sync attributes. */ @JsonPropertyOrder({ TeamSyncAttributes.JSON_PROPERTY_FREQUENCY, + TeamSyncAttributes.JSON_PROPERTY_SELECTION_STATE, TeamSyncAttributes.JSON_PROPERTY_SOURCE, TeamSyncAttributes.JSON_PROPERTY_SYNC_MEMBERSHIP, TeamSyncAttributes.JSON_PROPERTY_TYPE @@ -31,11 +34,14 @@ public class TeamSyncAttributes { public static final String JSON_PROPERTY_FREQUENCY = "frequency"; private TeamSyncAttributesFrequency frequency; + public static final String JSON_PROPERTY_SELECTION_STATE = "selection_state"; + private List selectionState = null; + public static final String JSON_PROPERTY_SOURCE = "source"; private TeamSyncAttributesSource source; public static final String JSON_PROPERTY_SYNC_MEMBERSHIP = "sync_membership"; - private Boolean syncMembership; + private Boolean syncMembership = false; public static final String JSON_PROPERTY_TYPE = "type"; private TeamSyncAttributesType type; @@ -77,6 +83,40 @@ public void setFrequency(TeamSyncAttributesFrequency frequency) { this.frequency = frequency; } + public TeamSyncAttributes selectionState(List selectionState) { + this.selectionState = selectionState; + for (TeamSyncSelectionStateItem item : selectionState) { + this.unparsed |= item.unparsed; + } + return this; + } + + public TeamSyncAttributes addSelectionStateItem(TeamSyncSelectionStateItem selectionStateItem) { + if (this.selectionState == null) { + this.selectionState = new ArrayList<>(); + } + this.selectionState.add(selectionStateItem); + this.unparsed |= selectionStateItem.unparsed; + return this; + } + + /** + * Specifies which teams or organizations to sync. When provided, synchronization is limited to + * the specified items and their subtrees. + * + * @return selectionState + */ + @jakarta.annotation.Nullable + @JsonProperty(JSON_PROPERTY_SELECTION_STATE) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public List getSelectionState() { + return selectionState; + } + + public void setSelectionState(List selectionState) { + this.selectionState = selectionState; + } + public TeamSyncAttributes source(TeamSyncAttributesSource source) { this.source = source; this.unparsed |= !source.isValid(); @@ -205,6 +245,7 @@ public boolean equals(Object o) { } TeamSyncAttributes teamSyncAttributes = (TeamSyncAttributes) o; return Objects.equals(this.frequency, teamSyncAttributes.frequency) + && Objects.equals(this.selectionState, teamSyncAttributes.selectionState) && Objects.equals(this.source, teamSyncAttributes.source) && Objects.equals(this.syncMembership, teamSyncAttributes.syncMembership) && Objects.equals(this.type, teamSyncAttributes.type) @@ -213,7 +254,8 @@ public boolean equals(Object o) { @Override public int hashCode() { - return Objects.hash(frequency, source, syncMembership, type, additionalProperties); + return Objects.hash( + frequency, selectionState, source, syncMembership, type, additionalProperties); } @Override @@ -221,6 +263,7 @@ public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class TeamSyncAttributes {\n"); sb.append(" frequency: ").append(toIndentedString(frequency)).append("\n"); + sb.append(" selectionState: ").append(toIndentedString(selectionState)).append("\n"); sb.append(" source: ").append(toIndentedString(source)).append("\n"); sb.append(" syncMembership: ").append(toIndentedString(syncMembership)).append("\n"); sb.append(" type: ").append(toIndentedString(type)).append("\n"); diff --git a/src/main/java/com/datadog/api/client/v2/model/TeamSyncSelectionStateExternalId.java b/src/main/java/com/datadog/api/client/v2/model/TeamSyncSelectionStateExternalId.java new file mode 100644 index 00000000000..e47a6e073c4 --- /dev/null +++ b/src/main/java/com/datadog/api/client/v2/model/TeamSyncSelectionStateExternalId.java @@ -0,0 +1,183 @@ +/* + * 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.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +/** The external identifier for a team or organization in the source platform. */ +@JsonPropertyOrder({ + TeamSyncSelectionStateExternalId.JSON_PROPERTY_TYPE, + TeamSyncSelectionStateExternalId.JSON_PROPERTY_VALUE +}) +@jakarta.annotation.Generated( + value = "https://github.com/DataDog/datadog-api-client-java/blob/master/.generator") +public class TeamSyncSelectionStateExternalId { + @JsonIgnore public boolean unparsed = false; + public static final String JSON_PROPERTY_TYPE = "type"; + private TeamSyncSelectionStateExternalIdType type; + + public static final String JSON_PROPERTY_VALUE = "value"; + private String value; + + public TeamSyncSelectionStateExternalId() {} + + @JsonCreator + public TeamSyncSelectionStateExternalId( + @JsonProperty(required = true, value = JSON_PROPERTY_TYPE) + TeamSyncSelectionStateExternalIdType type, + @JsonProperty(required = true, value = JSON_PROPERTY_VALUE) String value) { + this.type = type; + this.unparsed |= !type.isValid(); + this.value = value; + } + + public TeamSyncSelectionStateExternalId type(TeamSyncSelectionStateExternalIdType type) { + this.type = type; + this.unparsed |= !type.isValid(); + return this; + } + + /** + * The type of external identifier for the selection state item. For GitHub synchronization, the + * allowed values are team and organization. + * + * @return type + */ + @JsonProperty(JSON_PROPERTY_TYPE) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + public TeamSyncSelectionStateExternalIdType getType() { + return type; + } + + public void setType(TeamSyncSelectionStateExternalIdType type) { + if (!type.isValid()) { + this.unparsed = true; + } + this.type = type; + } + + public TeamSyncSelectionStateExternalId value(String value) { + this.value = value; + return this; + } + + /** + * The external identifier value from the source platform. For GitHub, this is the string + * representation of a GitHub organization ID or team ID. + * + * @return value + */ + @JsonProperty(JSON_PROPERTY_VALUE) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + /** + * A container for additional, undeclared properties. This is a holder for any undeclared + * properties as specified with the 'additionalProperties' keyword in the OAS document. + */ + private Map additionalProperties; + + /** + * Set the additional (undeclared) property with the specified name and value. If the property + * does not already exist, create it otherwise replace it. + * + * @param key The arbitrary key to set + * @param value The associated value + * @return TeamSyncSelectionStateExternalId + */ + @JsonAnySetter + public TeamSyncSelectionStateExternalId putAdditionalProperty(String key, Object value) { + if (this.additionalProperties == null) { + this.additionalProperties = new HashMap(); + } + this.additionalProperties.put(key, value); + return this; + } + + /** + * Return the additional (undeclared) property. + * + * @return The additional properties + */ + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + /** + * Return the additional (undeclared) property with the specified name. + * + * @param key The arbitrary key to get + * @return The specific additional property for the given key + */ + public Object getAdditionalProperty(String key) { + if (this.additionalProperties == null) { + return null; + } + return this.additionalProperties.get(key); + } + + /** Return true if this TeamSyncSelectionStateExternalId object is equal to o. */ + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + TeamSyncSelectionStateExternalId teamSyncSelectionStateExternalId = + (TeamSyncSelectionStateExternalId) o; + return Objects.equals(this.type, teamSyncSelectionStateExternalId.type) + && Objects.equals(this.value, teamSyncSelectionStateExternalId.value) + && Objects.equals( + this.additionalProperties, teamSyncSelectionStateExternalId.additionalProperties); + } + + @Override + public int hashCode() { + return Objects.hash(type, value, additionalProperties); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class TeamSyncSelectionStateExternalId {\n"); + sb.append(" type: ").append(toIndentedString(type)).append("\n"); + sb.append(" value: ").append(toIndentedString(value)).append("\n"); + sb.append(" additionalProperties: ") + .append(toIndentedString(additionalProperties)) + .append("\n"); + sb.append('}'); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} diff --git a/src/main/java/com/datadog/api/client/v2/model/TeamSyncSelectionStateExternalIdType.java b/src/main/java/com/datadog/api/client/v2/model/TeamSyncSelectionStateExternalIdType.java new file mode 100644 index 00000000000..6dc60f50ec9 --- /dev/null +++ b/src/main/java/com/datadog/api/client/v2/model/TeamSyncSelectionStateExternalIdType.java @@ -0,0 +1,65 @@ +/* + * 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.ModelEnum; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; +import java.io.IOException; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +/** + * The type of external identifier for the selection state item. For GitHub synchronization, the + * allowed values are team and organization. + */ +@JsonSerialize( + using = + TeamSyncSelectionStateExternalIdType.TeamSyncSelectionStateExternalIdTypeSerializer.class) +public class TeamSyncSelectionStateExternalIdType extends ModelEnum { + + private static final Set allowedValues = + new HashSet(Arrays.asList("team", "organization")); + + public static final TeamSyncSelectionStateExternalIdType TEAM = + new TeamSyncSelectionStateExternalIdType("team"); + public static final TeamSyncSelectionStateExternalIdType ORGANIZATION = + new TeamSyncSelectionStateExternalIdType("organization"); + + TeamSyncSelectionStateExternalIdType(String value) { + super(value, allowedValues); + } + + public static class TeamSyncSelectionStateExternalIdTypeSerializer + extends StdSerializer { + public TeamSyncSelectionStateExternalIdTypeSerializer( + Class t) { + super(t); + } + + public TeamSyncSelectionStateExternalIdTypeSerializer() { + this(null); + } + + @Override + public void serialize( + TeamSyncSelectionStateExternalIdType value, JsonGenerator jgen, SerializerProvider provider) + throws IOException, JsonProcessingException { + jgen.writeObject(value.value); + } + } + + @JsonCreator + public static TeamSyncSelectionStateExternalIdType fromValue(String value) { + return new TeamSyncSelectionStateExternalIdType(value); + } +} diff --git a/src/main/java/com/datadog/api/client/v2/model/TeamSyncSelectionStateItem.java b/src/main/java/com/datadog/api/client/v2/model/TeamSyncSelectionStateItem.java new file mode 100644 index 00000000000..80d49861d95 --- /dev/null +++ b/src/main/java/com/datadog/api/client/v2/model/TeamSyncSelectionStateItem.java @@ -0,0 +1,213 @@ +/* + * 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.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +/** Identifies a team or organization hierarchy to include in synchronization. */ +@JsonPropertyOrder({ + TeamSyncSelectionStateItem.JSON_PROPERTY_EXTERNAL_ID, + TeamSyncSelectionStateItem.JSON_PROPERTY_OPERATION, + TeamSyncSelectionStateItem.JSON_PROPERTY_SCOPE +}) +@jakarta.annotation.Generated( + value = "https://github.com/DataDog/datadog-api-client-java/blob/master/.generator") +public class TeamSyncSelectionStateItem { + @JsonIgnore public boolean unparsed = false; + public static final String JSON_PROPERTY_EXTERNAL_ID = "external_id"; + private TeamSyncSelectionStateExternalId externalId; + + public static final String JSON_PROPERTY_OPERATION = "operation"; + private TeamSyncSelectionStateOperation operation; + + public static final String JSON_PROPERTY_SCOPE = "scope"; + private TeamSyncSelectionStateScope scope; + + public TeamSyncSelectionStateItem() {} + + @JsonCreator + public TeamSyncSelectionStateItem( + @JsonProperty(required = true, value = JSON_PROPERTY_EXTERNAL_ID) + TeamSyncSelectionStateExternalId externalId) { + this.externalId = externalId; + this.unparsed |= externalId.unparsed; + } + + public TeamSyncSelectionStateItem externalId(TeamSyncSelectionStateExternalId externalId) { + this.externalId = externalId; + this.unparsed |= externalId.unparsed; + return this; + } + + /** + * The external identifier for a team or organization in the source platform. + * + * @return externalId + */ + @JsonProperty(JSON_PROPERTY_EXTERNAL_ID) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + public TeamSyncSelectionStateExternalId getExternalId() { + return externalId; + } + + public void setExternalId(TeamSyncSelectionStateExternalId externalId) { + this.externalId = externalId; + } + + public TeamSyncSelectionStateItem operation(TeamSyncSelectionStateOperation operation) { + this.operation = operation; + this.unparsed |= !operation.isValid(); + return this; + } + + /** + * The operation to perform on the selected hierarchy. When set to include, + * synchronization covers the referenced teams or organizations. + * + * @return operation + */ + @jakarta.annotation.Nullable + @JsonProperty(JSON_PROPERTY_OPERATION) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public TeamSyncSelectionStateOperation getOperation() { + return operation; + } + + public void setOperation(TeamSyncSelectionStateOperation operation) { + if (!operation.isValid()) { + this.unparsed = true; + } + this.operation = operation; + } + + public TeamSyncSelectionStateItem scope(TeamSyncSelectionStateScope scope) { + this.scope = scope; + this.unparsed |= !scope.isValid(); + return this; + } + + /** + * The scope of the selection. When set to subtree, synchronization includes the + * referenced team or organization and everything nested under it. + * + * @return scope + */ + @jakarta.annotation.Nullable + @JsonProperty(JSON_PROPERTY_SCOPE) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public TeamSyncSelectionStateScope getScope() { + return scope; + } + + public void setScope(TeamSyncSelectionStateScope scope) { + if (!scope.isValid()) { + this.unparsed = true; + } + this.scope = scope; + } + + /** + * A container for additional, undeclared properties. This is a holder for any undeclared + * properties as specified with the 'additionalProperties' keyword in the OAS document. + */ + private Map additionalProperties; + + /** + * Set the additional (undeclared) property with the specified name and value. If the property + * does not already exist, create it otherwise replace it. + * + * @param key The arbitrary key to set + * @param value The associated value + * @return TeamSyncSelectionStateItem + */ + @JsonAnySetter + public TeamSyncSelectionStateItem putAdditionalProperty(String key, Object value) { + if (this.additionalProperties == null) { + this.additionalProperties = new HashMap(); + } + this.additionalProperties.put(key, value); + return this; + } + + /** + * Return the additional (undeclared) property. + * + * @return The additional properties + */ + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + /** + * Return the additional (undeclared) property with the specified name. + * + * @param key The arbitrary key to get + * @return The specific additional property for the given key + */ + public Object getAdditionalProperty(String key) { + if (this.additionalProperties == null) { + return null; + } + return this.additionalProperties.get(key); + } + + /** Return true if this TeamSyncSelectionStateItem object is equal to o. */ + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + TeamSyncSelectionStateItem teamSyncSelectionStateItem = (TeamSyncSelectionStateItem) o; + return Objects.equals(this.externalId, teamSyncSelectionStateItem.externalId) + && Objects.equals(this.operation, teamSyncSelectionStateItem.operation) + && Objects.equals(this.scope, teamSyncSelectionStateItem.scope) + && Objects.equals( + this.additionalProperties, teamSyncSelectionStateItem.additionalProperties); + } + + @Override + public int hashCode() { + return Objects.hash(externalId, operation, scope, additionalProperties); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class TeamSyncSelectionStateItem {\n"); + sb.append(" externalId: ").append(toIndentedString(externalId)).append("\n"); + sb.append(" operation: ").append(toIndentedString(operation)).append("\n"); + sb.append(" scope: ").append(toIndentedString(scope)).append("\n"); + sb.append(" additionalProperties: ") + .append(toIndentedString(additionalProperties)) + .append("\n"); + sb.append('}'); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} diff --git a/src/main/java/com/datadog/api/client/v2/model/TeamSyncSelectionStateOperation.java b/src/main/java/com/datadog/api/client/v2/model/TeamSyncSelectionStateOperation.java new file mode 100644 index 00000000000..d96db1617c3 --- /dev/null +++ b/src/main/java/com/datadog/api/client/v2/model/TeamSyncSelectionStateOperation.java @@ -0,0 +1,60 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2019-Present Datadog, Inc. + */ + +package com.datadog.api.client.v2.model; + +import com.datadog.api.client.ModelEnum; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; +import java.io.IOException; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +/** + * The operation to perform on the selected hierarchy. When set to include, + * synchronization covers the referenced teams or organizations. + */ +@JsonSerialize( + using = TeamSyncSelectionStateOperation.TeamSyncSelectionStateOperationSerializer.class) +public class TeamSyncSelectionStateOperation extends ModelEnum { + + private static final Set allowedValues = new HashSet(Arrays.asList("include")); + + public static final TeamSyncSelectionStateOperation INCLUDE = + new TeamSyncSelectionStateOperation("include"); + + TeamSyncSelectionStateOperation(String value) { + super(value, allowedValues); + } + + public static class TeamSyncSelectionStateOperationSerializer + extends StdSerializer { + public TeamSyncSelectionStateOperationSerializer(Class t) { + super(t); + } + + public TeamSyncSelectionStateOperationSerializer() { + this(null); + } + + @Override + public void serialize( + TeamSyncSelectionStateOperation value, JsonGenerator jgen, SerializerProvider provider) + throws IOException, JsonProcessingException { + jgen.writeObject(value.value); + } + } + + @JsonCreator + public static TeamSyncSelectionStateOperation fromValue(String value) { + return new TeamSyncSelectionStateOperation(value); + } +} diff --git a/src/main/java/com/datadog/api/client/v2/model/TeamSyncSelectionStateScope.java b/src/main/java/com/datadog/api/client/v2/model/TeamSyncSelectionStateScope.java new file mode 100644 index 00000000000..bd8b171ebc4 --- /dev/null +++ b/src/main/java/com/datadog/api/client/v2/model/TeamSyncSelectionStateScope.java @@ -0,0 +1,59 @@ +/* + * 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.ModelEnum; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; +import java.io.IOException; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +/** + * The scope of the selection. When set to subtree, synchronization includes the + * referenced team or organization and everything nested under it. + */ +@JsonSerialize(using = TeamSyncSelectionStateScope.TeamSyncSelectionStateScopeSerializer.class) +public class TeamSyncSelectionStateScope extends ModelEnum { + + private static final Set allowedValues = new HashSet(Arrays.asList("subtree")); + + public static final TeamSyncSelectionStateScope SUBTREE = + new TeamSyncSelectionStateScope("subtree"); + + TeamSyncSelectionStateScope(String value) { + super(value, allowedValues); + } + + public static class TeamSyncSelectionStateScopeSerializer + extends StdSerializer { + public TeamSyncSelectionStateScopeSerializer(Class t) { + super(t); + } + + public TeamSyncSelectionStateScopeSerializer() { + this(null); + } + + @Override + public void serialize( + TeamSyncSelectionStateScope value, JsonGenerator jgen, SerializerProvider provider) + throws IOException, JsonProcessingException { + jgen.writeObject(value.value); + } + } + + @JsonCreator + public static TeamSyncSelectionStateScope fromValue(String value) { + return new TeamSyncSelectionStateScope(value); + } +} diff --git a/src/test/resources/cassettes/features/v2/Get_team_sync_configurations_returns_OK_response.freeze b/src/test/resources/cassettes/features/v2/Get_team_sync_configurations_returns_OK_response.freeze new file mode 100644 index 00000000000..1332175b3b7 --- /dev/null +++ b/src/test/resources/cassettes/features/v2/Get_team_sync_configurations_returns_OK_response.freeze @@ -0,0 +1 @@ +2026-03-04T16:01:00.945Z \ No newline at end of file diff --git a/src/test/resources/cassettes/features/v2/Get_team_sync_configurations_returns_OK_response.json b/src/test/resources/cassettes/features/v2/Get_team_sync_configurations_returns_OK_response.json new file mode 100644 index 00000000000..54fb294b980 --- /dev/null +++ b/src/test/resources/cassettes/features/v2/Get_team_sync_configurations_returns_OK_response.json @@ -0,0 +1,33 @@ +[ + { + "httpRequest": { + "headers": {}, + "method": "GET", + "path": "/api/v2/team/sync", + "queryStringParameters": { + "filter[source]": [ + "github" + ] + }, + "keepAlive": false, + "secure": true + }, + "httpResponse": { + "body": "{\"data\":[{\"id\":\"3d33cc55-aea4-4801-bb75-139d347298c9\",\"type\":\"team_sync_bulk\",\"attributes\":{\"frequency\":\"once\",\"selection_state\":[{\"external_id\":{\"type\":\"organization\",\"value\":\"1\"},\"operation\":\"include\",\"scope\":\"subtree\"}],\"source\":\"github\",\"sync_membership\":false,\"type\":\"link\"}}]}", + "headers": { + "Content-Type": [ + "application/vnd.api+json" + ] + }, + "statusCode": 200, + "reasonPhrase": "OK" + }, + "times": { + "remainingTimes": 1 + }, + "timeToLive": { + "unlimited": true + }, + "id": "9340a9d9-b12b-e826-1e72-ba1bbc945a32" + } +] \ No newline at end of file diff --git a/src/test/resources/cassettes/features/v2/Link_Teams_with_GitHub_Teams_returns_No_Content_response.freeze b/src/test/resources/cassettes/features/v2/Link_Teams_with_GitHub_Teams_returns_No_Content_response.freeze new file mode 100644 index 00000000000..8e230ad6717 --- /dev/null +++ b/src/test/resources/cassettes/features/v2/Link_Teams_with_GitHub_Teams_returns_No_Content_response.freeze @@ -0,0 +1 @@ +2026-03-04T16:01:34.366Z \ No newline at end of file diff --git a/src/test/resources/cassettes/features/v2/Sync_teams_returns_OK_response.json b/src/test/resources/cassettes/features/v2/Link_Teams_with_GitHub_Teams_returns_No_Content_response.json similarity index 50% rename from src/test/resources/cassettes/features/v2/Sync_teams_returns_OK_response.json rename to src/test/resources/cassettes/features/v2/Link_Teams_with_GitHub_Teams_returns_No_Content_response.json index 0bb7093b2e9..16337f2b68b 100644 --- a/src/test/resources/cassettes/features/v2/Sync_teams_returns_OK_response.json +++ b/src/test/resources/cassettes/features/v2/Link_Teams_with_GitHub_Teams_returns_No_Content_response.json @@ -3,7 +3,7 @@ "httpRequest": { "body": { "type": "JSON", - "json": "{\"data\":{\"attributes\":{\"source\":\"github\",\"type\":\"link\"},\"type\":\"team_sync_bulk\"}}" + "json": "{\"data\":{\"attributes\":{\"selection_state\":[{\"external_id\":{\"type\":\"organization\",\"value\":\"1\"}}],\"source\":\"github\",\"type\":\"link\"},\"type\":\"team_sync_bulk\"}}" }, "headers": {}, "method": "POST", @@ -12,13 +12,9 @@ "secure": true }, "httpResponse": { - "headers": { - "Content-Type": [ - "text/plain" - ] - }, - "statusCode": 200, - "reasonPhrase": "OK" + "headers": {}, + "statusCode": 204, + "reasonPhrase": "No Content" }, "times": { "remainingTimes": 1 @@ -26,6 +22,6 @@ "timeToLive": { "unlimited": true }, - "id": "39416307-2f49-be15-7e10-9223981e6839" + "id": "56fda770-a389-5f07-97c8-e26a49e8311d" } ] \ No newline at end of file diff --git a/src/test/resources/cassettes/features/v2/Sync_teams_returns_OK_response.freeze b/src/test/resources/cassettes/features/v2/Sync_teams_returns_OK_response.freeze deleted file mode 100644 index 8723edd4fb6..00000000000 --- a/src/test/resources/cassettes/features/v2/Sync_teams_returns_OK_response.freeze +++ /dev/null @@ -1 +0,0 @@ -2025-08-15T17:48:19.712Z \ No newline at end of file diff --git a/src/test/resources/com/datadog/api/client/v2/api/teams.feature b/src/test/resources/com/datadog/api/client/v2/api/teams.feature index 26bf0130d4e..480e3215e99 100644 --- a/src/test/resources/com/datadog/api/client/v2/api/teams.feature +++ b/src/test/resources/com/datadog/api/client/v2/api/teams.feature @@ -431,20 +431,13 @@ Feature: Teams Then the response status is 200 OK And the response "data" has length 1 - @generated @skip @team:DataDog/aaa-omg + @team:DataDog/aaa-omg Scenario: Get team sync configurations returns "OK" response Given new "GetTeamSync" request - And request contains "filter[source]" parameter from "REPLACE.ME" + And request contains "filter[source]" parameter with value "github" When the request is sent Then the response status is 200 OK - @generated @skip @team:DataDog/aaa-omg - Scenario: Get team sync configurations returns "Team sync configurations not found" response - Given new "GetTeamSync" request - And request contains "filter[source]" parameter from "REPLACE.ME" - When the request is sent - Then the response status is 404 Team sync configurations not found - @generated @skip @team:DataDog/aaa-omg Scenario: Get user memberships returns "API error response." response Given new "GetUserMemberships" request @@ -461,6 +454,13 @@ Feature: Teams Then the response status is 200 Represents a user's association to a team And the response "data" has length 0 + @team:DataDog/aaa-omg + Scenario: Link Teams with GitHub Teams returns "No Content" response + Given new "SyncTeams" request + And body with value {"data": {"attributes": {"source": "github", "type": "link", "selection_state": [{"external_id": {"type": "organization", "value": "1"}}]}, "type": "team_sync_bulk"}} + When the request is sent + Then the response status is 204 No Content + @generated @skip @team:DataDog/aaa-omg Scenario: Link Teams with GitHub Teams returns "OK" response Given new "SyncTeams" request @@ -582,13 +582,6 @@ Feature: Teams When the request is sent Then the response status is 204 No Content - @replay-only @team:DataDog/aaa-omg - Scenario: Sync teams returns "OK" response - Given new "SyncTeams" request - And body with value {"data": {"attributes": {"source": "github", "type": "link"}, "type": "team_sync_bulk"}} - When the request is sent - Then the response status is 200 OK - @team:DataDog/aaa-omg Scenario: Update a team link returns "API error response." response Given new "UpdateTeamLink" request