Source code for dxaws_website.models

from __future__ import annotations

from dataclasses import dataclass
from typing import Literal

"""Data models for dxaws_website."""


[docs] @dataclass(frozen=True, slots=True) class WebsiteDesired: url: str origin_region: str | None = None origin_domain_name: str | None = None bucket_name: str | None = None # CloudFront certificates must be in us-east-1. certificate_region: str = "us-east-1" zone_name: str | None = None hosted_zone_id: str | None = None aliases: tuple[str, ...] = () tags: dict[str, str] | None = None
[docs] def primary_hostname(self) -> str: return self.url.rstrip(".").lower()
[docs] def all_aliases(self) -> tuple[str, ...]: ordered: list[str] = [self.primary_hostname()] seen = {ordered[0]} for alias in self.aliases: value = alias.rstrip(".").lower() if value and value not in seen: ordered.append(value) seen.add(value) return tuple(ordered)
[docs] @dataclass(frozen=True, slots=True) class WebsiteCurrent: bucket_name: str | None = None certificate_arn: str | None = None certificate_status: str | None = None distribution_id: str | None = None distribution_status: str | None = None dns_records_ready: bool | None = None
[docs] @dataclass(frozen=True, slots=True) class WebsiteOutputs: bucket_name: str | None = None bucket_arn: str | None = None certificate_arn: str | None = None distribution_id: str | None = None distribution_arn: str | None = None distribution_domain: str | None = None distribution_hosted_zone_id: str | None = None dns_record_fqdns: tuple[str, ...] = () origin_domain_name: str | None = None
PlanAction = Literal["noop", "create", "update", "wait"]
[docs] @dataclass(frozen=True, slots=True) class WebsitePlan: desired: WebsiteDesired action: PlanAction reason: str | None = None steps: tuple[str, ...] = ()
[docs] @dataclass(frozen=True, slots=True) class WebsiteResult: desired: WebsiteDesired current: WebsiteCurrent plan: WebsitePlan outputs: WebsiteOutputs | None outcome: str