Source code for dxaws_accounts.module
from __future__ import annotations
from dataclasses import dataclass
from typing import Any, Optional
from dxaws_core import AwsSession
from .providers.aws import AwsProvider
from .providers.base import ProviderBase
# Import as modules so tests can monkeypatch entrypoints without AWS.
from . import planner
from . import executor
[docs]
@dataclass(frozen=True)
class ModulePlanResult:
plan: Any
[docs]
@dataclass(frozen=True)
class ModuleApplyResult:
result: Any
[docs]
class AccountsModule:
"""Public module facade.
Implements the dxaws declarative convergence flow:
desired state -> plan -> apply
Callers construct `Module` with an `AwsSession` (or a provider directly),
then call `plan()` to compute an idempotent plan, or `apply()` to execute it.
"""
def __init__(
self,
*,
aws: Optional[AwsSession] = None,
provider: Optional[ProviderBase] = None,
) -> None:
if provider is None:
if aws is None:
raise ValueError("Either 'aws' or 'provider' must be provided")
provider = AwsProvider(aws=aws)
self._provider = provider
[docs]
def plan(self, *, desired: Any) -> ModulePlanResult:
p = planner.plan(provider=self._provider, desired=desired)
return ModulePlanResult(plan=p)
[docs]
def apply(self, *, desired: Any) -> ModuleApplyResult:
p = planner.plan(provider=self._provider, desired=desired)
r = executor.apply(provider=self._provider, plan=p)
return ModuleApplyResult(result=r)
# Backwards-compatible alias for callers/tests that prefer a generic name.
Module = AccountsModule