"""Database model definitions and table mappings for the GSO system.""" import enum import structlog from orchestrator.db import UtcTimestamp from orchestrator.db.database import BaseModel from sqlalchemy import ( Enum, String, text, ) from sqlalchemy.dialects.postgresql import ARRAY from sqlalchemy.orm import mapped_column logger = structlog.get_logger(__name__) class PartnerType(str, enum.Enum): """Defining different types of partners in the GSO system.""" NREN = "NREN" RE_PEER = "RE_PEER" PUBLIC_PEER = "PUBLIC_PEER" PRIVATE_PEER = "PRIVATE_PEER" UPSTREAM = "UPSTREAM" GEANT = "GEANT" class PartnerTable(BaseModel): """Database table for the partners in the GSO system.""" __tablename__ = "partners" partner_id = mapped_column(String, server_default=text("uuid_generate_v4"), primary_key=True) name = mapped_column(String, unique=True, nullable=True) email = mapped_column(String, unique=True, nullable=False) partner_type = mapped_column(Enum(PartnerType), nullable=False) as_number = mapped_column( String, unique=True, nullable=True ) # the as_number and as_set are mutually exclusive. if you give me one I don't need the other as_set = mapped_column(String, nullable=True) route_set = mapped_column(String, nullable=True) black_listed_as_sets = mapped_column(ARRAY(String), nullable=True) additional_routers = mapped_column(ARRAY(String), nullable=True) additional_bgp_speakers = mapped_column(ARRAY(String), nullable=True) created_at = mapped_column(UtcTimestamp, server_default=text("current_timestamp"), nullable=False) updated_at = mapped_column( UtcTimestamp, server_default=text("current_timestamp"), nullable=False, onupdate=text("current_timestamp") )