Source code for fmn.core.config
# SPDX-FileCopyrightText: Contributors to the Fedora Project
#
# SPDX-License-Identifier: MIT
from datetime import timedelta
from functools import cache
from typing import Any
from pydantic import BaseModel, BaseSettings, root_validator, stricturl
DEFAULT_CONFIG_FILE = _settings_file = "/etc/fmn/fmn.cfg"
CashewsTTLTypes = int | float | str | timedelta
[docs]class CacheArgsModel(BaseModel):
ttl: CashewsTTLTypes | None = None
lock_ttl: CashewsTTLTypes | None = None
early_ttl: CashewsTTLTypes | None = None
[docs]class CacheScopedArgsModel(BaseModel):
tracked: CacheArgsModel = CacheArgsModel(ttl="1d", lock_ttl="1h", early_ttl="20h")
rules: CacheArgsModel = CacheArgsModel(ttl="1d", lock_ttl="5m", early_ttl="20h")
pagure: CacheArgsModel | None = None
fasjson: CacheArgsModel | None = None
[docs]class CacheModel(BaseModel):
url: stricturl(tld_required=False, host_required=False) = "mem://"
setup_args: dict[str, Any] | None = None
default_args: CacheArgsModel = CacheArgsModel(ttl="1h")
scoped_args: CacheScopedArgsModel = CacheScopedArgsModel()
[docs]class SQLAlchemyModel(BaseModel):
url: stricturl(tld_required=False, host_required=False) = "sqlite:///:memory:"
echo: bool = False
[docs] class Config:
extra = "allow"
[docs]class DBModel(BaseModel):
sqlalchemy: SQLAlchemyModel = SQLAlchemyModel()
[docs]class ServicesModel(BaseModel):
fasjson_url: stricturl() = "https://fasjson.fedoraproject.org"
distgit_url: stricturl() = "https://src.fedoraproject.org"
[docs]class Settings(BaseSettings):
cors_origins: str = "https://notifications.fedoraproject.org"
oidc_provider_url: str = "https://id.fedoraproject.org/openidc"
oidc_conf_endpoint: str = "/.well-known/openid-configuration"
oidc_token_info_endpoint: str = "/TokenInfo"
oidc_user_info_endpoint: str = "/UserInfo"
oidc_client_id: str = "0123456789abcdef0123456789abcdef"
oidc_client_secret: str = "0123456789abcdef0123456789abcdef"
admin_groups: list[str] = ["sysadmin-main"]
# these fields are computed from the above
oidc_conf_url: str | None
oidc_token_info_url: str | None
id_cache_gc_interval: int = 300
database: DBModel = DBModel()
cache: CacheModel = CacheModel()
services: ServicesModel = ServicesModel()
[docs] class Config:
env_file = "fmn.cfg"
env_nested_delimiter = "__"
[docs] @root_validator
def compute_compound_fields(cls, values) -> dict:
values["oidc_conf_url"] = (
values["oidc_provider_url"].rstrip("/") + "/" + values["oidc_conf_endpoint"].lstrip("/")
)
values["oidc_token_info_url"] = (
values["oidc_provider_url"].rstrip("/")
+ "/"
+ values["oidc_token_info_endpoint"].lstrip("/")
)
values["oidc_user_info_url"] = (
values["oidc_provider_url"].rstrip("/")
+ "/"
+ values["oidc_user_info_endpoint"].lstrip("/")
)
return values
[docs]@cache
def get_settings() -> Settings:
return Settings(_env_file=_settings_file)
[docs]def set_settings_file(path: str) -> None:
global _settings_file
_settings_file = path
get_settings.cache_clear()