Files
2026-07-13 13:22:34 +08:00

119 lines
3.4 KiB
Python

from __future__ import annotations
from mlflow.environment_variables import MLFLOW_WORKSPACE, MLFLOW_WORKSPACE_STORE_URI
_workspace_store_uri: str | None = None
DEFAULT_WORKSPACE_NAME = "default"
WORKSPACES_DIR_NAME = "workspaces"
WORKSPACE_HEADER_NAME = "X-MLFLOW-WORKSPACE"
def _normalize_workspace(workspace: str | None) -> str | None:
"""Normalize a workspace identifier.
Args:
workspace: Raw workspace value, possibly ``None`` or whitespace padded.
Returns:
The trimmed workspace string or ``None`` when the input is empty.
"""
if workspace is None:
return None
value = workspace.strip()
return value or None
def resolve_entity_workspace_name(workspace: str | None) -> str:
"""Determine the workspace to associate with client-facing entities.
Preference order:
1. Explicit ``workspace`` argument provided by the backend store.
2. Active workspace bound via ``mlflow.set_workspace``.
3. ``MLFLOW_WORKSPACE`` environment variable.
4. ``DEFAULT_WORKSPACE_NAME``.
Args:
workspace: Optional workspace name provided by the store layer.
Returns:
A normalized workspace name honoring the preference order.
"""
if candidate := _normalize_workspace(workspace):
return candidate
from mlflow.utils.workspace_context import get_request_workspace
if candidate := _normalize_workspace(get_request_workspace()):
return candidate
if candidate := _normalize_workspace(MLFLOW_WORKSPACE.get()):
return candidate
return DEFAULT_WORKSPACE_NAME
def set_workspace_store_uri(uri: str | None) -> None:
"""Set the global workspace provider URI override.
Args:
uri: URI of the workspace provider or ``None`` to clear the override.
"""
global _workspace_store_uri
_workspace_store_uri = uri
if uri is None:
MLFLOW_WORKSPACE_STORE_URI.unset()
else:
MLFLOW_WORKSPACE_STORE_URI.set(uri)
def resolve_workspace_store_uri(
workspace_store_uri: str | None = None, tracking_uri: str | None = None
) -> str | None:
"""Resolve the workspace provider URI according to precedence rules.
Args:
workspace_store_uri: URI provided explicitly by the caller.
tracking_uri: Tracking URI used as the final fallback.
Returns:
The workspace provider URI chosen in this order:
1. Explicit ``workspace_store_uri`` argument.
2. Value configured via :func:`set_workspace_store_uri`
or ``MLFLOW_WORKSPACE_STORE_URI``.
3. The resolved tracking URI.
"""
if workspace_store_uri is not None:
return workspace_store_uri
if configured_uri := get_workspace_store_uri():
return configured_uri
# Lazy import to avoid circular dependency during module import.
from mlflow.tracking._tracking_service import utils as tracking_utils
return tracking_utils._resolve_tracking_uri(tracking_uri)
def get_workspace_store_uri() -> str | None:
"""Get the current workspace provider URI override, if any.
Returns:
The globally configured workspace provider URI, or ``None``.
"""
return _workspace_store_uri or MLFLOW_WORKSPACE_STORE_URI.get()
__all__ = [
"DEFAULT_WORKSPACE_NAME",
"WORKSPACES_DIR_NAME",
"WORKSPACE_HEADER_NAME",
"resolve_entity_workspace_name",
"set_workspace_store_uri",
"get_workspace_store_uri",
]