majuna/app/models/cloud.py

56 lines
1.6 KiB
Python

import enum
from typing import TYPE_CHECKING, Any, Dict, List
from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.brm.brn import BRN
from app.extensions import db
from app.models import AbstractConfiguration
from app.models.mirrors import StaticOrigin
if TYPE_CHECKING:
from app.models.bridges import Bridge
class CloudProvider(enum.Enum):
AWS = ("aws", "Amazon Web Services")
AZURE = ("azure", "Microsoft Azure")
BUNNY = ("bunny", "bunny.net")
CLOUDFLARE = ("cloudflare", "Cloudflare")
FASTLY = ("fastly", "Fastly")
HTTP = ("http", "HTTP")
GANDI = ("gandi", "Gandi")
GITHUB = ("github", "GitHub")
GITLAB = ("gitlab", "GitLab")
HCLOUD = ("hcloud", "Hetzner Cloud")
MAXMIND = ("maxmind", "MaxMind")
OVH = ("ovh", "OVH")
RFC2136 = ("rfc2136", "RFC2136 DNS Server")
def __init__(self, key: str, description: str):
self.key = key
self.description = description
class CloudAccount(AbstractConfiguration):
provider: Mapped[CloudProvider]
credentials: Mapped[Dict[str, Any]] = mapped_column(db.JSON())
enabled: Mapped[bool]
# CDN Quotas
max_distributions: Mapped[int]
max_sub_distributions: Mapped[int]
# Compute Quotas
max_instances: Mapped[int]
bridges: Mapped[List["Bridge"]] = relationship(
"Bridge", back_populates="cloud_account"
)
statics: Mapped[List["StaticOrigin"]] = relationship(
"StaticOrigin",
back_populates="storage_cloud_account",
foreign_keys=[StaticOrigin.storage_cloud_account_id],
)
@property
def brn(self) -> BRN:
raise NotImplementedError("No BRN for cloud accounts")