Source code for sky.utils.common

"""Common enumerators and classes."""

import contextlib
import enum
import os
from typing import Generator

from sky.skylet import constants
from sky.utils import common_utils

SKY_SERVE_CONTROLLER_PREFIX: str = 'sky-serve-controller-'
JOB_CONTROLLER_PREFIX: str = 'sky-jobs-controller-'
# We use the user hash (machine-specific) for the controller name. It will be
# the same across the whole lifecycle of the server, including:
# 1. all requests, because this global variable is set once during server
#    starts.
# 2. SkyPilot API server restarts, as long as the `~/.sky` folder is persisted
#    and the env var set during starting the server is the same.
# This behavior is the same for the local API server (where SERVER_ID is the
# same as the normal user hash). This ensures backwards-compatibility with jobs
# controllers from before #4660.
SERVER_ID = common_utils.get_user_hash()
SKY_SERVE_CONTROLLER_NAME: str = f'{SKY_SERVE_CONTROLLER_PREFIX}{SERVER_ID}'
JOB_CONTROLLER_NAME: str = f'{JOB_CONTROLLER_PREFIX}{SERVER_ID}'


@contextlib.contextmanager
def with_server_user_hash() -> Generator[None, None, None]:
    """Temporarily set the user hash to common.SERVER_ID."""
    old_env_user_hash = os.getenv(constants.USER_ID_ENV_VAR)
    os.environ[constants.USER_ID_ENV_VAR] = SERVER_ID
    try:
        yield
    finally:
        if old_env_user_hash is not None:
            os.environ[constants.USER_ID_ENV_VAR] = old_env_user_hash
        else:
            os.environ.pop(constants.USER_ID_ENV_VAR)


[docs]class StatusRefreshMode(enum.Enum): """The mode of refreshing the status of a cluster.""" NONE = 'NONE' """Do not refresh any clusters.""" AUTO = 'AUTO' """Only refresh clusters if their autostop is set or have spot instances.""" FORCE = 'FORCE' """Enforce refreshing all clusters."""
# Constants: minimize what target? class OptimizeTarget(enum.Enum): COST = 0 TIME = 1