Source code for app.core.config
import logging
import os
import re
import secrets
import shlex
import string
from typing import Optional
from pydantic_settings import BaseSettings
logger = logging.getLogger(__name__)
[docs]def get_int_envar(key, default=None):
"""
Get (and parse) an integer environment variable
"""
value = os.environ.get(key)
if not value:
value = default
try:
value = int(value)
return value
except Exception:
return default
[docs]def get_bool_envar(key, default=False):
"""
Get a boolean from the environment, meaning the value is set.
"""
return default if not os.environ.get(key) else not default
[docs]def get_option_flags(key, prefix="-o"):
"""
Wrapper around parse_option_flags to get from environment.
The function can then be shared to parse flags from the UI
in the same way.
"""
flags = os.environ.get(key) or {}
if not flags:
return flags
return parse_option_flags(flags, prefix)
[docs]def parse_option_flags(flags, prefix="-o"):
"""
Parse key value pairs (optionally with a prefix) from the environment.
"""
values = {}
for flag in shlex.split(flags):
if "=" not in flag:
logger.warning(f"Missing '=' in flag {flag}, cannot parse.")
continue
option, value = flag.split("=", 1)
if option.startswith(prefix):
option = re.sub(f"^{prefix}", "", option)
values[option] = value
return values
[docs]def generate_secret_key(length=32):
"""
Generate a secret key to encrypt, if one not provided.
"""
alphabet = string.ascii_letters + string.digits
return "".join(secrets.choice(alphabet) for i in range(length))
[docs]class Settings(BaseSettings):
"""
Basic settings and defaults for the Flux RESTFul API
"""
app_name: str = "Flux RESTFul API"
api_version: str = "v1"
# These map to envars, e.g., FLUX_USER
has_gpus: bool = get_bool_envar("FLUX_HAS_GPUS")
# Assume there is at least one node!
flux_nodes: int = get_int_envar("FLUX_NUMBER_NODES", 1)
require_auth: bool = get_bool_envar("FLUX_REQUIRE_AUTH")
# If you change this, also change in alembic.ini
db_file: str = "sqlite:///./flux-restful.db"
flux_user: str = os.environ.get("FLUX_USER") or "fluxuser"
flux_token: Optional[str] = os.environ.get("FLUX_TOKEN")
flux_server_mode: Optional[str] = (
os.environ.get("FLUX_SERVER_MODE") or "single-user"
)
secret_key: str = os.environ.get("FLUX_SECRET_KEY") or generate_secret_key()
# Validate the server mode provided.
if flux_server_mode not in ["single-user", "multi-user"]:
raise ValueError("FLUX_SERVER_MODE must be single-user or multi-user")
# Expires in 10 hours
access_token_expires_minutes: int = get_int_envar(
"FLUX_ACCESS_TOKEN_EXPIRES_MINUTES", 600
)
# Default server option flags
option_flags: dict = get_option_flags("FLUX_OPTION_FLAGS")
# If the user requests a launcher, be strict.
# We only allow nextflow and snakemake, sorry
known_launchers: list = ["nextflow", "snakemake"]
settings = Settings()
Last update:
Mar 10, 2024