"""{term}`GSO` settings. Ensuring that the required parameters are set correctly. """ import ipaddress import json import logging import os from pydantic import BaseSettings logger = logging.getLogger(__name__) class GeneralParams(BaseSettings): """General parameters for a {term}`GSO` configuration file.""" public_hostname: str """The hostname that {term}`GSO` is publicly served at, used for building the callback URL that the provisioning proxy uses.""" class InfoBloxParams(BaseSettings): """Parameters related to InfoBlox.""" scheme: str wapi_version: str host: str username: str password: str class V4NetworkParams(BaseSettings): """A set of parameters that describe an IPv4 network in InfoBlox.""" containers: list[ipaddress.IPv4Network] networks: list[ipaddress.IPv4Network] mask: int # TODO: validation on mask? class V6NetworkParams(BaseSettings): """A set of parameters that describe an IPv6 network in InfoBlox.""" containers: list[ipaddress.IPv6Network] networks: list[ipaddress.IPv6Network] mask: int # TODO: validation on mask? class ServiceNetworkParams(BaseSettings): """Parameters for InfoBlox. The parameters describe IPv4 and v6 networks, and the corresponding domain name that should be used as a suffix. """ V4: V4NetworkParams V6: V6NetworkParams domain_name: str dns_view: str class IPAMParams(BaseSettings): """A set of parameters related to {term}`IPAM`.""" INFOBLOX: InfoBloxParams LO: ServiceNetworkParams TRUNK: ServiceNetworkParams GEANT_IP: ServiceNetworkParams SI: ServiceNetworkParams LT_IAS: ServiceNetworkParams class ProvisioningProxyParams(BaseSettings): """Parameters for the provisioning proxy.""" scheme: str api_base: str auth: str # FIXME: unfinished api_version: int class ResourceManagementParams(BaseSettings): """TO DO: resource management parameters.""" todo: str class OSSParams(BaseSettings): """The set of parameters required for running {term}`GSO`.""" GENERAL: GeneralParams IPAM: IPAMParams RESOURCE_MANAGEMENT: ResourceManagementParams PROVISIONING_PROXY: ProvisioningProxyParams def load_oss_params() -> OSSParams: """Look for OSS_PARAMS_FILENAME in the environment and load the parameters from that file.""" with open(os.environ["OSS_PARAMS_FILENAME"], encoding="utf-8") as file: return OSSParams(**json.loads(file.read())) if __name__ == "__main__": logger.debug(load_oss_params())