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