chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
"""
|
||||
Utilities for MLflow cli server config validation and resolving.
|
||||
NOTE: these functions are intended to be used as utilities for the cli click-based interface.
|
||||
Do not use for any other purpose as the potential Exceptions being raised will be misleading
|
||||
for users.
|
||||
"""
|
||||
|
||||
import click
|
||||
|
||||
from mlflow.environment_variables import MLFLOW_WORKSPACE
|
||||
from mlflow.exceptions import MlflowException
|
||||
from mlflow.store.tracking import (
|
||||
DEFAULT_ARTIFACTS_URI,
|
||||
DEFAULT_LOCAL_FILE_AND_ARTIFACT_PATH,
|
||||
DEFAULT_TRACKING_URI,
|
||||
)
|
||||
from mlflow.utils.uri import is_local_uri
|
||||
|
||||
|
||||
def assert_server_workspace_env_unset() -> None:
|
||||
"""
|
||||
Ensure the server is not started with ``MLFLOW_WORKSPACE`` set.
|
||||
|
||||
``MLFLOW_WORKSPACE`` is a client-only setting used for propagating workspace across threads.
|
||||
Server isolation relies on per-request ContextVars and must not fall back to the env var.
|
||||
"""
|
||||
if workspace := MLFLOW_WORKSPACE.get_raw():
|
||||
raise MlflowException.invalid_parameter_value(
|
||||
f"{MLFLOW_WORKSPACE.name}={workspace} is client-only. Unset it before starting the "
|
||||
+ "server."
|
||||
)
|
||||
|
||||
|
||||
def resolve_default_artifact_root(
|
||||
serve_artifacts: bool,
|
||||
default_artifact_root: str,
|
||||
backend_store_uri: str,
|
||||
) -> str:
|
||||
if serve_artifacts and not default_artifact_root:
|
||||
default_artifact_root = DEFAULT_ARTIFACTS_URI
|
||||
elif not serve_artifacts and not default_artifact_root:
|
||||
if is_local_uri(backend_store_uri):
|
||||
default_artifact_root = backend_store_uri
|
||||
else:
|
||||
default_artifact_root = DEFAULT_LOCAL_FILE_AND_ARTIFACT_PATH
|
||||
return default_artifact_root
|
||||
|
||||
|
||||
def _is_default_backend_store_uri(backend_store_uri: str | None) -> bool:
|
||||
"""Utility function to validate if the configured backend store uri location is set as the
|
||||
default value for MLflow server.
|
||||
|
||||
Args:
|
||||
backend_store_uri: The value set for the backend store uri for MLflow server artifact
|
||||
handling.
|
||||
|
||||
Returns:
|
||||
bool True if the default value is set.
|
||||
|
||||
"""
|
||||
if backend_store_uri is None:
|
||||
return False
|
||||
return backend_store_uri in {DEFAULT_TRACKING_URI, DEFAULT_LOCAL_FILE_AND_ARTIFACT_PATH}
|
||||
|
||||
|
||||
def artifacts_only_config_validation(
|
||||
artifacts_only: bool,
|
||||
backend_store_uri: str,
|
||||
enable_workspaces: bool = False,
|
||||
trace_archival_config_path: str | None = None,
|
||||
) -> None:
|
||||
if artifacts_only and enable_workspaces:
|
||||
# Workspace mode relies on a workspace provider to resolve the default workspace and seed
|
||||
# request context. Artifact-only servers never load that stack, so they cannot determine
|
||||
# the active workspace safely. This decision can be revisited in the future.
|
||||
raise click.UsageError("--enable-workspaces cannot be combined with --artifacts-only.")
|
||||
if artifacts_only and not _is_default_backend_store_uri(backend_store_uri):
|
||||
msg = (
|
||||
"You are starting a tracking server in `--artifacts-only` mode and have provided a "
|
||||
f"value for `--backend_store_uri`: '{backend_store_uri}'. A tracking server in "
|
||||
"`--artifacts-only` mode cannot have a value set for `--backend_store_uri` to "
|
||||
"properly proxy access to the artifact storage location."
|
||||
)
|
||||
raise click.UsageError(message=msg)
|
||||
if not artifacts_only:
|
||||
return
|
||||
|
||||
if trace_archival_config_path is not None:
|
||||
raise click.UsageError(
|
||||
"--trace-archival-config cannot be combined with --artifacts-only because "
|
||||
"artifact-only servers do not initialize the tracking store required for "
|
||||
"server-owned trace archival."
|
||||
)
|
||||
Reference in New Issue
Block a user