Skip to content

config

Configuration of the FastAPI server.

ServerConfig

Bases: ServerConfig

This class stores server config parameters in a way that can be easily extended for new config file types.

Source code in optimade_gateway/common/config.py
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
class ServerConfig(OptimadeServerConfig):
    """This class stores server config parameters in a way that
    can be easily extended for new config file types.

    """

    databases_collection: Annotated[
        str,
        Field(
            description="Mongo collection name for `/databases` endpoint resources.",
        ),
    ] = "databases"

    gateways_collection: Annotated[
        str,
        Field(
            description="Mongo collection name for `/gateways` endpoint resources.",
        ),
    ] = "gateways"

    queries_collection: Annotated[
        str,
        Field(
            description="Mongo collection name for `/queries` endpoint resources.",
        ),
    ] = "queries"

    load_optimade_providers_databases: Annotated[
        bool,
        Field(
            description=(
                "Whether or not to load all valid OPTIMADE providers' databases from "
                "the [Materials-Consortia list of OPTIMADE providers]"
                "(https://providers.optimade.org) on server startup."
            ),
        ),
    ] = True

    mongo_certfile: Annotated[
        Path,
        Field(
            description="Path to the MongoDB certificate file.",
        ),
    ] = Path("/certs/mongodb.pem")

    mongo_atlas_pem_content: Annotated[
        SecretStr | None,
        Field(
            description="PEM content for MongoDB Atlas certificate.",
        ),
    ] = None

    @field_validator("mongo_uri", mode="after")
    @classmethod
    def replace_with_env_vars(cls, value: str) -> str:
        """Replace string variables with environment variables, if possible"""
        res = value
        for match in re.finditer(r"\{[^{}]+\}", value):
            string_var = match.group()[1:-1]
            env_var = os.getenv(
                string_var, os.getenv(string_var.upper(), os.getenv(string_var.lower()))
            )
            if env_var is not None:
                res = res.replace(match.group(), env_var)
            else:
                warn(
                    OptimadeGatewayWarning(
                        detail=(
                            "Could not find an environment variable for "
                            f"{match.group()!r} from mongo_uri: {value}"
                        )
                    )
                )
        return res

    @model_validator(mode="after")
    def write_pem_content_to_file(self) -> ServerConfig:
        """Write the MongoDB Atlas PEM content to a file"""
        if self.mongo_atlas_pem_content:
            self.mongo_certfile.parent.mkdir(parents=True, exist_ok=True)
            self.mongo_certfile.write_text(
                self.mongo_atlas_pem_content.get_secret_value()
            )

        return self

replace_with_env_vars(value) classmethod

Replace string variables with environment variables, if possible

Source code in optimade_gateway/common/config.py
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
@field_validator("mongo_uri", mode="after")
@classmethod
def replace_with_env_vars(cls, value: str) -> str:
    """Replace string variables with environment variables, if possible"""
    res = value
    for match in re.finditer(r"\{[^{}]+\}", value):
        string_var = match.group()[1:-1]
        env_var = os.getenv(
            string_var, os.getenv(string_var.upper(), os.getenv(string_var.lower()))
        )
        if env_var is not None:
            res = res.replace(match.group(), env_var)
        else:
            warn(
                OptimadeGatewayWarning(
                    detail=(
                        "Could not find an environment variable for "
                        f"{match.group()!r} from mongo_uri: {value}"
                    )
                )
            )
    return res

write_pem_content_to_file()

Write the MongoDB Atlas PEM content to a file

Source code in optimade_gateway/common/config.py
 92
 93
 94
 95
 96
 97
 98
 99
100
101
@model_validator(mode="after")
def write_pem_content_to_file(self) -> ServerConfig:
    """Write the MongoDB Atlas PEM content to a file"""
    if self.mongo_atlas_pem_content:
        self.mongo_certfile.parent.mkdir(parents=True, exist_ok=True)
        self.mongo_certfile.write_text(
            self.mongo_atlas_pem_content.get_secret_value()
        )

    return self