48 lines
1.5 KiB
Python
48 lines
1.5 KiB
Python
# SPDX-License-Identifier: Apache-2.0
|
|
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
|
|
|
|
import os
|
|
import re
|
|
from typing import Any
|
|
|
|
AUTO_HOST_VALUES = {"", "auto", "*", "0.0.0.0", "::"}
|
|
AUTO_DEVICE_VALUES = {"", "auto"}
|
|
|
|
_UNEXPANDED_ENV_VAR_PATTERN = re.compile(r"\$\{([^}]+)\}|\$([A-Za-z_][A-Za-z0-9_]*)|%([^%]+)%")
|
|
|
|
|
|
class EnvVarExpansionError(ValueError):
|
|
pass
|
|
|
|
|
|
def _unexpanded_env_vars(value: str) -> list[str]:
|
|
names: list[str] = []
|
|
for match in _UNEXPANDED_ENV_VAR_PATTERN.finditer(value):
|
|
name = next(group for group in match.groups() if group)
|
|
if name not in names:
|
|
names.append(name)
|
|
return names
|
|
|
|
|
|
def expand_env_value(value: Any, *, strict: bool = False, field_name: str = "value") -> Any:
|
|
if not isinstance(value, str):
|
|
return value
|
|
|
|
expanded = os.path.expandvars(value)
|
|
if strict:
|
|
unresolved = _unexpanded_env_vars(expanded)
|
|
if unresolved:
|
|
names = ", ".join(unresolved)
|
|
raise EnvVarExpansionError(
|
|
f"{field_name} references unset environment variable(s): {names}. Original value: {value!r}"
|
|
)
|
|
return expanded
|
|
|
|
|
|
def expand_env_int(value: Any, field_name: str) -> int:
|
|
expanded = expand_env_value(value, strict=True, field_name=field_name)
|
|
try:
|
|
return int(expanded)
|
|
except (TypeError, ValueError) as exc:
|
|
raise ValueError(f"{field_name} must be an integer after environment expansion, got {expanded!r}") from exc
|