diff --git a/.generator/schemas/v1/openapi.yaml b/.generator/schemas/v1/openapi.yaml index 6eb50c8c037..c48ba0ad971 100644 --- a/.generator/schemas/v1/openapi.yaml +++ b/.generator/schemas/v1/openapi.yaml @@ -18843,7 +18843,7 @@ components: $ref: "#/components/schemas/WidgetCustomLink" type: array requests: - description: One or more Topology requests. + description: One Topology request. items: $ref: "#/components/schemas/TopologyRequest" minItems: 1 @@ -18872,10 +18872,14 @@ components: x-enum-varnames: - TOPOLOGY_MAP TopologyQuery: + description: A topology data source query. + oneOf: + - $ref: "#/components/schemas/TopologyQueryDataStreamsOrServiceMap" + TopologyQueryDataStreamsOrServiceMap: description: Query to service-based topology data sources like the service map or data streams. properties: data_source: - $ref: "#/components/schemas/TopologyQueryDataSource" + $ref: "#/components/schemas/TopologyQueryDataStreamsOrServiceMapDataSource" filters: description: Your environment and primary tag (or * if enabled for your account). example: ["env:prod", "az:us-east"] @@ -18884,16 +18888,24 @@ components: type: string minItems: 1 type: array + query_string: + description: A search string for filtering services, used in `data_streams` queries only. When set, this replaces the `service` field + example: "service:myservice" + type: string service: description: Name of the service - example: myService + example: myservice type: string + required: + - data_source + - filters type: object - TopologyQueryDataSource: + TopologyQueryDataStreamsOrServiceMapDataSource: description: Name of the data source enum: - data_streams - service_map + example: data_streams type: string x-enum-varnames: - DATA_STREAMS diff --git a/.generator/schemas/v2/openapi.yaml b/.generator/schemas/v2/openapi.yaml index 74e03755883..3f667210991 100644 --- a/.generator/schemas/v2/openapi.yaml +++ b/.generator/schemas/v2/openapi.yaml @@ -56896,7 +56896,7 @@ components: $ref: "#/components/schemas/SecurityMonitoringCriticalAsset" type: object SecurityMonitoringCriticalAssetSeverity: - description: Severity associated with this critical asset. Either an explicit severity can be set, or the severity can be increased or decreased, or the severity can be left unchanged (no-op). + description: Severity associated with this critical asset. Either an explicit severity can be set, or the severity can be increased or decreased. enum: - info - low @@ -56905,7 +56905,6 @@ components: - critical - increase - decrease - - no-op example: increase type: string x-enum-varnames: @@ -56916,7 +56915,6 @@ components: - CRITICAL - INCREASE - DECREASE - - NO_OP SecurityMonitoringCriticalAssetType: default: critical_assets description: The type of the resource. The value should always be `critical_assets`. diff --git a/examples/v1/dashboards/CreateDashboard_2652180930.java b/examples/v1/dashboards/CreateDashboard_2652180930.java index 202790b3596..40aa983b4f3 100644 --- a/examples/v1/dashboards/CreateDashboard_2652180930.java +++ b/examples/v1/dashboards/CreateDashboard_2652180930.java @@ -8,7 +8,8 @@ import com.datadog.api.client.v1.model.TopologyMapWidgetDefinition; import com.datadog.api.client.v1.model.TopologyMapWidgetDefinitionType; import com.datadog.api.client.v1.model.TopologyQuery; -import com.datadog.api.client.v1.model.TopologyQueryDataSource; +import com.datadog.api.client.v1.model.TopologyQueryDataStreamsOrServiceMap; +import com.datadog.api.client.v1.model.TopologyQueryDataStreamsOrServiceMapDataSource; import com.datadog.api.client.v1.model.TopologyRequest; import com.datadog.api.client.v1.model.TopologyRequestType; import com.datadog.api.client.v1.model.Widget; @@ -43,13 +44,16 @@ public static void main(String[] args) { new TopologyRequest() .requestType(TopologyRequestType.TOPOLOGY) .query( - new TopologyQuery() - .dataSource( - TopologyQueryDataSource.SERVICE_MAP) - .service("") - .filters( - Arrays.asList( - "env:none", "environment:*"))))))))) + new TopologyQuery( + new TopologyQueryDataStreamsOrServiceMap() + .dataSource( + TopologyQueryDataStreamsOrServiceMapDataSource + .SERVICE_MAP) + .service("") + .filters( + Arrays.asList( + "env:none", + "environment:*")))))))))) .layoutType(DashboardLayoutType.FREE); try { diff --git a/examples/v1/dashboards/CreateDashboard_2815497946.java b/examples/v1/dashboards/CreateDashboard_2815497946.java new file mode 100644 index 00000000000..53964d3c52b --- /dev/null +++ b/examples/v1/dashboards/CreateDashboard_2815497946.java @@ -0,0 +1,70 @@ +// Create a new dashboard with topology_map data_streams widget + +import com.datadog.api.client.ApiClient; +import com.datadog.api.client.ApiException; +import com.datadog.api.client.v1.api.DashboardsApi; +import com.datadog.api.client.v1.model.Dashboard; +import com.datadog.api.client.v1.model.DashboardLayoutType; +import com.datadog.api.client.v1.model.TopologyMapWidgetDefinition; +import com.datadog.api.client.v1.model.TopologyMapWidgetDefinitionType; +import com.datadog.api.client.v1.model.TopologyQuery; +import com.datadog.api.client.v1.model.TopologyQueryDataStreamsOrServiceMap; +import com.datadog.api.client.v1.model.TopologyQueryDataStreamsOrServiceMapDataSource; +import com.datadog.api.client.v1.model.TopologyRequest; +import com.datadog.api.client.v1.model.TopologyRequestType; +import com.datadog.api.client.v1.model.Widget; +import com.datadog.api.client.v1.model.WidgetDefinition; +import com.datadog.api.client.v1.model.WidgetLayout; +import com.datadog.api.client.v1.model.WidgetTextAlign; +import java.util.Collections; + +public class Example { + public static void main(String[] args) { + ApiClient defaultClient = ApiClient.getDefaultApiClient(); + DashboardsApi apiInstance = new DashboardsApi(defaultClient); + + Dashboard body = + new Dashboard() + .title("Example-Dashboard") + .description("") + .widgets( + Collections.singletonList( + new Widget() + .layout(new WidgetLayout().x(0L).y(0L).width(47L).height(15L)) + .definition( + new WidgetDefinition( + new TopologyMapWidgetDefinition() + .title("") + .titleSize("16") + .titleAlign(WidgetTextAlign.LEFT) + .type(TopologyMapWidgetDefinitionType.TOPOLOGY_MAP) + .requests( + Collections.singletonList( + new TopologyRequest() + .requestType(TopologyRequestType.TOPOLOGY) + .query( + new TopologyQuery( + new TopologyQueryDataStreamsOrServiceMap() + .dataSource( + TopologyQueryDataStreamsOrServiceMapDataSource + .DATA_STREAMS) + .service("") + .filters( + Collections.singletonList( + "env:prod")) + .queryString( + "service:myservice"))))))))) + .layoutType(DashboardLayoutType.FREE); + + try { + Dashboard result = apiInstance.createDashboard(body); + System.out.println(result); + } catch (ApiException e) { + System.err.println("Exception when calling DashboardsApi#createDashboard"); + 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/v1/model/TopologyMapWidgetDefinition.java b/src/main/java/com/datadog/api/client/v1/model/TopologyMapWidgetDefinition.java index d02969df725..40360693aee 100644 --- a/src/main/java/com/datadog/api/client/v1/model/TopologyMapWidgetDefinition.java +++ b/src/main/java/com/datadog/api/client/v1/model/TopologyMapWidgetDefinition.java @@ -113,7 +113,7 @@ public TopologyMapWidgetDefinition addRequestsItem(TopologyRequest requestsItem) } /** - * One or more Topology requests. + * One Topology request. * * @return requests */ diff --git a/src/main/java/com/datadog/api/client/v1/model/TopologyQuery.java b/src/main/java/com/datadog/api/client/v1/model/TopologyQuery.java index 4b11e56e641..cda8a5d846c 100644 --- a/src/main/java/com/datadog/api/client/v1/model/TopologyQuery.java +++ b/src/main/java/com/datadog/api/client/v1/model/TopologyQuery.java @@ -6,200 +6,213 @@ package com.datadog.api.client.v1.model; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; +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.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import java.util.ArrayList; +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.List; +import java.util.HashSet; import java.util.Map; -import java.util.Objects; - -/** Query to service-based topology data sources like the service map or data streams. */ -@JsonPropertyOrder({ - TopologyQuery.JSON_PROPERTY_DATA_SOURCE, - TopologyQuery.JSON_PROPERTY_FILTERS, - TopologyQuery.JSON_PROPERTY_SERVICE -}) +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") -public class TopologyQuery { +@JsonDeserialize(using = TopologyQuery.TopologyQueryDeserializer.class) +@JsonSerialize(using = TopologyQuery.TopologyQuerySerializer.class) +public class TopologyQuery extends AbstractOpenApiSchema { + private static final Logger log = Logger.getLogger(TopologyQuery.class.getName()); + @JsonIgnore public boolean unparsed = false; - public static final String JSON_PROPERTY_DATA_SOURCE = "data_source"; - private TopologyQueryDataSource dataSource; - public static final String JSON_PROPERTY_FILTERS = "filters"; - private List filters = null; + public static class TopologyQuerySerializer extends StdSerializer { + public TopologyQuerySerializer(Class t) { + super(t); + } - public static final String JSON_PROPERTY_SERVICE = "service"; - private String service; + public TopologyQuerySerializer() { + this(null); + } - public TopologyQuery dataSource(TopologyQueryDataSource dataSource) { - this.dataSource = dataSource; - this.unparsed |= !dataSource.isValid(); - return this; + @Override + public void serialize(TopologyQuery value, JsonGenerator jgen, SerializerProvider provider) + throws IOException, JsonProcessingException { + jgen.writeObject(value.getActualInstance()); + } } - /** - * Name of the data source - * - * @return dataSource - */ - @jakarta.annotation.Nullable - @JsonProperty(JSON_PROPERTY_DATA_SOURCE) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) - public TopologyQueryDataSource getDataSource() { - return dataSource; - } + public static class TopologyQueryDeserializer extends StdDeserializer { + public TopologyQueryDeserializer() { + this(TopologyQuery.class); + } - public void setDataSource(TopologyQueryDataSource dataSource) { - if (!dataSource.isValid()) { - this.unparsed = true; + public TopologyQueryDeserializer(Class vc) { + super(vc); } - this.dataSource = dataSource; - } - public TopologyQuery filters(List filters) { - this.filters = filters; - return this; - } + @Override + public TopologyQuery 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 TopologyQueryDataStreamsOrServiceMap + try { + boolean attemptParsing = true; + // ensure that we respect type coercion as set on the client ObjectMapper + if (TopologyQueryDataStreamsOrServiceMap.class.equals(Integer.class) + || TopologyQueryDataStreamsOrServiceMap.class.equals(Long.class) + || TopologyQueryDataStreamsOrServiceMap.class.equals(Float.class) + || TopologyQueryDataStreamsOrServiceMap.class.equals(Double.class) + || TopologyQueryDataStreamsOrServiceMap.class.equals(Boolean.class) + || TopologyQueryDataStreamsOrServiceMap.class.equals(String.class)) { + attemptParsing = typeCoercion; + if (!attemptParsing) { + attemptParsing |= + ((TopologyQueryDataStreamsOrServiceMap.class.equals(Integer.class) + || TopologyQueryDataStreamsOrServiceMap.class.equals(Long.class)) + && token == JsonToken.VALUE_NUMBER_INT); + attemptParsing |= + ((TopologyQueryDataStreamsOrServiceMap.class.equals(Float.class) + || TopologyQueryDataStreamsOrServiceMap.class.equals(Double.class)) + && (token == JsonToken.VALUE_NUMBER_FLOAT + || token == JsonToken.VALUE_NUMBER_INT)); + attemptParsing |= + (TopologyQueryDataStreamsOrServiceMap.class.equals(Boolean.class) + && (token == JsonToken.VALUE_FALSE || token == JsonToken.VALUE_TRUE)); + attemptParsing |= + (TopologyQueryDataStreamsOrServiceMap.class.equals(String.class) + && token == JsonToken.VALUE_STRING); + } + } + if (attemptParsing) { + tmp = + tree.traverse(jp.getCodec()).readValueAs(TopologyQueryDataStreamsOrServiceMap.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 (!((TopologyQueryDataStreamsOrServiceMap) tmp).unparsed) { + deserialized = tmp; + match++; + } + log.log(Level.FINER, "Input data matches schema 'TopologyQueryDataStreamsOrServiceMap'"); + } + } catch (Exception e) { + // deserialization failed, continue + log.log( + Level.FINER, + "Input data does not match schema 'TopologyQueryDataStreamsOrServiceMap'", + e); + } + + TopologyQuery ret = new TopologyQuery(); + 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; + } - public TopologyQuery addFiltersItem(String filtersItem) { - if (this.filters == null) { - this.filters = new ArrayList<>(); + /** Handle deserialization of the 'null' value. */ + @Override + public TopologyQuery getNullValue(DeserializationContext ctxt) throws JsonMappingException { + throw new JsonMappingException(ctxt.getParser(), "TopologyQuery cannot be null"); } - this.filters.add(filtersItem); - return this; } - /** - * Your environment and primary tag (or * if enabled for your account). - * - * @return filters - */ - @jakarta.annotation.Nullable - @JsonProperty(JSON_PROPERTY_FILTERS) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) - public List getFilters() { - return filters; - } + // store a list of schema names defined in oneOf + public static final Map schemas = new HashMap(); - public void setFilters(List filters) { - this.filters = filters; + public TopologyQuery() { + super("oneOf", Boolean.FALSE); } - public TopologyQuery service(String service) { - this.service = service; - return this; + public TopologyQuery(TopologyQueryDataStreamsOrServiceMap o) { + super("oneOf", Boolean.FALSE); + setActualInstance(o); } - /** - * Name of the service - * - * @return service - */ - @jakarta.annotation.Nullable - @JsonProperty(JSON_PROPERTY_SERVICE) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) - public String getService() { - return service; + static { + schemas.put( + "TopologyQueryDataStreamsOrServiceMap", + new GenericType() {}); + JSON.registerDescendants(TopologyQuery.class, Collections.unmodifiableMap(schemas)); } - public void setService(String service) { - this.service = service; + @Override + public Map getSchemas() { + return TopologyQuery.schemas; } /** - * 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. + * Set the instance that matches the oneOf child schema, check the instance parameter is valid + * against the oneOf child schemas: TopologyQueryDataStreamsOrServiceMap * - * @param key The arbitrary key to set - * @param value The associated value - * @return TopologyQuery + *

It could be an instance of the 'oneOf' schemas. The oneOf child schemas may themselves be a + * composed schema (allOf, anyOf, oneOf). */ - @JsonAnySetter - public TopologyQuery putAdditionalProperty(String key, Object value) { - if (this.additionalProperties == null) { - this.additionalProperties = new HashMap(); + @Override + public void setActualInstance(Object instance) { + if (JSON.isInstanceOf( + TopologyQueryDataStreamsOrServiceMap.class, instance, new HashSet>())) { + super.setActualInstance(instance); + return; } - this.additionalProperties.put(key, value); - return this; - } - /** - * Return the additional (undeclared) property. - * - * @return The additional properties - */ - @JsonAnyGetter - public Map getAdditionalProperties() { - return additionalProperties; + if (JSON.isInstanceOf(UnparsedObject.class, instance, new HashSet>())) { + super.setActualInstance(instance); + return; + } + throw new RuntimeException( + "Invalid instance type. Must be TopologyQueryDataStreamsOrServiceMap"); } /** - * Return the additional (undeclared) property with the specified name. + * Get the actual instance, which can be the following: TopologyQueryDataStreamsOrServiceMap * - * @param key The arbitrary key to get - * @return The specific additional property for the given key + * @return The actual instance (TopologyQueryDataStreamsOrServiceMap) */ - public Object getAdditionalProperty(String key) { - if (this.additionalProperties == null) { - return null; - } - return this.additionalProperties.get(key); - } - - /** Return true if this TopologyQuery object is equal to o. */ @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - TopologyQuery topologyQuery = (TopologyQuery) o; - return Objects.equals(this.dataSource, topologyQuery.dataSource) - && Objects.equals(this.filters, topologyQuery.filters) - && Objects.equals(this.service, topologyQuery.service) - && Objects.equals(this.additionalProperties, topologyQuery.additionalProperties); - } - - @Override - public int hashCode() { - return Objects.hash(dataSource, filters, service, additionalProperties); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("class TopologyQuery {\n"); - sb.append(" dataSource: ").append(toIndentedString(dataSource)).append("\n"); - sb.append(" filters: ").append(toIndentedString(filters)).append("\n"); - sb.append(" service: ").append(toIndentedString(service)).append("\n"); - sb.append(" additionalProperties: ") - .append(toIndentedString(additionalProperties)) - .append("\n"); - sb.append('}'); - return sb.toString(); + public Object getActualInstance() { + return super.getActualInstance(); } /** - * Convert the given object to string with each line indented by 4 spaces (except the first line). + * Get the actual instance of `TopologyQueryDataStreamsOrServiceMap`. If the actual instance is + * not `TopologyQueryDataStreamsOrServiceMap`, the ClassCastException will be thrown. + * + * @return The actual instance of `TopologyQueryDataStreamsOrServiceMap` + * @throws ClassCastException if the instance is not `TopologyQueryDataStreamsOrServiceMap` */ - private String toIndentedString(Object o) { - if (o == null) { - return "null"; - } - return o.toString().replace("\n", "\n "); + public TopologyQueryDataStreamsOrServiceMap getTopologyQueryDataStreamsOrServiceMap() + throws ClassCastException { + return (TopologyQueryDataStreamsOrServiceMap) super.getActualInstance(); } } diff --git a/src/main/java/com/datadog/api/client/v1/model/TopologyQueryDataSource.java b/src/main/java/com/datadog/api/client/v1/model/TopologyQueryDataSource.java deleted file mode 100644 index d7796b96ad1..00000000000 --- a/src/main/java/com/datadog/api/client/v1/model/TopologyQueryDataSource.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * 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.v1.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; - -/** Name of the data source */ -@JsonSerialize(using = TopologyQueryDataSource.TopologyQueryDataSourceSerializer.class) -public class TopologyQueryDataSource extends ModelEnum { - - private static final Set allowedValues = - new HashSet(Arrays.asList("data_streams", "service_map")); - - public static final TopologyQueryDataSource DATA_STREAMS = - new TopologyQueryDataSource("data_streams"); - public static final TopologyQueryDataSource SERVICE_MAP = - new TopologyQueryDataSource("service_map"); - - TopologyQueryDataSource(String value) { - super(value, allowedValues); - } - - public static class TopologyQueryDataSourceSerializer - extends StdSerializer { - public TopologyQueryDataSourceSerializer(Class t) { - super(t); - } - - public TopologyQueryDataSourceSerializer() { - this(null); - } - - @Override - public void serialize( - TopologyQueryDataSource value, JsonGenerator jgen, SerializerProvider provider) - throws IOException, JsonProcessingException { - jgen.writeObject(value.value); - } - } - - @JsonCreator - public static TopologyQueryDataSource fromValue(String value) { - return new TopologyQueryDataSource(value); - } -} diff --git a/src/main/java/com/datadog/api/client/v1/model/TopologyQueryDataStreamsOrServiceMap.java b/src/main/java/com/datadog/api/client/v1/model/TopologyQueryDataStreamsOrServiceMap.java new file mode 100644 index 00000000000..c49722a3655 --- /dev/null +++ b/src/main/java/com/datadog/api/client/v1/model/TopologyQueryDataStreamsOrServiceMap.java @@ -0,0 +1,244 @@ +/* + * 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.v1.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.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** Query to service-based topology data sources like the service map or data streams. */ +@JsonPropertyOrder({ + TopologyQueryDataStreamsOrServiceMap.JSON_PROPERTY_DATA_SOURCE, + TopologyQueryDataStreamsOrServiceMap.JSON_PROPERTY_FILTERS, + TopologyQueryDataStreamsOrServiceMap.JSON_PROPERTY_QUERY_STRING, + TopologyQueryDataStreamsOrServiceMap.JSON_PROPERTY_SERVICE +}) +@jakarta.annotation.Generated( + value = "https://github.com/DataDog/datadog-api-client-java/blob/master/.generator") +public class TopologyQueryDataStreamsOrServiceMap { + @JsonIgnore public boolean unparsed = false; + public static final String JSON_PROPERTY_DATA_SOURCE = "data_source"; + private TopologyQueryDataStreamsOrServiceMapDataSource dataSource; + + public static final String JSON_PROPERTY_FILTERS = "filters"; + private List filters = new ArrayList<>(); + + public static final String JSON_PROPERTY_QUERY_STRING = "query_string"; + private String queryString; + + public static final String JSON_PROPERTY_SERVICE = "service"; + private String service; + + public TopologyQueryDataStreamsOrServiceMap() {} + + @JsonCreator + public TopologyQueryDataStreamsOrServiceMap( + @JsonProperty(required = true, value = JSON_PROPERTY_DATA_SOURCE) + TopologyQueryDataStreamsOrServiceMapDataSource dataSource, + @JsonProperty(required = true, value = JSON_PROPERTY_FILTERS) List filters) { + this.dataSource = dataSource; + this.unparsed |= !dataSource.isValid(); + this.filters = filters; + } + + public TopologyQueryDataStreamsOrServiceMap dataSource( + TopologyQueryDataStreamsOrServiceMapDataSource dataSource) { + this.dataSource = dataSource; + this.unparsed |= !dataSource.isValid(); + return this; + } + + /** + * Name of the data source + * + * @return dataSource + */ + @JsonProperty(JSON_PROPERTY_DATA_SOURCE) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + public TopologyQueryDataStreamsOrServiceMapDataSource getDataSource() { + return dataSource; + } + + public void setDataSource(TopologyQueryDataStreamsOrServiceMapDataSource dataSource) { + if (!dataSource.isValid()) { + this.unparsed = true; + } + this.dataSource = dataSource; + } + + public TopologyQueryDataStreamsOrServiceMap filters(List filters) { + this.filters = filters; + return this; + } + + public TopologyQueryDataStreamsOrServiceMap addFiltersItem(String filtersItem) { + this.filters.add(filtersItem); + return this; + } + + /** + * Your environment and primary tag (or * if enabled for your account). + * + * @return filters + */ + @JsonProperty(JSON_PROPERTY_FILTERS) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + public List getFilters() { + return filters; + } + + public void setFilters(List filters) { + this.filters = filters; + } + + public TopologyQueryDataStreamsOrServiceMap queryString(String queryString) { + this.queryString = queryString; + return this; + } + + /** + * A search string for filtering services, used in data_streams queries only. When + * set, this replaces the service field + * + * @return queryString + */ + @jakarta.annotation.Nullable + @JsonProperty(JSON_PROPERTY_QUERY_STRING) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public String getQueryString() { + return queryString; + } + + public void setQueryString(String queryString) { + this.queryString = queryString; + } + + public TopologyQueryDataStreamsOrServiceMap service(String service) { + this.service = service; + return this; + } + + /** + * Name of the service + * + * @return service + */ + @jakarta.annotation.Nullable + @JsonProperty(JSON_PROPERTY_SERVICE) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public String getService() { + return service; + } + + public void setService(String service) { + this.service = service; + } + + /** + * 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 TopologyQueryDataStreamsOrServiceMap + */ + @JsonAnySetter + public TopologyQueryDataStreamsOrServiceMap 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 TopologyQueryDataStreamsOrServiceMap object is equal to o. */ + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + TopologyQueryDataStreamsOrServiceMap topologyQueryDataStreamsOrServiceMap = + (TopologyQueryDataStreamsOrServiceMap) o; + return Objects.equals(this.dataSource, topologyQueryDataStreamsOrServiceMap.dataSource) + && Objects.equals(this.filters, topologyQueryDataStreamsOrServiceMap.filters) + && Objects.equals(this.queryString, topologyQueryDataStreamsOrServiceMap.queryString) + && Objects.equals(this.service, topologyQueryDataStreamsOrServiceMap.service) + && Objects.equals( + this.additionalProperties, topologyQueryDataStreamsOrServiceMap.additionalProperties); + } + + @Override + public int hashCode() { + return Objects.hash(dataSource, filters, queryString, service, additionalProperties); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class TopologyQueryDataStreamsOrServiceMap {\n"); + sb.append(" dataSource: ").append(toIndentedString(dataSource)).append("\n"); + sb.append(" filters: ").append(toIndentedString(filters)).append("\n"); + sb.append(" queryString: ").append(toIndentedString(queryString)).append("\n"); + sb.append(" service: ").append(toIndentedString(service)).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/v1/model/TopologyQueryDataStreamsOrServiceMapDataSource.java b/src/main/java/com/datadog/api/client/v1/model/TopologyQueryDataStreamsOrServiceMapDataSource.java new file mode 100644 index 00000000000..549c74b5e48 --- /dev/null +++ b/src/main/java/com/datadog/api/client/v1/model/TopologyQueryDataStreamsOrServiceMapDataSource.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.v1.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; + +/** Name of the data source */ +@JsonSerialize( + using = + TopologyQueryDataStreamsOrServiceMapDataSource + .TopologyQueryDataStreamsOrServiceMapDataSourceSerializer.class) +public class TopologyQueryDataStreamsOrServiceMapDataSource extends ModelEnum { + + private static final Set allowedValues = + new HashSet(Arrays.asList("data_streams", "service_map")); + + public static final TopologyQueryDataStreamsOrServiceMapDataSource DATA_STREAMS = + new TopologyQueryDataStreamsOrServiceMapDataSource("data_streams"); + public static final TopologyQueryDataStreamsOrServiceMapDataSource SERVICE_MAP = + new TopologyQueryDataStreamsOrServiceMapDataSource("service_map"); + + TopologyQueryDataStreamsOrServiceMapDataSource(String value) { + super(value, allowedValues); + } + + public static class TopologyQueryDataStreamsOrServiceMapDataSourceSerializer + extends StdSerializer { + public TopologyQueryDataStreamsOrServiceMapDataSourceSerializer( + Class t) { + super(t); + } + + public TopologyQueryDataStreamsOrServiceMapDataSourceSerializer() { + this(null); + } + + @Override + public void serialize( + TopologyQueryDataStreamsOrServiceMapDataSource value, + JsonGenerator jgen, + SerializerProvider provider) + throws IOException, JsonProcessingException { + jgen.writeObject(value.value); + } + } + + @JsonCreator + public static TopologyQueryDataStreamsOrServiceMapDataSource fromValue(String value) { + return new TopologyQueryDataStreamsOrServiceMapDataSource(value); + } +} diff --git a/src/main/java/com/datadog/api/client/v1/model/TopologyRequest.java b/src/main/java/com/datadog/api/client/v1/model/TopologyRequest.java index 0c4a9ce92bd..c4ed7091522 100644 --- a/src/main/java/com/datadog/api/client/v1/model/TopologyRequest.java +++ b/src/main/java/com/datadog/api/client/v1/model/TopologyRequest.java @@ -38,7 +38,7 @@ public TopologyRequest query(TopologyQuery query) { } /** - * Query to service-based topology data sources like the service map or data streams. + * A topology data source query. * * @return query */ diff --git a/src/main/java/com/datadog/api/client/v2/model/SecurityMonitoringCriticalAssetAttributes.java b/src/main/java/com/datadog/api/client/v2/model/SecurityMonitoringCriticalAssetAttributes.java index b4d354966d8..4cb6f247b69 100644 --- a/src/main/java/com/datadog/api/client/v2/model/SecurityMonitoringCriticalAssetAttributes.java +++ b/src/main/java/com/datadog/api/client/v2/model/SecurityMonitoringCriticalAssetAttributes.java @@ -211,7 +211,7 @@ public SecurityMonitoringCriticalAssetAttributes severity( /** * Severity associated with this critical asset. Either an explicit severity can be set, or the - * severity can be increased or decreased, or the severity can be left unchanged (no-op). + * severity can be increased or decreased. * * @return severity */ diff --git a/src/main/java/com/datadog/api/client/v2/model/SecurityMonitoringCriticalAssetCreateAttributes.java b/src/main/java/com/datadog/api/client/v2/model/SecurityMonitoringCriticalAssetCreateAttributes.java index d3eed27d5cc..daa4684cd93 100644 --- a/src/main/java/com/datadog/api/client/v2/model/SecurityMonitoringCriticalAssetCreateAttributes.java +++ b/src/main/java/com/datadog/api/client/v2/model/SecurityMonitoringCriticalAssetCreateAttributes.java @@ -132,7 +132,7 @@ public SecurityMonitoringCriticalAssetCreateAttributes severity( /** * Severity associated with this critical asset. Either an explicit severity can be set, or the - * severity can be increased or decreased, or the severity can be left unchanged (no-op). + * severity can be increased or decreased. * * @return severity */ diff --git a/src/main/java/com/datadog/api/client/v2/model/SecurityMonitoringCriticalAssetSeverity.java b/src/main/java/com/datadog/api/client/v2/model/SecurityMonitoringCriticalAssetSeverity.java index 26efc4e8bc4..a209681a0d8 100644 --- a/src/main/java/com/datadog/api/client/v2/model/SecurityMonitoringCriticalAssetSeverity.java +++ b/src/main/java/com/datadog/api/client/v2/model/SecurityMonitoringCriticalAssetSeverity.java @@ -20,7 +20,7 @@ /** * Severity associated with this critical asset. Either an explicit severity can be set, or the - * severity can be increased or decreased, or the severity can be left unchanged (no-op). + * severity can be increased or decreased. */ @JsonSerialize( using = @@ -30,8 +30,7 @@ public class SecurityMonitoringCriticalAssetSeverity extends ModelEnum { private static final Set allowedValues = new HashSet( - Arrays.asList( - "info", "low", "medium", "high", "critical", "increase", "decrease", "no-op")); + Arrays.asList("info", "low", "medium", "high", "critical", "increase", "decrease")); public static final SecurityMonitoringCriticalAssetSeverity INFO = new SecurityMonitoringCriticalAssetSeverity("info"); @@ -47,8 +46,6 @@ public class SecurityMonitoringCriticalAssetSeverity extends ModelEnum { new SecurityMonitoringCriticalAssetSeverity("increase"); public static final SecurityMonitoringCriticalAssetSeverity DECREASE = new SecurityMonitoringCriticalAssetSeverity("decrease"); - public static final SecurityMonitoringCriticalAssetSeverity NO_OP = - new SecurityMonitoringCriticalAssetSeverity("no-op"); SecurityMonitoringCriticalAssetSeverity(String value) { super(value, allowedValues); diff --git a/src/main/java/com/datadog/api/client/v2/model/SecurityMonitoringCriticalAssetUpdateAttributes.java b/src/main/java/com/datadog/api/client/v2/model/SecurityMonitoringCriticalAssetUpdateAttributes.java index 9cf6dbf9e9b..43619071ae0 100644 --- a/src/main/java/com/datadog/api/client/v2/model/SecurityMonitoringCriticalAssetUpdateAttributes.java +++ b/src/main/java/com/datadog/api/client/v2/model/SecurityMonitoringCriticalAssetUpdateAttributes.java @@ -123,7 +123,7 @@ public SecurityMonitoringCriticalAssetUpdateAttributes severity( /** * Severity associated with this critical asset. Either an explicit severity can be set, or the - * severity can be increased or decreased, or the severity can be left unchanged (no-op). + * severity can be increased or decreased. * * @return severity */ diff --git a/src/test/resources/cassettes/features/v1/Create_a_new_dashboard_with_topology_map_data_streams_widget.freeze b/src/test/resources/cassettes/features/v1/Create_a_new_dashboard_with_topology_map_data_streams_widget.freeze new file mode 100644 index 00000000000..21a59912fa3 --- /dev/null +++ b/src/test/resources/cassettes/features/v1/Create_a_new_dashboard_with_topology_map_data_streams_widget.freeze @@ -0,0 +1 @@ +2026-03-20T18:16:51.929Z \ No newline at end of file diff --git a/src/test/resources/cassettes/features/v1/Create_a_new_dashboard_with_topology_map_data_streams_widget.json b/src/test/resources/cassettes/features/v1/Create_a_new_dashboard_with_topology_map_data_streams_widget.json new file mode 100644 index 00000000000..59814bdb0e4 --- /dev/null +++ b/src/test/resources/cassettes/features/v1/Create_a_new_dashboard_with_topology_map_data_streams_widget.json @@ -0,0 +1,58 @@ +[ + { + "httpRequest": { + "body": { + "type": "JSON", + "json": "{\"description\":\"\",\"layout_type\":\"free\",\"notify_list\":[],\"template_variables\":[],\"title\":\"Test-Create_a_new_dashboard_with_topology_map_data_streams_widget-1774030611\",\"widgets\":[{\"definition\":{\"requests\":[{\"query\":{\"data_source\":\"data_streams\",\"filters\":[\"env:prod\"],\"query_string\":\"service:myservice\",\"service\":\"\"},\"request_type\":\"topology\"}],\"title\":\"\",\"title_align\":\"left\",\"title_size\":\"16\",\"type\":\"topology_map\"},\"layout\":{\"height\":15,\"width\":47,\"x\":0,\"y\":0}}]}" + }, + "headers": {}, + "method": "POST", + "path": "/api/v1/dashboard", + "keepAlive": false, + "secure": true + }, + "httpResponse": { + "body": "{\"id\":\"whr-253-7we\",\"title\":\"Test-Create_a_new_dashboard_with_topology_map_data_streams_widget-1774030611\",\"description\":\"\",\"author_handle\":\"9919ec9b-ebc7-49ee-8dc8-03626e717cca\",\"author_name\":\"CI Account\",\"layout_type\":\"free\",\"url\":\"/dashboard/whr-253-7we/test-createanewdashboardwithtopologymapdatastreamswidget-1774030611\",\"template_variables\":[],\"widgets\":[{\"definition\":{\"requests\":[{\"query\":{\"data_source\":\"data_streams\",\"filters\":[\"env:prod\"],\"query_string\":\"service:myservice\",\"service\":\"\"},\"request_type\":\"topology\"}],\"title\":\"\",\"title_align\":\"left\",\"title_size\":\"16\",\"type\":\"topology_map\"},\"layout\":{\"height\":15,\"width\":47,\"x\":0,\"y\":0},\"id\":1843670487553482}],\"notify_list\":[],\"created_at\":\"2026-03-20T18:16:52.209473+00:00\",\"modified_at\":\"2026-03-20T18:16:52.209473+00:00\",\"restricted_roles\":[]}", + "headers": { + "Content-Type": [ + "application/json" + ] + }, + "statusCode": 200, + "reasonPhrase": "OK" + }, + "times": { + "remainingTimes": 1 + }, + "timeToLive": { + "unlimited": true + }, + "id": "5ef852d7-c1bc-cb27-9d3a-40ee81b48bd4" + }, + { + "httpRequest": { + "headers": {}, + "method": "DELETE", + "path": "/api/v1/dashboard/whr-253-7we", + "keepAlive": false, + "secure": true + }, + "httpResponse": { + "body": "{\"deleted_dashboard_id\":\"whr-253-7we\"}", + "headers": { + "Content-Type": [ + "application/json" + ] + }, + "statusCode": 200, + "reasonPhrase": "OK" + }, + "times": { + "remainingTimes": 1 + }, + "timeToLive": { + "unlimited": true + }, + "id": "33d0dcbd-89c8-bfed-9729-3770bde62baa" + } +] \ No newline at end of file diff --git a/src/test/resources/com/datadog/api/client/v1/api/dashboards.feature b/src/test/resources/com/datadog/api/client/v1/api/dashboards.feature index 0b753ac17b9..fb95df356c5 100644 --- a/src/test/resources/com/datadog/api/client/v1/api/dashboards.feature +++ b/src/test/resources/com/datadog/api/client/v1/api/dashboards.feature @@ -1028,6 +1028,19 @@ Feature: Dashboards And the response "widgets[0].definition.requests[0].sort.order_by[0].type" is equal to "formula" And the response "widgets[0].definition.requests[0].sort.order_by[0].index" is equal to 0 + @team:DataDog/dashboards-backend + Scenario: Create a new dashboard with topology_map data_streams widget + Given new "CreateDashboard" request + And body from file "dashboards_json_payload/topology_map_widget_data_streams.json" + When the request is sent + Then the response status is 200 OK + And the response "widgets[0].definition.type" is equal to "topology_map" + And the response "widgets[0].definition.requests[0].request_type" is equal to "topology" + And the response "widgets[0].definition.requests[0].query.data_source" is equal to "data_streams" + And the response "widgets[0].definition.requests[0].query.service" is equal to "" + And the response "widgets[0].definition.requests[0].query.filters" is equal to ["env:prod"] + And the response "widgets[0].definition.requests[0].query.query_string" is equal to "service:myservice" + @team:DataDog/dashboards-backend Scenario: Create a new dashboard with topology_map widget Given new "CreateDashboard" request diff --git a/src/test/resources/com/datadog/api/client/v1/api/dashboards_json_payload/topology_map_widget_data_streams.json b/src/test/resources/com/datadog/api/client/v1/api/dashboards_json_payload/topology_map_widget_data_streams.json new file mode 100644 index 00000000000..f454b974e6b --- /dev/null +++ b/src/test/resources/com/datadog/api/client/v1/api/dashboards_json_payload/topology_map_widget_data_streams.json @@ -0,0 +1,34 @@ +{ + "title": "{{ unique }}", + "description": "", + "widgets": [ + { + "layout": { + "x": 0, + "y": 0, + "width": 47, + "height": 15 + }, + "definition": { + "title": "", + "title_size": "16", + "title_align": "left", + "type": "topology_map", + "requests": [ + { + "request_type": "topology", + "query": { + "data_source": "data_streams", + "service": "", + "filters": ["env:prod"], + "query_string": "service:myservice" + } + } + ] + } + } + ], + "template_variables": [], + "layout_type": "free", + "notify_list": [] +}