Environments¶
Fabric Environments define the Spark runtime, system libraries, and custom packages for notebooks and jobs. The Environment API provides management of environments and their associated libraries.
Getting an Environment¶
import fabias
ws = fabias.workspace("Analytics")
# By name
env = ws.environment("ML Environment")
# By GUID
env = ws.environment("a1b2c3d4-...")
Listing Environments¶
ws = fabias.workspace("Analytics")
# List all environments
for env in ws.environments():
print(f"{env.name}: {env.id}")
Creating Environments¶
ws = fabias.workspace("Analytics")
# Create a new environment
env = ws.environments.add("Data Science")
# Create with description and folder
env = ws.environments.add(
"Data Science",
description="Python environment for data science workloads",
folder_id="folder-guid"
)
Environment Properties¶
env = ws.environment("ML Environment")
# Refresh to get latest state
env.refresh()
print(f"ID: {env.id}")
print(f"Name: {env.name}")
print(f"State: {env.state}")
print(f"Is Publishing: {env.isPublishing}")
Publish States¶
The state property can have these values:
| State | Description |
|---|---|
Running |
Currently publishing |
Waiting |
Queued for publishing |
Cancelling |
Cancellation in progress |
Success |
Published successfully |
Failed |
Publishing failed |
Managing Libraries¶
Environments support custom Python, R, and Java libraries via the libraries property:
List Libraries¶
env = ws.environment("ML Environment")
libs = env.libraries
# Refresh library data
libs.refresh()
# View staging libraries (pending publish)
print("Staging Libraries:")
for lib in libs.staging["libraries"]:
print(f" - {lib}")
# View published libraries (currently active)
print("\nPublished Libraries:")
for lib in libs.published["libraries"]:
print(f" - {lib}")
Upload Libraries¶
Supports .whl (Python wheel), .py (Python script), .jar (Java), and .tar.gz (R) files:
env = ws.environment("ML Environment")
libs = env.libraries
# Upload a wheel file
libs.upload("/path/to/my_package-1.0.0-py3-none-any.whl")
# Upload a Python script
libs.upload("/path/to/helpers.py")
# Upload a JAR file
libs.upload("/path/to/spark-connector.jar")
Replace Existing Libraries¶
Replace an existing library with a new version:
env = ws.environment("ML Environment")
libs = env.libraries
# Replace with callback for progress tracking
def progress(action, details):
print(f"{action}: {details}")
libs.replace(
"my_package", # Regex pattern to match library name
"/path/to/my_package-2.0.0-py3-none-any.whl",
callback=progress
)
The replace() method:
1. Lists staging libraries
2. Deletes all matching libraries (by regex pattern)
3. Uploads the new library file
Delete Libraries¶
env = ws.environment("ML Environment")
libs = env.libraries
# Delete from staging
libs.delete("my_package-1.0.0-py3-none-any.whl")
Publishing Changes¶
After uploading or deleting libraries, publish the environment to make changes active:
env = ws.environment("ML Environment")
libs = env.libraries
# Upload a new library
libs.upload("/path/to/new_package.whl")
# Publish the environment
env.publish()
# Optional: Wait for publish to complete
env.waitForPublish(
callback=lambda e: print(f"State: {e.state}"),
timeout=1800, # 30 minutes
poll_interval=30 # Check every 30 seconds
)
print("Environment published successfully!")
Cancel Publishing¶
If an environment is publishing and you need to cancel:
env = ws.environment("ML Environment")
if env.isPublishing:
env.cancelPublish()
print("Publish cancelled")
Example: Add Package and Publish¶
import fabias
ws = fabias.workspace("Analytics")
env = ws.environment("ML Environment")
# Upload a custom package
print("Uploading library...")
env.libraries.upload("/path/to/my_ml_utils-1.0.0-py3-none-any.whl")
# Publish the environment
print("Publishing environment...")
result = env.publish()
# Wait for completion with progress updates
env.waitForPublish(
callback=lambda e: print(f" Status: {e.state}"),
timeout=1200, # 20 minutes
poll_interval=20
)
print("? Environment is ready!")
Example: Library Upgrade Workflow¶
import fabias
def upgrade_library(workspace_name: str, env_name: str,
old_pattern: str, new_file: str):
"""Upgrade a library in an environment."""
ws = fabias.workspace(workspace_name)
env = ws.environment(env_name)
libs = env.libraries
print(f"Upgrading {old_pattern} in {env_name}...")
# Replace old version with new
libs.replace(
old_pattern,
new_file,
callback=lambda action, details: print(f" {action}: {details}")
)
# Publish changes
print("Publishing...")
env.publish()
# Wait for completion
env.waitForPublish(
callback=lambda e: print(f" {e.state}"),
timeout=1800
)
print("? Upgrade complete!")
# Usage
upgrade_library(
"Analytics",
"ML Environment",
"pandas",
"/path/to/pandas-2.2.0-cp311-cp311-manylinux_2_17_x86_64.whl"
)
Example: Compare Staging vs Published¶
import fabias
ws = fabias.workspace("Analytics")
env = ws.environment("ML Environment")
libs = env.libraries
# Refresh library data
libs.refresh()
staging_set = set(libs.staging["libraries"])
published_set = set(libs.published["libraries"])
# New libraries in staging
new_libs = staging_set - published_set
if new_libs:
print("New libraries to be published:")
for lib in new_libs:
print(f" + {lib}")
# Removed libraries
removed_libs = published_set - staging_set
if removed_libs:
print("\nLibraries to be removed:")
for lib in removed_libs:
print(f" - {lib}")
# Unchanged
if not new_libs and not removed_libs:
print("No changes in staging")
Refreshing Environment Data¶
Environment properties and library data are cached. To force a refresh:
env = ws.environment("ML Environment")
# Refresh environment metadata
env.refresh()
print(f"State: {env.state}")
# Refresh library lists
libs = env.libraries
libs.refresh()
print(f"Staging libraries: {len(libs.staging['libraries'])}")
Error Handling¶
Publish Failures¶
from fabias import fabiasError
env = ws.environment("ML Environment")
try:
env.publish()
env.waitForPublish(timeout=1800)
except FabiasError as e:
print(f"Publish failed: {e}")
# Check final state
env.refresh()
print(f"Final state: {env.state}")
Upload Failures¶
from fabias import fabiasError
try:
env.libraries.upload("/path/to/invalid_file.txt")
except FabiasError as e:
print(f"Upload failed: {e}")
See Also¶
- Workspaces - Workspace management
- Notebooks - Using environments with notebooks
- Spark Settings - Workspace Spark configuration