diff --git a/.codegen/_openapi_sha b/.codegen/_openapi_sha
index 85a78ec8f..2e1b26236 100755
--- a/.codegen/_openapi_sha
+++ b/.codegen/_openapi_sha
@@ -1 +1 @@
-2e4155a57cb6c406a47d42fdc8264795fe7d7e1b
\ No newline at end of file
+d7ea36916592a39c3b731ed7717884b2ffe15ebe
\ No newline at end of file
diff --git a/.gitattributes b/.gitattributes
index d1e1623ac..2a7d04a47 100755
--- a/.gitattributes
+++ b/.gitattributes
@@ -1178,6 +1178,30 @@ databricks-sdk-java/src/main/java/com/databricks/sdk/service/dataquality/Snapsho
databricks-sdk-java/src/main/java/com/databricks/sdk/service/dataquality/TimeSeriesConfig.java linguist-generated=true
databricks-sdk-java/src/main/java/com/databricks/sdk/service/dataquality/UpdateMonitorRequest.java linguist-generated=true
databricks-sdk-java/src/main/java/com/databricks/sdk/service/dataquality/UpdateRefreshRequest.java linguist-generated=true
+databricks-sdk-java/src/main/java/com/databricks/sdk/service/environments/BaseEnvironmentType.java linguist-generated=true
+databricks-sdk-java/src/main/java/com/databricks/sdk/service/environments/CreateWorkspaceBaseEnvironmentOperation.java linguist-generated=true
+databricks-sdk-java/src/main/java/com/databricks/sdk/service/environments/CreateWorkspaceBaseEnvironmentRequest.java linguist-generated=true
+databricks-sdk-java/src/main/java/com/databricks/sdk/service/environments/DatabricksServiceExceptionWithDetailsProto.java linguist-generated=true
+databricks-sdk-java/src/main/java/com/databricks/sdk/service/environments/DefaultWorkspaceBaseEnvironment.java linguist-generated=true
+databricks-sdk-java/src/main/java/com/databricks/sdk/service/environments/DeleteWorkspaceBaseEnvironmentRequest.java linguist-generated=true
+databricks-sdk-java/src/main/java/com/databricks/sdk/service/environments/EnvironmentsAPI.java linguist-generated=true
+databricks-sdk-java/src/main/java/com/databricks/sdk/service/environments/EnvironmentsImpl.java linguist-generated=true
+databricks-sdk-java/src/main/java/com/databricks/sdk/service/environments/EnvironmentsService.java linguist-generated=true
+databricks-sdk-java/src/main/java/com/databricks/sdk/service/environments/ErrorCode.java linguist-generated=true
+databricks-sdk-java/src/main/java/com/databricks/sdk/service/environments/GetDefaultWorkspaceBaseEnvironmentRequest.java linguist-generated=true
+databricks-sdk-java/src/main/java/com/databricks/sdk/service/environments/GetOperationRequest.java linguist-generated=true
+databricks-sdk-java/src/main/java/com/databricks/sdk/service/environments/GetWorkspaceBaseEnvironmentRequest.java linguist-generated=true
+databricks-sdk-java/src/main/java/com/databricks/sdk/service/environments/ListWorkspaceBaseEnvironmentsRequest.java linguist-generated=true
+databricks-sdk-java/src/main/java/com/databricks/sdk/service/environments/ListWorkspaceBaseEnvironmentsResponse.java linguist-generated=true
+databricks-sdk-java/src/main/java/com/databricks/sdk/service/environments/Operation.java linguist-generated=true
+databricks-sdk-java/src/main/java/com/databricks/sdk/service/environments/RefreshWorkspaceBaseEnvironmentOperation.java linguist-generated=true
+databricks-sdk-java/src/main/java/com/databricks/sdk/service/environments/RefreshWorkspaceBaseEnvironmentRequest.java linguist-generated=true
+databricks-sdk-java/src/main/java/com/databricks/sdk/service/environments/UpdateDefaultWorkspaceBaseEnvironmentRequest.java linguist-generated=true
+databricks-sdk-java/src/main/java/com/databricks/sdk/service/environments/UpdateWorkspaceBaseEnvironmentOperation.java linguist-generated=true
+databricks-sdk-java/src/main/java/com/databricks/sdk/service/environments/UpdateWorkspaceBaseEnvironmentRequest.java linguist-generated=true
+databricks-sdk-java/src/main/java/com/databricks/sdk/service/environments/WorkspaceBaseEnvironment.java linguist-generated=true
+databricks-sdk-java/src/main/java/com/databricks/sdk/service/environments/WorkspaceBaseEnvironmentCacheStatus.java linguist-generated=true
+databricks-sdk-java/src/main/java/com/databricks/sdk/service/environments/WorkspaceBaseEnvironmentOperationMetadata.java linguist-generated=true
databricks-sdk-java/src/main/java/com/databricks/sdk/service/files/AddBlock.java linguist-generated=true
databricks-sdk-java/src/main/java/com/databricks/sdk/service/files/Close.java linguist-generated=true
databricks-sdk-java/src/main/java/com/databricks/sdk/service/files/Create.java linguist-generated=true
diff --git a/NEXT_CHANGELOG.md b/NEXT_CHANGELOG.md
index 0eab3a65f..e4c5aab08 100755
--- a/NEXT_CHANGELOG.md
+++ b/NEXT_CHANGELOG.md
@@ -16,4 +16,6 @@
* Add `alertOutput` field for `com.databricks.sdk.service.jobs.RunOutput`.
* Add `alertTask` field for `com.databricks.sdk.service.jobs.RunTask`.
* Add `alertTask` field for `com.databricks.sdk.service.jobs.SubmitTask`.
-* Add `alertTask` field for `com.databricks.sdk.service.jobs.Task`.
\ No newline at end of file
+* Add `alertTask` field for `com.databricks.sdk.service.jobs.Task`.
+* Add `com.databricks.sdk.service.environments` package.
+* Add `workspaceClient.environments()` service.
\ No newline at end of file
diff --git a/databricks-sdk-java/src/main/java/com/databricks/sdk/WorkspaceClient.java b/databricks-sdk-java/src/main/java/com/databricks/sdk/WorkspaceClient.java
index fae5f8e85..1ff744a47 100755
--- a/databricks-sdk-java/src/main/java/com/databricks/sdk/WorkspaceClient.java
+++ b/databricks-sdk-java/src/main/java/com/databricks/sdk/WorkspaceClient.java
@@ -107,6 +107,8 @@
import com.databricks.sdk.service.dataclassification.DataClassificationService;
import com.databricks.sdk.service.dataquality.DataQualityAPI;
import com.databricks.sdk.service.dataquality.DataQualityService;
+import com.databricks.sdk.service.environments.EnvironmentsAPI;
+import com.databricks.sdk.service.environments.EnvironmentsService;
import com.databricks.sdk.service.files.DbfsService;
import com.databricks.sdk.service.files.FilesAPI;
import com.databricks.sdk.service.files.FilesService;
@@ -303,6 +305,7 @@ public class WorkspaceClient {
private DbfsExt dbfsAPI;
private DbsqlPermissionsAPI dbsqlPermissionsAPI;
private EntityTagAssignmentsAPI entityTagAssignmentsAPI;
+ private EnvironmentsAPI environmentsAPI;
private ExperimentsAPI experimentsAPI;
private ExternalLineageAPI externalLineageAPI;
private ExternalLocationsAPI externalLocationsAPI;
@@ -438,6 +441,7 @@ public WorkspaceClient(DatabricksConfig config) {
dbfsAPI = new DbfsExt(apiClient);
dbsqlPermissionsAPI = new DbsqlPermissionsAPI(apiClient);
entityTagAssignmentsAPI = new EntityTagAssignmentsAPI(apiClient);
+ environmentsAPI = new EnvironmentsAPI(apiClient);
experimentsAPI = new ExperimentsAPI(apiClient);
externalLineageAPI = new ExternalLineageAPI(apiClient);
externalLocationsAPI = new ExternalLocationsAPI(apiClient);
@@ -905,6 +909,17 @@ public EntityTagAssignmentsAPI entityTagAssignments() {
return entityTagAssignmentsAPI;
}
+ /**
+ * APIs to manage environment resources.
+ *
+ *
The Environments API provides management capabilities for different types of environments
+ * including workspace-level base environments that define the environment version and
+ * dependencies to be used in serverless notebooks and jobs.
+ */
+ public EnvironmentsAPI environments() {
+ return environmentsAPI;
+ }
+
/**
* Experiments are the primary unit of organization in MLflow; all MLflow runs belong to an
* experiment. Each experiment lets you visualize, search, and compare runs, as well as download
@@ -2563,6 +2578,17 @@ public WorkspaceClient withEntityTagAssignmentsAPI(EntityTagAssignmentsAPI entit
return this;
}
+ /** Replace the default EnvironmentsService with a custom implementation. */
+ public WorkspaceClient withEnvironmentsImpl(EnvironmentsService environments) {
+ return this.withEnvironmentsAPI(new EnvironmentsAPI(environments));
+ }
+
+ /** Replace the default EnvironmentsAPI with a custom implementation. */
+ public WorkspaceClient withEnvironmentsAPI(EnvironmentsAPI environments) {
+ this.environmentsAPI = environments;
+ return this;
+ }
+
/** Replace the default ExperimentsService with a custom implementation. */
public WorkspaceClient withExperimentsImpl(ExperimentsService experiments) {
return this.withExperimentsAPI(new ExperimentsAPI(experiments));
diff --git a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/environments/BaseEnvironmentType.java b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/environments/BaseEnvironmentType.java
new file mode 100755
index 000000000..a2dc3e06a
--- /dev/null
+++ b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/environments/BaseEnvironmentType.java
@@ -0,0 +1,12 @@
+// Code generated from OpenAPI specs by Databricks SDK Generator. DO NOT EDIT.
+
+package com.databricks.sdk.service.environments;
+
+import com.databricks.sdk.support.Generated;
+
+/** If changed, also update estore/namespaces/defaultbaseenvironments/latest.proto */
+@Generated
+public enum BaseEnvironmentType {
+ CPU,
+ GPU,
+}
diff --git a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/environments/CreateWorkspaceBaseEnvironmentOperation.java b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/environments/CreateWorkspaceBaseEnvironmentOperation.java
new file mode 100755
index 000000000..7a164ba04
--- /dev/null
+++ b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/environments/CreateWorkspaceBaseEnvironmentOperation.java
@@ -0,0 +1,165 @@
+// Code generated from OpenAPI specs by Databricks SDK Generator. DO NOT EDIT.
+package com.databricks.sdk.service.environments;
+
+import com.databricks.sdk.core.DatabricksException;
+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;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Wrapper for interacting with a long-running createWorkspaceBaseEnvironment operation. Provides
+ * methods to wait for completion, check status, cancel, and access metadata.
+ */
+@Generated
+public class CreateWorkspaceBaseEnvironmentOperation {
+ private static final Logger LOG =
+ LoggerFactory.getLogger(CreateWorkspaceBaseEnvironmentOperation.class);
+
+ private final EnvironmentsService impl;
+ private Operation operation;
+ private final ObjectMapper objectMapper;
+
+ public CreateWorkspaceBaseEnvironmentOperation(EnvironmentsService impl, Operation operation) {
+ this.impl = impl;
+ this.operation = operation;
+ this.objectMapper = SerDeUtils.createMapper();
+ }
+
+ /**
+ * Wait for the operation to complete and return the resulting WorkspaceBaseEnvironment. Waits
+ * indefinitely if no timeout is specified.
+ *
+ * @return the created WorkspaceBaseEnvironment
+ * @throws TimeoutException if the operation doesn't complete within the timeout
+ * @throws DatabricksException if the operation fails
+ */
+ public WorkspaceBaseEnvironment waitForCompletion() throws TimeoutException {
+ return waitForCompletion(Optional.empty());
+ }
+
+ /**
+ * Wait for the operation to complete and return the resulting WorkspaceBaseEnvironment.
+ *
+ * @param options the options for configuring the wait behavior, can be empty for defaults
+ * @return the created WorkspaceBaseEnvironment
+ * @throws TimeoutException if the operation doesn't complete within the timeout
+ * @throws DatabricksException if the operation fails
+ */
+ public WorkspaceBaseEnvironment 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, WorkspaceBaseEnvironment.class);
+ } catch (JsonProcessingException e) {
+ throw new DatabricksException(
+ "Failed to unmarshal workspaceBaseEnvironment 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 WorkspaceBaseEnvironmentOperationMetadata getMetadata() {
+ if (operation.getMetadata() == null) {
+ return null;
+ }
+
+ try {
+ JsonNode metadataJson = objectMapper.valueToTree(operation.getMetadata());
+ return objectMapper.treeToValue(
+ metadataJson, WorkspaceBaseEnvironmentOperationMetadata.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/environments/CreateWorkspaceBaseEnvironmentRequest.java b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/environments/CreateWorkspaceBaseEnvironmentRequest.java
new file mode 100755
index 000000000..fa5de1d9b
--- /dev/null
+++ b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/environments/CreateWorkspaceBaseEnvironmentRequest.java
@@ -0,0 +1,86 @@
+// Code generated from OpenAPI specs by Databricks SDK Generator. DO NOT EDIT.
+
+package com.databricks.sdk.service.environments;
+
+import com.databricks.sdk.support.Generated;
+import com.databricks.sdk.support.QueryParam;
+import com.databricks.sdk.support.ToStringer;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import java.util.Objects;
+
+@Generated
+public class CreateWorkspaceBaseEnvironmentRequest {
+ /**
+ * A unique identifier for this request. A random UUID is recommended. This request is only
+ * idempotent if a request_id is provided.
+ */
+ @JsonIgnore
+ @QueryParam("request_id")
+ private String requestId;
+
+ /** Required. The workspace base environment to create. */
+ @JsonProperty("workspace_base_environment")
+ private WorkspaceBaseEnvironment workspaceBaseEnvironment;
+
+ /**
+ * The ID to use for the workspace base environment, which will become the final component of the
+ * resource name. This value should be 4-63 characters, and valid characters are /[a-z][0-9]-/.
+ */
+ @JsonIgnore
+ @QueryParam("workspace_base_environment_id")
+ private String workspaceBaseEnvironmentId;
+
+ public CreateWorkspaceBaseEnvironmentRequest setRequestId(String requestId) {
+ this.requestId = requestId;
+ return this;
+ }
+
+ public String getRequestId() {
+ return requestId;
+ }
+
+ public CreateWorkspaceBaseEnvironmentRequest setWorkspaceBaseEnvironment(
+ WorkspaceBaseEnvironment workspaceBaseEnvironment) {
+ this.workspaceBaseEnvironment = workspaceBaseEnvironment;
+ return this;
+ }
+
+ public WorkspaceBaseEnvironment getWorkspaceBaseEnvironment() {
+ return workspaceBaseEnvironment;
+ }
+
+ public CreateWorkspaceBaseEnvironmentRequest setWorkspaceBaseEnvironmentId(
+ String workspaceBaseEnvironmentId) {
+ this.workspaceBaseEnvironmentId = workspaceBaseEnvironmentId;
+ return this;
+ }
+
+ public String getWorkspaceBaseEnvironmentId() {
+ return workspaceBaseEnvironmentId;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ CreateWorkspaceBaseEnvironmentRequest that = (CreateWorkspaceBaseEnvironmentRequest) o;
+ return Objects.equals(requestId, that.requestId)
+ && Objects.equals(workspaceBaseEnvironment, that.workspaceBaseEnvironment)
+ && Objects.equals(workspaceBaseEnvironmentId, that.workspaceBaseEnvironmentId);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(requestId, workspaceBaseEnvironment, workspaceBaseEnvironmentId);
+ }
+
+ @Override
+ public String toString() {
+ return new ToStringer(CreateWorkspaceBaseEnvironmentRequest.class)
+ .add("requestId", requestId)
+ .add("workspaceBaseEnvironment", workspaceBaseEnvironment)
+ .add("workspaceBaseEnvironmentId", workspaceBaseEnvironmentId)
+ .toString();
+ }
+}
diff --git a/databricks-sdk-java/src/main/java/com/databricks/sdk/service/environments/DatabricksServiceExceptionWithDetailsProto.java b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/environments/DatabricksServiceExceptionWithDetailsProto.java
new file mode 100755
index 000000000..b7e259c6e
--- /dev/null
+++ b/databricks-sdk-java/src/main/java/com/databricks/sdk/service/environments/DatabricksServiceExceptionWithDetailsProto.java
@@ -0,0 +1,92 @@
+// Code generated from OpenAPI specs by Databricks SDK Generator. DO NOT EDIT.
+
+package com.databricks.sdk.service.environments;
+
+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;
+
+/** Databricks Error that is returned by all Databricks APIs. */
+@Generated
+public class DatabricksServiceExceptionWithDetailsProto {
+ /** */
+ @JsonProperty("details")
+ private Collection