Source code for packer_ami_workflow.param
# -*- coding: utf-8 -*-
"""
The workflow and step level parameter system.
"""
import typing as T
import dataclasses
from functools import cached_property
from pathlib_mate import Path
from boto_session_manager import BotoSesManager
import aws_console_url.api as aws_console_url
from .vendor.jsonutils import json_loads
[docs]@dataclasses.dataclass
class BaseParam:
[docs] @classmethod
def from_json_file(cls, path):
"""
Load the parameter object from a json file.
"""
data = json_loads(text=Path(path).read_text())
return cls(**data)
T_PARAM = T.TypeVar("T_PARAM", bound=BaseParam)
[docs]@dataclasses.dataclass
class WorkflowParam(BaseParam):
"""
The workflow level parameter object. The parameters here are common values
for all steps.
:param workflow_id:
:param aws_profile: The AWS profile name to use.
:param aws_tags: The AWS tags to apply to the AMI.
:param vpc_name: The VPC name where the packer build will run.
:param is_default_vpc: are we using default VPC? use false or true (string, not boolean).
:param subnet_name: The Subnet name where the packer build will run.
:param security_group_name: The Security name where the packer build will use.
:param ec2_iam_role_name: The IAM role name that the packer build will use.
:param root_base_ami_name: The name of the root base AMI to use for building this AMI.
this is only used in step 1.
:param root_base_ami_owner_account_id: The owner account id of the root base AMI.
"""
workflow_id: str = dataclasses.field()
vpc_name: str = dataclasses.field()
is_default_vpc: str = dataclasses.field()
subnet_name: str = dataclasses.field()
security_group_name: str = dataclasses.field()
ec2_iam_role_name: str = dataclasses.field()
root_base_ami_id: str = dataclasses.field()
root_base_ami_name: str = dataclasses.field()
profile_name: T.Optional[str] = dataclasses.field(default=None)
region_name: T.Optional[str] = dataclasses.field(default=None)
aws_access_key_id: T.Optional[str] = dataclasses.field(default=None)
aws_secret_access_key: T.Optional[str] = dataclasses.field(default=None)
aws_session_token: T.Optional[str] = dataclasses.field(default=None)
aws_tags: T.Dict[str, str] = dataclasses.field(default_factory=dict)
@cached_property
def bsm(self) -> BotoSesManager:
kwargs = dict(
aws_access_key_id=self.aws_access_key_id,
aws_secret_access_key=self.aws_secret_access_key,
aws_session_token=self.aws_session_token,
region_name=self.region_name,
profile_name=self.profile_name,
)
kwargs = {k: v for k, v in kwargs.items() if v is not None}
return BotoSesManager(**kwargs)
@cached_property
def aws_region(self) -> str:
return self.bsm.aws_region
@cached_property
def aws_console(self) -> aws_console_url.AWSConsole:
return aws_console_url.AWSConsole.from_bsm(self.bsm)
[docs]@dataclasses.dataclass
class StepParam(BaseParam):
"""
The step level parameter object. The parameters here are specific to each step.
:param step_id: The step id.
:param source_ami_id: The source AMI id to use for building this AMI.
:param metadata: additional metadata for this step AMI.
"""
step_id: str = dataclasses.field()
previous_step_id: T.Optional[str] = dataclasses.field()
metadata: T.Dict[str, str] = dataclasses.field(default_factory=dict)