Skip to content
Snippets Groups Projects
models.py 1.76 KiB
Newer Older
"""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):
Mohammad Torkashvand's avatar
Mohammad Torkashvand committed
    """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")
    )