From 48b87a837566d3f7ece708c3fb3938357e898c1c Mon Sep 17 00:00:00 2001 From: "databricks-ci-ghec-1[bot]" <184311507+databricks-ci-ghec-1[bot]@users.noreply.github.com> Date: Wed, 9 Sep 2026 03:54:42 +0000 Subject: [PATCH] Update SDK to 129c9a58f8048f59e7d2829261ec88b7ec9f567f --- .codegen/_openapi_sha | 2 +- .gitattributes | 8 + NEXT_CHANGELOG.md | 5 + .../sdk/service/catalog/DenyOptions.java | 46 +++++ .../sdk/service/catalog/PolicyInfo.java | 20 +++ .../sdk/service/catalog/PolicyType.java | 1 + .../service/cleanrooms/CleanRoomAsset.java | 3 +- .../UpdateCleanRoomAssetRequest.java | 3 +- .../service/domains/DeleteDomainRequest.java | 1 - .../sdk/service/ml/FeatureEngineeringAPI.java | 6 + .../service/ml/FeatureEngineeringImpl.java | 21 +++ .../service/ml/FeatureEngineeringService.java | 3 + .../sdk/service/ml/IngestionConfig.java | 47 ++++- .../sdk/service/ml/MaterializedFeature.java | 50 +++++- .../ml/PurgeFeatureEntitiesMetadata.java | 122 +++++++++++++ .../ml/PurgeFeatureEntitiesMetadataState.java | 15 ++ .../ml/PurgeFeatureEntitiesOperation.java | 163 ++++++++++++++++++ .../ml/PurgeFeatureEntitiesRequest.java | 87 ++++++++++ .../ml/PurgeFeatureEntitiesResponse.java | 76 ++++++++ .../ml/PurgeFeatureEntitiesResult.java | 90 ++++++++++ .../ml/PurgeFeatureEntitiesResultState.java | 13 ++ .../pipelines/ListPipelinesRequest.java | 2 +- .../pipelines/ListPipelinesResponse.java | 4 +- .../sdk/service/pipelines/PipelinesAPI.java | 4 +- .../service/pipelines/PipelinesService.java | 4 +- .../sdk/service/postgres/BranchSpec.java | 7 +- .../sdk/service/postgres/EndpointSpec.java | 5 +- .../ProjectDefaultEndpointSettings.java | 6 +- tagging.py | 51 ++++-- 29 files changed, 826 insertions(+), 39 deletions(-) create mode 100644 databricks-sdk-java/src/main/java/com/databricks/sdk/service/catalog/DenyOptions.java create mode 100644 databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PurgeFeatureEntitiesMetadata.java create mode 100644 databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PurgeFeatureEntitiesMetadataState.java create mode 100644 databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PurgeFeatureEntitiesOperation.java create mode 100644 databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PurgeFeatureEntitiesRequest.java create mode 100644 databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PurgeFeatureEntitiesResponse.java create mode 100644 databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PurgeFeatureEntitiesResult.java create mode 100644 databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PurgeFeatureEntitiesResultState.java diff --git a/.codegen/_openapi_sha b/.codegen/_openapi_sha index 690bae93e..6c93c5434 100644 --- a/.codegen/_openapi_sha +++ b/.codegen/_openapi_sha @@ -1 +1 @@ -e6695b39732dc7caa2f6c2032053651b980a2123 \ No newline at end of file +129c9a58f8048f59e7d2829261ec88b7ec9f567f \ No newline at end of file diff --git a/.gitattributes b/.gitattributes index b3d5dc5c7..b56df0cd2 100644 --- a/.gitattributes +++ b/.gitattributes @@ -487,6 +487,7 @@ databricks-sdk-java/src/main/java/com/databricks/sdk/service/catalog/DeleteTable databricks-sdk-java/src/main/java/com/databricks/sdk/service/catalog/DeleteVolumeRequest.java linguist-generated=true databricks-sdk-java/src/main/java/com/databricks/sdk/service/catalog/DeltaRuntimePropertiesKvPairs.java linguist-generated=true databricks-sdk-java/src/main/java/com/databricks/sdk/service/catalog/DeltaSharingScopeEnum.java linguist-generated=true +databricks-sdk-java/src/main/java/com/databricks/sdk/service/catalog/DenyOptions.java linguist-generated=true databricks-sdk-java/src/main/java/com/databricks/sdk/service/catalog/Dependency.java linguist-generated=true databricks-sdk-java/src/main/java/com/databricks/sdk/service/catalog/DependencyList.java linguist-generated=true databricks-sdk-java/src/main/java/com/databricks/sdk/service/catalog/DestinationType.java linguist-generated=true @@ -2446,6 +2447,13 @@ databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PublishSpec.java databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PublishSpecPublishMode.java linguist-generated=true databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PublishTableRequest.java linguist-generated=true databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PublishTableResponse.java linguist-generated=true +databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PurgeFeatureEntitiesMetadata.java linguist-generated=true +databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PurgeFeatureEntitiesMetadataState.java linguist-generated=true +databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PurgeFeatureEntitiesOperation.java linguist-generated=true +databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PurgeFeatureEntitiesRequest.java linguist-generated=true +databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PurgeFeatureEntitiesResponse.java linguist-generated=true +databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PurgeFeatureEntitiesResult.java linguist-generated=true +databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PurgeFeatureEntitiesResultState.java linguist-generated=true databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/RegisteredModelAccessControlRequest.java linguist-generated=true databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/RegisteredModelAccessControlResponse.java linguist-generated=true databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/RegisteredModelPermission.java linguist-generated=true diff --git a/NEXT_CHANGELOG.md b/NEXT_CHANGELOG.md index 9830931de..e781320bc 100644 --- a/NEXT_CHANGELOG.md +++ b/NEXT_CHANGELOG.md @@ -15,3 +15,8 @@ ### Internal Changes ### API Changes +* Add `purgeFeatureEntities()` method for `workspaceClient.featureEngineering()` service. +* Add `deny` field for `com.databricks.sdk.service.catalog.PolicyInfo`. +* Add `budgetPolicyId` and `tags` fields for `com.databricks.sdk.service.ml.IngestionConfig`. +* Add `budgetPolicyId` and `tags` fields for `com.databricks.sdk.service.ml.MaterializedFeature`. +* Add `POLICY_TYPE_DENY` enum value for `com.databricks.sdk.service.catalog.PolicyType`. \ No newline at end of file diff --git a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/catalog/DenyOptions.java b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/catalog/DenyOptions.java new file mode 100644 index 000000000..f6c35d7f3 --- /dev/null +++ b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/catalog/DenyOptions.java @@ -0,0 +1,46 @@ +// Code generated from OpenAPI specs by Databricks SDK Generator. DO NOT EDIT. + +package com.databricks.sdk.service.catalog; + +import com.databricks.sdk.support.Generated; +import com.databricks.sdk.support.ToStringer; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.Collection; +import java.util.Objects; + +@Generated +public class DenyOptions { + /** + * List of privileges to deny. When any of these privileges are requested, the policy will deny + * access if the principal and condition match. Required on create and update. + */ + @JsonProperty("privileges") + private Collection privileges; + + public DenyOptions setPrivileges(Collection privileges) { + this.privileges = privileges; + return this; + } + + public Collection getPrivileges() { + return privileges; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + DenyOptions that = (DenyOptions) o; + return Objects.equals(privileges, that.privileges); + } + + @Override + public int hashCode() { + return Objects.hash(privileges); + } + + @Override + public String toString() { + return new ToStringer(DenyOptions.class).add("privileges", privileges).toString(); + } +} diff --git a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/catalog/PolicyInfo.java b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/catalog/PolicyInfo.java index 8c3ed3899..d2f3f04cf 100644 --- a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/catalog/PolicyInfo.java +++ b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/catalog/PolicyInfo.java @@ -30,6 +30,14 @@ public class PolicyInfo { @JsonProperty("created_by") private String createdBy; + /** + * Options for deny policies. Valid only if `policy_type` is `POLICY_TYPE_DENY`. Required on + * create and optional on update. When specified on update, the new options will replace the + * existing options as a whole. + */ + @JsonProperty("deny") + private DenyOptions deny; + /** Optional list of user or group names that should be excluded from the policy. */ @JsonProperty("except_principals") private Collection exceptPrincipals; @@ -146,6 +154,15 @@ public String getCreatedBy() { return createdBy; } + public PolicyInfo setDeny(DenyOptions deny) { + this.deny = deny; + return this; + } + + public DenyOptions getDeny() { + return deny; + } + public PolicyInfo setExceptPrincipals(Collection exceptPrincipals) { this.exceptPrincipals = exceptPrincipals; return this; @@ -281,6 +298,7 @@ public boolean equals(Object o) { && Objects.equals(comment, that.comment) && Objects.equals(createdAt, that.createdAt) && Objects.equals(createdBy, that.createdBy) + && Objects.equals(deny, that.deny) && Objects.equals(exceptPrincipals, that.exceptPrincipals) && Objects.equals(forSecurableType, that.forSecurableType) && Objects.equals(grant, that.grant) @@ -304,6 +322,7 @@ public int hashCode() { comment, createdAt, createdBy, + deny, exceptPrincipals, forSecurableType, grant, @@ -327,6 +346,7 @@ public String toString() { .add("comment", comment) .add("createdAt", createdAt) .add("createdBy", createdBy) + .add("deny", deny) .add("exceptPrincipals", exceptPrincipals) .add("forSecurableType", forSecurableType) .add("grant", grant) diff --git a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/catalog/PolicyType.java b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/catalog/PolicyType.java index 0ea9057d2..02e39b19e 100644 --- a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/catalog/PolicyType.java +++ b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/catalog/PolicyType.java @@ -7,6 +7,7 @@ @Generated public enum PolicyType { POLICY_TYPE_COLUMN_MASK, + POLICY_TYPE_DENY, POLICY_TYPE_GRANT, POLICY_TYPE_ROW_FILTER, } diff --git a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/cleanrooms/CleanRoomAsset.java b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/cleanrooms/CleanRoomAsset.java index c855faf86..c1e0073fb 100644 --- a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/cleanrooms/CleanRoomAsset.java +++ b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/cleanrooms/CleanRoomAsset.java @@ -54,7 +54,8 @@ public class CleanRoomAsset { * *shared_catalog*.*shared_schema*.*asset_name* * *

For notebooks, the name is the notebook file name. For jar analyses, the name is the jar - * analysis name. + * analysis name. For Genie spaces, the name is derived from the clean room; the caller does not + * choose it. */ @JsonProperty("name") private String name; diff --git a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/cleanrooms/UpdateCleanRoomAssetRequest.java b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/cleanrooms/UpdateCleanRoomAssetRequest.java index 57d530c52..ad85ebb9f 100644 --- a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/cleanrooms/UpdateCleanRoomAssetRequest.java +++ b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/cleanrooms/UpdateCleanRoomAssetRequest.java @@ -31,7 +31,8 @@ public class UpdateCleanRoomAssetRequest { * *shared_catalog*.*shared_schema*.*asset_name* * *

For notebooks, the name is the notebook file name. For jar analyses, the name is the jar - * analysis name. + * analysis name. For Genie spaces, the name is derived from the clean room; the caller does not + * choose it. */ @JsonIgnore private String name; diff --git a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/domains/DeleteDomainRequest.java b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/domains/DeleteDomainRequest.java index 005a004d6..92cec5a21 100644 --- a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/domains/DeleteDomainRequest.java +++ b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/domains/DeleteDomainRequest.java @@ -13,7 +13,6 @@ public class DeleteDomainRequest { /** * When false (default), DeleteDomain is rejected with FAILED_PRECONDITION if the domain still has * Glossary pages. When true, those pages are deleted first and then the domain is removed. - * Forwarded to the central service. */ @JsonIgnore @QueryParam("force") diff --git a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/FeatureEngineeringAPI.java b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/FeatureEngineeringAPI.java index b46490323..9dc6bbbe0 100644 --- a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/FeatureEngineeringAPI.java +++ b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/FeatureEngineeringAPI.java @@ -222,6 +222,12 @@ public Iterable listStreams(ListStreamsRequest request) { }); } + /** Purge materialized feature values for specified entities. */ + public PurgeFeatureEntitiesOperation purgeFeatureEntities(PurgeFeatureEntitiesRequest request) { + Operation operation = impl.purgeFeatureEntities(request); + return new PurgeFeatureEntitiesOperation(impl, operation); + } + /** Update a Feature. */ public Feature updateFeature(UpdateFeatureRequest request) { return impl.updateFeature(request); diff --git a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/FeatureEngineeringImpl.java b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/FeatureEngineeringImpl.java index ac04b09e9..6cc228e38 100644 --- a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/FeatureEngineeringImpl.java +++ b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/FeatureEngineeringImpl.java @@ -378,6 +378,27 @@ public ListStreamsResponse listStreams(ListStreamsRequest request) { } } + @Override + public Operation purgeFeatureEntities(PurgeFeatureEntitiesRequest request) { + String path = "/api/2.0/feature-engineering/features:purgeFeatureEntities"; + try { + Request req = new Request("POST", path, apiClient.serialize(request)); + + if (request.getRequestId() == null || request.getRequestId().isEmpty()) { + request.setRequestId(UUID.randomUUID().toString()); + } + ApiClient.setQuery(req, request); + req.withHeader("Accept", "application/json"); + req.withHeader("Content-Type", "application/json"); + if (apiClient.workspaceId() != null) { + req.withHeader("X-Databricks-Workspace-Id", apiClient.workspaceId()); + } + return apiClient.execute(req, Operation.class); + } catch (IOException e) { + throw new DatabricksException("IO error: " + e.getMessage(), e); + } + } + @Override public Feature updateFeature(UpdateFeatureRequest request) { String path = String.format("/api/2.0/feature-engineering/features/%s", request.getFullName()); diff --git a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/FeatureEngineeringService.java b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/FeatureEngineeringService.java index 132ee12c5..edadfa9cf 100644 --- a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/FeatureEngineeringService.java +++ b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/FeatureEngineeringService.java @@ -88,6 +88,9 @@ ListMaterializedFeaturesResponse listMaterializedFeatures( /** List Streams under a given catalog.schema parent. */ ListStreamsResponse listStreams(ListStreamsRequest listStreamsRequest); + /** Purge materialized feature values for specified entities. */ + Operation purgeFeatureEntities(PurgeFeatureEntitiesRequest purgeFeatureEntitiesRequest); + /** Update a Feature. */ Feature updateFeature(UpdateFeatureRequest updateFeatureRequest); diff --git a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/IngestionConfig.java b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/IngestionConfig.java index 0bea31b14..3575539de 100644 --- a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/IngestionConfig.java +++ b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/IngestionConfig.java @@ -6,6 +6,7 @@ import com.databricks.sdk.support.ToStringer; import com.fasterxml.jackson.annotation.JsonProperty; import java.util.Collection; +import java.util.Map; import java.util.Objects; /** @@ -31,6 +32,13 @@ public class IngestionConfig { @JsonProperty("backfill_source") private BackfillSource backfillSource; + /** + * The ID of the budget policy used to attribute the serverless compute cost of this stream's + * managed ingestion. If not specified, a default budget policy may be applied. + */ + @JsonProperty("budget_policy_id") + private String budgetPolicyId; + /** * Column paths used to identify duplicate rows during ingestion; only one row per distinct * combination of these values is kept. Use dot notation for nested fields (e.g. `value.user_id`). @@ -59,6 +67,17 @@ public class IngestionConfig { @JsonProperty("ingestion_pipeline_id") private String ingestionPipelineId; + /** + * Custom tags to associate with this stream's managed ingestion. They are applied to the + * ingestion pipeline and its forward-fill and backfill jobs, and forwarded to the underlying + * compute as cluster tags, so ingestion cost can be attributed in the billing system tables. + * These tags apply only to the managed ingestion compute; they are not applied to the Stream + * entity itself, and are distinct from any Unity Catalog tags on the Stream. A maximum of 25 tags + * is supported; keys and values are subject to the same limitations as cluster tags. + */ + @JsonProperty("tags") + private Map tags; + public IngestionConfig setBackfillJobId(Long backfillJobId) { this.backfillJobId = backfillJobId; return this; @@ -77,6 +96,15 @@ public BackfillSource getBackfillSource() { return backfillSource; } + public IngestionConfig setBudgetPolicyId(String budgetPolicyId) { + this.budgetPolicyId = budgetPolicyId; + return this; + } + + public String getBudgetPolicyId() { + return budgetPolicyId; + } + public IngestionConfig setDeduplicationColumns(Collection deduplicationColumns) { this.deduplicationColumns = deduplicationColumns; return this; @@ -113,6 +141,15 @@ public String getIngestionPipelineId() { return ingestionPipelineId; } + public IngestionConfig setTags(Map tags) { + this.tags = tags; + return this; + } + + public Map getTags() { + return tags; + } + @Override public boolean equals(Object o) { if (this == o) return true; @@ -120,10 +157,12 @@ public boolean equals(Object o) { IngestionConfig that = (IngestionConfig) o; return Objects.equals(backfillJobId, that.backfillJobId) && Objects.equals(backfillSource, that.backfillSource) + && Objects.equals(budgetPolicyId, that.budgetPolicyId) && Objects.equals(deduplicationColumns, that.deduplicationColumns) && Objects.equals(ingestionDestination, that.ingestionDestination) && Objects.equals(ingestionJobId, that.ingestionJobId) - && Objects.equals(ingestionPipelineId, that.ingestionPipelineId); + && Objects.equals(ingestionPipelineId, that.ingestionPipelineId) + && Objects.equals(tags, that.tags); } @Override @@ -131,10 +170,12 @@ public int hashCode() { return Objects.hash( backfillJobId, backfillSource, + budgetPolicyId, deduplicationColumns, ingestionDestination, ingestionJobId, - ingestionPipelineId); + ingestionPipelineId, + tags); } @Override @@ -142,10 +183,12 @@ public String toString() { return new ToStringer(IngestionConfig.class) .add("backfillJobId", backfillJobId) .add("backfillSource", backfillSource) + .add("budgetPolicyId", budgetPolicyId) .add("deduplicationColumns", deduplicationColumns) .add("ingestionDestination", ingestionDestination) .add("ingestionJobId", ingestionJobId) .add("ingestionPipelineId", ingestionPipelineId) + .add("tags", tags) .toString(); } } diff --git a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/MaterializedFeature.java b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/MaterializedFeature.java index 1cce14b03..1601311e5 100644 --- a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/MaterializedFeature.java +++ b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/MaterializedFeature.java @@ -5,11 +5,19 @@ import com.databricks.sdk.support.Generated; import com.databricks.sdk.support.ToStringer; import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.Map; import java.util.Objects; /** A materialized feature represents a feature that is continuously computed and stored. */ @Generated public class MaterializedFeature { + /** + * The ID of the budget policy used to attribute the serverless compute cost of this + * materialization. If not specified, a default budget policy may be applied. + */ + @JsonProperty("budget_policy_id") + private String budgetPolicyId; + /** */ @JsonProperty("cron_schedule") private String cronSchedule; @@ -80,6 +88,27 @@ public class MaterializedFeature { @JsonProperty("table_trigger") private TableTrigger tableTrigger; + /** + * Custom tags to associate with this materialization. They are applied to the materialization job + * (for batch features) or pipeline (for streaming features) and forwarded to the underlying + * compute as cluster tags, so materialization cost can be attributed in the billing system + * tables. These tags apply only to the materialization compute; they are not applied to the Unity + * Catalog Feature resource itself, whose tags are managed separately through the Unity Catalog + * tagging API. A maximum of 25 tags is supported; keys and values are subject to the same + * limitations as cluster tags. + */ + @JsonProperty("tags") + private Map tags; + + public MaterializedFeature setBudgetPolicyId(String budgetPolicyId) { + this.budgetPolicyId = budgetPolicyId; + return this; + } + + public String getBudgetPolicyId() { + return budgetPolicyId; + } + public MaterializedFeature setCronSchedule(String cronSchedule) { this.cronSchedule = cronSchedule; return this; @@ -198,12 +227,22 @@ public TableTrigger getTableTrigger() { return tableTrigger; } + public MaterializedFeature setTags(Map tags) { + this.tags = tags; + return this; + } + + public Map getTags() { + return tags; + } + @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; MaterializedFeature that = (MaterializedFeature) o; - return Objects.equals(cronSchedule, that.cronSchedule) + return Objects.equals(budgetPolicyId, that.budgetPolicyId) + && Objects.equals(cronSchedule, that.cronSchedule) && Objects.equals(cronScheduleTrigger, that.cronScheduleTrigger) && Objects.equals(featureName, that.featureName) && Objects.equals(isOnline, that.isOnline) @@ -215,12 +254,14 @@ public boolean equals(Object o) { && Objects.equals(pipelineScheduleState, that.pipelineScheduleState) && Objects.equals(streamingMode, that.streamingMode) && Objects.equals(tableName, that.tableName) - && Objects.equals(tableTrigger, that.tableTrigger); + && Objects.equals(tableTrigger, that.tableTrigger) + && Objects.equals(tags, that.tags); } @Override public int hashCode() { return Objects.hash( + budgetPolicyId, cronSchedule, cronScheduleTrigger, featureName, @@ -233,12 +274,14 @@ public int hashCode() { pipelineScheduleState, streamingMode, tableName, - tableTrigger); + tableTrigger, + tags); } @Override public String toString() { return new ToStringer(MaterializedFeature.class) + .add("budgetPolicyId", budgetPolicyId) .add("cronSchedule", cronSchedule) .add("cronScheduleTrigger", cronScheduleTrigger) .add("featureName", featureName) @@ -252,6 +295,7 @@ public String toString() { .add("streamingMode", streamingMode) .add("tableName", tableName) .add("tableTrigger", tableTrigger) + .add("tags", tags) .toString(); } } diff --git a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PurgeFeatureEntitiesMetadata.java b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PurgeFeatureEntitiesMetadata.java new file mode 100644 index 000000000..d92822847 --- /dev/null +++ b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PurgeFeatureEntitiesMetadata.java @@ -0,0 +1,122 @@ +// Code generated from OpenAPI specs by Databricks SDK Generator. DO NOT EDIT. + +package com.databricks.sdk.service.ml; + +import com.databricks.sdk.support.Generated; +import com.databricks.sdk.support.ToStringer; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.protobuf.Timestamp; +import java.util.Collection; +import java.util.Objects; + +/** Progress and configuration for a feature entity purge. */ +@Generated +public class PurgeFeatureEntitiesMetadata { + /** Time at which the purge operation was created. */ + @JsonProperty("create_time") + private Timestamp createTime; + + /** Fully qualified name of the Unity Catalog Delta table containing the entity keys to purge. */ + @JsonProperty("entities_table") + private String entitiesTable; + + /** Version of the entities table used by the purge. */ + @JsonProperty("entities_table_version") + private String entitiesTableVersion; + + /** Fully qualified names of the features targeted by the purge. */ + @JsonProperty("features") + private Collection features; + + /** ID of the job that executes this purge. */ + @JsonProperty("job_id") + private Long jobId; + + /** Current state of the purge operation. */ + @JsonProperty("state") + private PurgeFeatureEntitiesMetadataState state; + + public PurgeFeatureEntitiesMetadata setCreateTime(Timestamp createTime) { + this.createTime = createTime; + return this; + } + + public Timestamp getCreateTime() { + return createTime; + } + + public PurgeFeatureEntitiesMetadata setEntitiesTable(String entitiesTable) { + this.entitiesTable = entitiesTable; + return this; + } + + public String getEntitiesTable() { + return entitiesTable; + } + + public PurgeFeatureEntitiesMetadata setEntitiesTableVersion(String entitiesTableVersion) { + this.entitiesTableVersion = entitiesTableVersion; + return this; + } + + public String getEntitiesTableVersion() { + return entitiesTableVersion; + } + + public PurgeFeatureEntitiesMetadata setFeatures(Collection features) { + this.features = features; + return this; + } + + public Collection getFeatures() { + return features; + } + + public PurgeFeatureEntitiesMetadata setJobId(Long jobId) { + this.jobId = jobId; + return this; + } + + public Long getJobId() { + return jobId; + } + + public PurgeFeatureEntitiesMetadata setState(PurgeFeatureEntitiesMetadataState state) { + this.state = state; + return this; + } + + public PurgeFeatureEntitiesMetadataState getState() { + return state; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + PurgeFeatureEntitiesMetadata that = (PurgeFeatureEntitiesMetadata) o; + return Objects.equals(createTime, that.createTime) + && Objects.equals(entitiesTable, that.entitiesTable) + && Objects.equals(entitiesTableVersion, that.entitiesTableVersion) + && Objects.equals(features, that.features) + && Objects.equals(jobId, that.jobId) + && Objects.equals(state, that.state); + } + + @Override + public int hashCode() { + return Objects.hash(createTime, entitiesTable, entitiesTableVersion, features, jobId, state); + } + + @Override + public String toString() { + return new ToStringer(PurgeFeatureEntitiesMetadata.class) + .add("createTime", createTime) + .add("entitiesTable", entitiesTable) + .add("entitiesTableVersion", entitiesTableVersion) + .add("features", features) + .add("jobId", jobId) + .add("state", state) + .toString(); + } +} diff --git a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PurgeFeatureEntitiesMetadataState.java b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PurgeFeatureEntitiesMetadataState.java new file mode 100644 index 000000000..b109cac39 --- /dev/null +++ b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PurgeFeatureEntitiesMetadataState.java @@ -0,0 +1,15 @@ +// Code generated from OpenAPI specs by Databricks SDK Generator. DO NOT EDIT. + +package com.databricks.sdk.service.ml; + +import com.databricks.sdk.support.Generated; + +/** Lifecycle state of a feature entity purge. */ +@Generated +public enum PurgeFeatureEntitiesMetadataState { + CANCELLED, + FAILED, + PENDING, + RUNNING, + SUCCEEDED, +} diff --git a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PurgeFeatureEntitiesOperation.java b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PurgeFeatureEntitiesOperation.java new file mode 100644 index 000000000..dcf37b16e --- /dev/null +++ b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PurgeFeatureEntitiesOperation.java @@ -0,0 +1,163 @@ +// Code generated from OpenAPI specs by Databricks SDK Generator. DO NOT EDIT. +package com.databricks.sdk.service.ml; + +import com.databricks.sdk.core.DatabricksException; +import com.databricks.sdk.core.logging.Logger; +import com.databricks.sdk.core.logging.LoggerFactory; +import com.databricks.sdk.core.utils.SerDeUtils; +import com.databricks.sdk.service.common.lro.LroOptions; +import com.databricks.sdk.support.Generated; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.time.Duration; +import java.util.Optional; +import java.util.concurrent.TimeoutException; + +/** + * Wrapper for interacting with a long-running purgeFeatureEntities operation. Provides methods to + * wait for completion, check status, cancel, and access metadata. + */ +@Generated +public class PurgeFeatureEntitiesOperation { + private static final Logger LOG = LoggerFactory.getLogger(PurgeFeatureEntitiesOperation.class); + + private final FeatureEngineeringService impl; + private Operation operation; + private final ObjectMapper objectMapper; + + public PurgeFeatureEntitiesOperation(FeatureEngineeringService impl, Operation operation) { + this.impl = impl; + this.operation = operation; + this.objectMapper = SerDeUtils.createMapper(); + } + + /** + * Wait for the operation to complete and return the resulting PurgeFeatureEntitiesResponse. Waits + * indefinitely if no timeout is specified. + * + * @return the created PurgeFeatureEntitiesResponse + * @throws TimeoutException if the operation doesn't complete within the timeout + * @throws DatabricksException if the operation fails + */ + public PurgeFeatureEntitiesResponse waitForCompletion() throws TimeoutException { + return waitForCompletion(Optional.empty()); + } + + /** + * Wait for the operation to complete and return the resulting PurgeFeatureEntitiesResponse. + * + * @param options the options for configuring the wait behavior, can be empty for defaults + * @return the created PurgeFeatureEntitiesResponse + * @throws TimeoutException if the operation doesn't complete within the timeout + * @throws DatabricksException if the operation fails + */ + public PurgeFeatureEntitiesResponse waitForCompletion(Optional options) + throws TimeoutException { + Optional timeout = options.flatMap(LroOptions::getTimeout); + long deadline = + timeout.isPresent() + ? System.currentTimeMillis() + timeout.get().toMillis() + : Long.MAX_VALUE; + String statusMessage = "polling operation..."; + int attempt = 1; + + while (System.currentTimeMillis() < deadline) { + // Refresh the operation state + refreshOperation(); + + if (operation.getDone() != null && operation.getDone()) { + // Operation completed, check for success or failure + if (operation.getError() != null) { + String errorMsg = "unknown error"; + if (operation.getError().getMessage() != null + && !operation.getError().getMessage().isEmpty()) { + errorMsg = operation.getError().getMessage(); + } + + if (operation.getError().getErrorCode() != null) { + errorMsg = String.format("[%s] %s", operation.getError().getErrorCode(), errorMsg); + } + + throw new DatabricksException("Operation failed: " + errorMsg); + } + + // Operation completed successfully, unmarshal response + if (operation.getResponse() == null) { + throw new DatabricksException("Operation completed but no response available"); + } + + try { + JsonNode responseJson = objectMapper.valueToTree(operation.getResponse()); + return objectMapper.treeToValue(responseJson, PurgeFeatureEntitiesResponse.class); + } catch (JsonProcessingException e) { + throw new DatabricksException( + "Failed to unmarshal purgeFeatureEntitiesResponse response: " + e.getMessage(), e); + } + } + + // Operation still in progress, wait before polling again + String prefix = String.format("operation=%s", operation.getName()); + int sleep = Math.min(attempt, 10); // sleep 10s max per attempt + LOG.info("{}: operation in progress (sleeping ~{}s)", prefix, sleep); + + try { + Thread.sleep((long) (sleep * 1000L + Math.random() * 1000)); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new DatabricksException("Current thread was interrupted", e); + } + attempt++; + } + + String timeoutMessage = + timeout.isPresent() + ? String.format("Operation timed out after %s: %s", timeout.get(), statusMessage) + : String.format("Operation timed out: %s", statusMessage); + throw new TimeoutException(timeoutMessage); + } + + /** + * Get the operation name. + * + * @return the operation name + */ + public String getName() { + return operation.getName(); + } + + /** + * Get the operation metadata. + * + * @return the operation metadata, or null if not available + * @throws DatabricksException if the metadata cannot be deserialized + */ + public PurgeFeatureEntitiesMetadata getMetadata() { + if (operation.getMetadata() == null) { + return null; + } + + try { + JsonNode metadataJson = objectMapper.valueToTree(operation.getMetadata()); + return objectMapper.treeToValue(metadataJson, PurgeFeatureEntitiesMetadata.class); + } catch (JsonProcessingException e) { + throw new DatabricksException("Failed to unmarshal operation metadata: " + e.getMessage(), e); + } + } + + /** + * Check if the operation is done. This method refreshes the operation state before checking. + * + * @return true if the operation is complete, false otherwise + * @throws DatabricksException if the status check fails + */ + public boolean isDone() { + refreshOperation(); + return operation.getDone() != null && operation.getDone(); + } + + /** Refresh the operation state by polling the server. */ + private void refreshOperation() { + operation = impl.getOperation(new GetOperationRequest().setName(operation.getName())); + } +} diff --git a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PurgeFeatureEntitiesRequest.java b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PurgeFeatureEntitiesRequest.java new file mode 100644 index 000000000..d31fc7668 --- /dev/null +++ b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PurgeFeatureEntitiesRequest.java @@ -0,0 +1,87 @@ +// Code generated from OpenAPI specs by Databricks SDK Generator. DO NOT EDIT. + +package com.databricks.sdk.service.ml; + +import com.databricks.sdk.support.Generated; +import com.databricks.sdk.support.ToStringer; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.Collection; +import java.util.Objects; + +/** + * Request to purge materialized feature values for entities listed in a Unity Catalog Delta table. + */ +@Generated +public class PurgeFeatureEntitiesRequest { + /** + * Fully qualified name of the Unity Catalog Delta table containing the entity keys to purge. The + * table may contain a subset of each feature's entity-key columns. A partial key match deletes + * all feature rows matching the provided key values. Non-key columns are rejected; null key + * values are allowed. + */ + @JsonProperty("entities_table") + private String entitiesTable; + + /** + * Fully qualified names of the features to purge. At least one nonempty feature name is required. + * A request may contain at most 10000 features; submit additional features in separate requests. + * Duplicate features are rejected. + */ + @JsonProperty("features") + private Collection features; + + /** Optional UUID4 idempotency token for the request. */ + @JsonProperty("request_id") + private String requestId; + + public PurgeFeatureEntitiesRequest setEntitiesTable(String entitiesTable) { + this.entitiesTable = entitiesTable; + return this; + } + + public String getEntitiesTable() { + return entitiesTable; + } + + public PurgeFeatureEntitiesRequest setFeatures(Collection features) { + this.features = features; + return this; + } + + public Collection getFeatures() { + return features; + } + + public PurgeFeatureEntitiesRequest setRequestId(String requestId) { + this.requestId = requestId; + return this; + } + + public String getRequestId() { + return requestId; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + PurgeFeatureEntitiesRequest that = (PurgeFeatureEntitiesRequest) o; + return Objects.equals(entitiesTable, that.entitiesTable) + && Objects.equals(features, that.features) + && Objects.equals(requestId, that.requestId); + } + + @Override + public int hashCode() { + return Objects.hash(entitiesTable, features, requestId); + } + + @Override + public String toString() { + return new ToStringer(PurgeFeatureEntitiesRequest.class) + .add("entitiesTable", entitiesTable) + .add("features", features) + .add("requestId", requestId) + .toString(); + } +} diff --git a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PurgeFeatureEntitiesResponse.java b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PurgeFeatureEntitiesResponse.java new file mode 100644 index 000000000..23bd0614c --- /dev/null +++ b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PurgeFeatureEntitiesResponse.java @@ -0,0 +1,76 @@ +// Code generated from OpenAPI specs by Databricks SDK Generator. DO NOT EDIT. + +package com.databricks.sdk.service.ml; + +import com.databricks.sdk.support.Generated; +import com.databricks.sdk.support.ToStringer; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.Collection; +import java.util.Objects; + +/** Result of a completed feature entity purge. */ +@Generated +public class PurgeFeatureEntitiesResponse { + /** Metadata about the purge operation. */ + @JsonProperty("metadata") + private PurgeFeatureEntitiesMetadata metadata; + + /** Per-feature purge results. */ + @JsonProperty("results") + private Collection results; + + /** State of the purge operation. */ + @JsonProperty("state") + private PurgeFeatureEntitiesMetadataState state; + + public PurgeFeatureEntitiesResponse setMetadata(PurgeFeatureEntitiesMetadata metadata) { + this.metadata = metadata; + return this; + } + + public PurgeFeatureEntitiesMetadata getMetadata() { + return metadata; + } + + public PurgeFeatureEntitiesResponse setResults(Collection results) { + this.results = results; + return this; + } + + public Collection getResults() { + return results; + } + + public PurgeFeatureEntitiesResponse setState(PurgeFeatureEntitiesMetadataState state) { + this.state = state; + return this; + } + + public PurgeFeatureEntitiesMetadataState getState() { + return state; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + PurgeFeatureEntitiesResponse that = (PurgeFeatureEntitiesResponse) o; + return Objects.equals(metadata, that.metadata) + && Objects.equals(results, that.results) + && Objects.equals(state, that.state); + } + + @Override + public int hashCode() { + return Objects.hash(metadata, results, state); + } + + @Override + public String toString() { + return new ToStringer(PurgeFeatureEntitiesResponse.class) + .add("metadata", metadata) + .add("results", results) + .add("state", state) + .toString(); + } +} diff --git a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PurgeFeatureEntitiesResult.java b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PurgeFeatureEntitiesResult.java new file mode 100644 index 000000000..640668106 --- /dev/null +++ b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PurgeFeatureEntitiesResult.java @@ -0,0 +1,90 @@ +// Code generated from OpenAPI specs by Databricks SDK Generator. DO NOT EDIT. + +package com.databricks.sdk.service.ml; + +import com.databricks.sdk.support.Generated; +import com.databricks.sdk.support.ToStringer; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.Objects; + +/** Result of purging one feature. */ +@Generated +public class PurgeFeatureEntitiesResult { + /** Error encountered while purging this feature, if any. */ + @JsonProperty("error") + private DatabricksServiceExceptionWithDetailsProto error; + + /** Fully qualified name of the feature that was purged. */ + @JsonProperty("feature") + private String feature; + + /** State of the offline purge for this feature. */ + @JsonProperty("offline_state") + private PurgeFeatureEntitiesResultState offlineState; + + /** State of the online purge for this feature. */ + @JsonProperty("online_state") + private PurgeFeatureEntitiesResultState onlineState; + + public PurgeFeatureEntitiesResult setError(DatabricksServiceExceptionWithDetailsProto error) { + this.error = error; + return this; + } + + public DatabricksServiceExceptionWithDetailsProto getError() { + return error; + } + + public PurgeFeatureEntitiesResult setFeature(String feature) { + this.feature = feature; + return this; + } + + public String getFeature() { + return feature; + } + + public PurgeFeatureEntitiesResult setOfflineState(PurgeFeatureEntitiesResultState offlineState) { + this.offlineState = offlineState; + return this; + } + + public PurgeFeatureEntitiesResultState getOfflineState() { + return offlineState; + } + + public PurgeFeatureEntitiesResult setOnlineState(PurgeFeatureEntitiesResultState onlineState) { + this.onlineState = onlineState; + return this; + } + + public PurgeFeatureEntitiesResultState getOnlineState() { + return onlineState; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + PurgeFeatureEntitiesResult that = (PurgeFeatureEntitiesResult) o; + return Objects.equals(error, that.error) + && Objects.equals(feature, that.feature) + && Objects.equals(offlineState, that.offlineState) + && Objects.equals(onlineState, that.onlineState); + } + + @Override + public int hashCode() { + return Objects.hash(error, feature, offlineState, onlineState); + } + + @Override + public String toString() { + return new ToStringer(PurgeFeatureEntitiesResult.class) + .add("error", error) + .add("feature", feature) + .add("offlineState", offlineState) + .add("onlineState", onlineState) + .toString(); + } +} diff --git a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PurgeFeatureEntitiesResultState.java b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PurgeFeatureEntitiesResultState.java new file mode 100644 index 000000000..d1dd554cd --- /dev/null +++ b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/ml/PurgeFeatureEntitiesResultState.java @@ -0,0 +1,13 @@ +// Code generated from OpenAPI specs by Databricks SDK Generator. DO NOT EDIT. + +package com.databricks.sdk.service.ml; + +import com.databricks.sdk.support.Generated; + +/** Terminal state of a purge for one store type. */ +@Generated +public enum PurgeFeatureEntitiesResultState { + FAILED, + NOT_APPLICABLE, + SUCCEEDED, +} diff --git a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/pipelines/ListPipelinesRequest.java b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/pipelines/ListPipelinesRequest.java index d144bcd02..9657dffeb 100644 --- a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/pipelines/ListPipelinesRequest.java +++ b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/pipelines/ListPipelinesRequest.java @@ -26,7 +26,7 @@ public class ListPipelinesRequest { /** * The maximum number of entries to return in a single page. The system may return fewer than - * max_results events in a response, even if there are more events available. This field is + * max_results pipelines in a response, even if there are more pipelines available. This field is * optional. The default value is 25. The maximum value is 100. An error is returned if the value * of max_results is greater than 100. */ diff --git a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/pipelines/ListPipelinesResponse.java b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/pipelines/ListPipelinesResponse.java index 8fe88295f..7fff053e0 100644 --- a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/pipelines/ListPipelinesResponse.java +++ b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/pipelines/ListPipelinesResponse.java @@ -10,11 +10,11 @@ @Generated public class ListPipelinesResponse { - /** If present, a token to fetch the next page of events. */ + /** If present, a token to fetch the next page of pipelines. */ @JsonProperty("next_page_token") private String nextPageToken; - /** The list of events matching the request criteria. */ + /** The list of pipelines matching the request criteria. */ @JsonProperty("statuses") private Collection statuses; diff --git a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/pipelines/PipelinesAPI.java b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/pipelines/PipelinesAPI.java index e8871d17c..ade245a37 100644 --- a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/pipelines/PipelinesAPI.java +++ b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/pipelines/PipelinesAPI.java @@ -90,8 +90,8 @@ public GetPipelineResponse waitGetPipelineIdle( } /** - * * Applies the current pipeline environment onto the pipeline compute. The environment applied - * can be used by subsequent dev-mode updates. + * Applies the current pipeline environment onto the pipeline compute. The environment applied can + * be used by subsequent dev-mode updates. */ public ApplyEnvironmentRequestResponse applyEnvironment(ApplyEnvironmentRequest request) { return impl.applyEnvironment(request); diff --git a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/pipelines/PipelinesService.java b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/pipelines/PipelinesService.java index f9ef025f5..4b7ec4a61 100644 --- a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/pipelines/PipelinesService.java +++ b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/pipelines/PipelinesService.java @@ -25,8 +25,8 @@ @Generated public interface PipelinesService { /** - * * Applies the current pipeline environment onto the pipeline compute. The environment applied - * can be used by subsequent dev-mode updates. + * Applies the current pipeline environment onto the pipeline compute. The environment applied can + * be used by subsequent dev-mode updates. */ ApplyEnvironmentRequestResponse applyEnvironment(ApplyEnvironmentRequest applyEnvironmentRequest); diff --git a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/postgres/BranchSpec.java b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/postgres/BranchSpec.java index accfa38ba..54cafee88 100644 --- a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/postgres/BranchSpec.java +++ b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/postgres/BranchSpec.java @@ -13,7 +13,7 @@ public class BranchSpec { /** * Absolute expiration timestamp. When set, the branch will expire at this time. Mutually - * exclusive with `ttl` and `no_expiry`. When updating, use `spec.expiration` in the update_mask. + * exclusive with `ttl` and `no_expiry`. */ @JsonProperty("expire_time") private Timestamp expireTime; @@ -28,7 +28,7 @@ public class BranchSpec { /** * Explicitly disable expiration. When set to true, the branch will not expire. If set to false, * the request is invalid; provide either ttl or expire_time instead. Mutually exclusive with - * `expire_time` and `ttl`. When updating, use `spec.expiration` in the update_mask. + * `expire_time` and `ttl`. */ @JsonProperty("no_expiry") private Boolean noExpiry; @@ -60,8 +60,7 @@ public class BranchSpec { /** * Relative time-to-live duration. When set, the branch will expire at creation_time + ttl. - * Mutually exclusive with `expire_time` and `no_expiry`. When updating, use `spec.expiration` in - * the update_mask. + * Mutually exclusive with `expire_time` and `no_expiry`. */ @JsonProperty("ttl") private Duration ttl; diff --git a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/postgres/EndpointSpec.java b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/postgres/EndpointSpec.java index 259f344bc..d97f7f699 100644 --- a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/postgres/EndpointSpec.java +++ b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/postgres/EndpointSpec.java @@ -43,8 +43,7 @@ public class EndpointSpec { /** * When set to true, explicitly disables automatic suspension (never suspend). Should be set to - * true when provided. Mutually exclusive with `suspend_timeout_duration`. When updating, use - * `spec.suspension` in the update_mask. + * true when provided. Mutually exclusive with `suspend_timeout_duration`. */ @JsonProperty("no_suspension") private Boolean noSuspension; @@ -56,7 +55,7 @@ public class EndpointSpec { /** * Duration of inactivity after which the compute endpoint is automatically suspended. If * specified should be between 60s and 604800s (1 minute to 1 week). Mutually exclusive with - * `no_suspension`. When updating, use `spec.suspension` in the update_mask. + * `no_suspension`. */ @JsonProperty("suspend_timeout_duration") private Duration suspendTimeoutDuration; diff --git a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/postgres/ProjectDefaultEndpointSettings.java b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/postgres/ProjectDefaultEndpointSettings.java index d7d1f5f0d..c14cd9c9d 100644 --- a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/postgres/ProjectDefaultEndpointSettings.java +++ b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/postgres/ProjectDefaultEndpointSettings.java @@ -22,8 +22,7 @@ public class ProjectDefaultEndpointSettings { /** * When set to true, explicitly disables automatic suspension (never suspend). Should be set to - * true when provided. Mutually exclusive with `suspend_timeout_duration`. When updating, use - * `spec.project_default_settings.suspension` in the update_mask. + * true when provided. Mutually exclusive with `suspend_timeout_duration`. */ @JsonProperty("no_suspension") private Boolean noSuspension; @@ -35,8 +34,7 @@ public class ProjectDefaultEndpointSettings { /** * Duration of inactivity after which the compute endpoint is automatically suspended. If * specified should be between 60s and 604800s (1 minute to 1 week). Mutually exclusive with - * `no_suspension`. When updating, use `spec.project_default_settings.suspension` in the - * update_mask. + * `no_suspension`. */ @JsonProperty("suspend_timeout_duration") private Duration suspendTimeoutDuration; diff --git a/tagging.py b/tagging.py index e887a7144..46f0fdae3 100644 --- a/tagging.py +++ b/tagging.py @@ -650,9 +650,13 @@ def get_next_tag_info_from_nextchanges(package: Package) -> Optional[TagInfo]: ``.codegen.json`` — matching the ``NEXT_CHANGELOG.md`` skip behavior. """ body = render_nextchanges(package.path) - if body is None and not _load_codegen_config(package.path).get("allow_empty_changelog", False): - print(f"No {_nextchanges_dir()}/ entries. No changes will be made to the changelog.") - return None + if body is None: + if not _load_codegen_config(package.path).get("allow_empty_changelog", False): + print(f"No {_nextchanges_dir()}/ entries. No changes will be made to the changelog.") + return None + if not _source_changed_since_last_release(package): + print(f"No {_nextchanges_dir()}/ entries and no source changes since the last release; skipping.") + return None version = read_nextchanges_version(package) # write_changelog() keys off the "## Release v…" header, so include it. @@ -710,12 +714,15 @@ def get_next_tag_info(package: Package) -> Optional[TagInfo]: # By default, packages whose NEXT_CHANGELOG.md has no populated # sections are skipped — there's nothing meaningful to release. # Repos like sdk-js which are still in development can opt in - # by setting ``allow_empty_changelog: true`` in .codegen.json. - if not re.search(r"###", next_changelog) and not _load_codegen_config(package.path).get( - "allow_empty_changelog", False - ): - print("All sections are empty. No changes will be made to the changelog.") - return None + # by setting ``allow_empty_changelog: true`` in .codegen.json — but + # even then, only when the package's source actually changed. + if not re.search(r"###", next_changelog): + if not _load_codegen_config(package.path).get("allow_empty_changelog", False): + print("All sections are empty. No changes will be made to the changelog.") + return None + if not _source_changed_since_last_release(package): + print("All sections are empty and no source changes since the last release; skipping.") + return None version_match = re.search(rf"## Release v({Version.PATTERN})", next_changelog) @@ -832,9 +839,10 @@ def find_last_release_tag(package: Package) -> Optional[str]: def has_commits_since_tag(tag: str, path: str) -> bool: """ Returns True iff at least one commit reachable from HEAD but not from - ``tag`` touches ``path``. Used to detect that a sibling dependency has - unreleased changes that would ship stale if we tagged a dependent - without re-tagging the dependency. + ``tag`` touches ``path``. Detects both that a sibling dependency has + unreleased changes that would ship stale (freshness) and, via + ``_source_changed_since_last_release``, whether a package has anything to + release under allow_empty_changelog. :raises Exception: If the git command fails. """ @@ -846,6 +854,25 @@ def has_commits_since_tag(tag: str, path: str) -> bool: return bool(output) +def _source_changed_since_last_release(package: Package) -> bool: + """ + True when the package has any commits since its last release tag. A + never-released package (no tag) counts as changed. Gates the + ``allow_empty_changelog`` path so a package with no changelog entries + releases only when something actually changed since it was last released. + + Uses the same commit-based check as ``check_dependency_freshness`` — a + package's release bookkeeping is committed *at* its release tag, not after + it, so it never falls in the ``tag..HEAD`` window. Sharing the check keeps + the two consistent: a package this skips is exactly one freshness will not + flag as stale. + """ + tag = find_last_release_tag(package) + if tag is None: + return True + return has_commits_since_tag(tag, package.path) + + def check_dependency_freshness(tag_infos: List[TagInfo], all_packages: List[Package]) -> None: """ Hard-fails when a package being released depends on a sibling package