Source code for runway.module.cloudformation
"""Cloudformation module."""
from __future__ import annotations
import logging
from pathlib import Path
from typing import TYPE_CHECKING, Any, Dict, Optional, Union, cast
from .._logging import PrefixAdaptor
from ..cfngin.cfngin import CFNgin
from .base import RunwayModule
if TYPE_CHECKING:
from .._logging import RunwayLogger
from ..context import RunwayContext
from .base import ModuleOptions
LOGGER = cast("RunwayLogger", logging.getLogger(__name__))
[docs]class CloudFormation(RunwayModule):
"""CloudFormation (CFNgin) Runway Module."""
[docs] def __init__(
self,
context: RunwayContext,
*,
explicitly_enabled: Optional[bool] = False,
logger: RunwayLogger = LOGGER,
module_root: Path,
name: Optional[str] = None,
options: Optional[Union[Dict[str, Any], ModuleOptions]] = None,
parameters: Optional[Dict[str, Any]] = None,
**_: Any,
) -> None:
"""Instantiate class.
Args:
context: Runway context object for the current session.
explicitly_enabled: Whether or not the module is explicitly enabled.
This is can be set in the event that the current environment being
deployed to matches the defined environments of the module/deployment.
logger: Used to write logs.
module_root: Root path of the module.
name: Name of the module.
options: Options passed to the module class from the config as ``options``
or ``module_options`` if coming from the deployment level.
parameters: Values to pass to the underlying infrastructure as code
tool that will alter the resulting infrastructure being deployed.
Used to templatize IaC.
"""
super().__init__(
context,
explicitly_enabled=explicitly_enabled,
logger=logger,
module_root=module_root,
name=name,
options=options,
parameters=parameters,
)
# logger needs to be created here to use the correct logger
self.logger = PrefixAdaptor(self.name, LOGGER)
[docs] def deploy(self) -> None:
"""Run deploy."""
cfngin = CFNgin(self.ctx, parameters=self.parameters, sys_path=self.path)
cfngin.init(force=bool(self.parameters or self.explicitly_enabled))
cfngin.deploy(force=bool(self.parameters or self.explicitly_enabled))
[docs] def destroy(self) -> None:
"""Run destroy."""
cfngin = CFNgin(self.ctx, parameters=self.parameters, sys_path=self.path)
cfngin.destroy(force=bool(self.parameters or self.explicitly_enabled))
[docs] def init(self) -> None:
"""Run init."""
cfngin = CFNgin(self.ctx, parameters=self.parameters, sys_path=self.path)
cfngin.init(force=bool(self.parameters or self.explicitly_enabled))
[docs] def plan(self) -> None:
"""Run diff."""
cfngin = CFNgin(self.ctx, parameters=self.parameters, sys_path=self.path)
cfngin.plan(force=bool(self.parameters or self.explicitly_enabled))