[docs]@dataclasses.dataclassclassParameter:""" Ref: - https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html """key:str=dataclasses.field()value:T.Optional[T.Any]=dataclasses.field(default=None)use_previous_value:T.Optional[bool]=dataclasses.field(default=None)resolved_value:T.Optional[T.Any]=dataclasses.field(default=None)def__post_init__(self):if(self.use_previous_valueisTrue)and(self.valueisnotNone):raiseValueErrordefto_kwargs(self)->dict:dct=dict(ParameterKey=self.key)ifself.use_previous_valueisTrue:dct["UsePreviousValue"]=Trueelse:dct["ParameterValue"]=self.value# todo, add support for SSM ResolvedValuereturndct
classDriftStatusEnum(str,enum.Enum):""" """DRIFTED="DRIFTED"IN_SYNC="IN_SYNC"UNKNOWN="UNKNOWN"NOT_CHECKED="NOT_CHECKED"@classmethoddefget_by_name(cls,name:T.Optional[str])->T.Optional["DriftStatusEnum"]:returnget_enum_by_name(cls,name)@dataclasses.dataclassclassStack:""" """id:str=dataclasses.field()name:str=dataclasses.field()change_set_id:T.Optional[str]=dataclasses.field(default=None)status:T.Optional[StackStatusEnum]=dataclasses.field(default=None)description:T.Optional[str]=dataclasses.field(default=None)role_arn:T.Optional[str]=dataclasses.field(default=None)creation_time:T.Optional[datetime]=dataclasses.field(default=None)last_updated_time:T.Optional[datetime]=dataclasses.field(default=None)deletion_time:T.Optional[datetime]=dataclasses.field(default=None)outputs:T.Dict[str,Output]=dataclasses.field(default_factory=dict)params:T.Dict[str,Parameter]=dataclasses.field(default_factory=dict)tags:dict=dataclasses.field(default_factory=dict)enable_termination_protection:bool=dataclasses.field(default=False)parent_id:T.Optional[str]=dataclasses.field(default=None)root_id:T.Optional[str]=dataclasses.field(default=None)drift_status:T.Optional[DriftStatusEnum]=dataclasses.field(default=None)drift_last_check_time:T.Optional[datetime]=dataclasses.field(default=None)@propertydefarn(self)->str:returnself.id@propertydefstack_id(self)->str:returnself.id@propertydefstack_arn(self)->str:returnself.iddefis_success(self)->bool:# pragma: no cover""" """returnself.statusin_SUCCESS_STATUSdefis_failed(self)->bool:# pragma: no cover""" """returnself.statusin_FAILED_STATUSdefis_in_progress(self)->bool:# pragma: no cover""" """returnself.statusin_IN_PROGRESS_STATUSdefis_complete(self)->bool:# pragma: no cover""" """returnself.statusin_COMPLETE_STATUSdefis_stopped(self)->bool:# pragma: no cover""" """returnself.statusin_STOPPED_STATUSdefis_live(self)->bool:# pragma: no cover""" """returnnot(self.statusin_NOT_LIVE_STATUS)@classmethoddeffrom_arn(cls,arn:str)->"Stack":""" """stack=aws_arns.res.CloudFormationStack.from_arn(arn)returncls(id=arn,name=stack.stack_name)@classmethoddeffrom_describe_stacks_response(cls,data:dict)->"Stack":""" Create a :class:`~aws_cottonformation.stack.Stack` object from the ``describe_stacks`` API response. Ref: - describe_stacks: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/cloudformation/client/describe_stacks.html """drift_status=data.get("DriftInformation",dict()).get("StackDriftStatus")ifdrift_statusisnotNone:drift_status=DriftStatusEnum.get_by_name(drift_status)returncls(id=data["StackId"],name=data["StackName"],change_set_id=data.get("ChangeSetId"),status=StackStatusEnum.get_by_name(data["StackStatus"]),description=data.get("Description"),role_arn=data.get("RoleARN"),creation_time=data.get("CreationTime"),last_updated_time=data.get("LastUpdatedTime"),deletion_time=data.get("DeletionTime"),outputs={dct["OutputKey"]:Output(key=dct["OutputKey"],value=dct["OutputValue"],description=dct.get("Description"),export_name=dct.get("ExportName"),)fordctindata.get("Outputs",[])},params={dct["ParameterKey"]:Parameter(key=dct["ParameterKey"],value=dct["ParameterValue"],use_previous_value=dct.get("UsePreviousValue"),resolved_value=dct.get("ResolvedValue"),)fordctindata.get("Parameters",[])},tags={dct["Key"]:dct["Value"]fordctindata.get("Tags",[])},enable_termination_protection=data.get("EnableTerminationProtection"),parent_id=data.get("ParentId"),root_id=data.get("RootId"),drift_status=drift_status,drift_last_check_time=data.get("DriftInformation",dict()).get("LastCheckTimestamp"),)@propertydefaws_region(self)->str:returnself.id.split(":")[3]@propertydefaws_account_id(self)->str:returnself.id.split(":")[4]@propertydefconsole_url(self)->str:aws_console=acu.AWSConsole(aws_region=self.aws_region)returnaws_console.cloudformation.get_stack_info(name_or_arn=self.id)classChangeSetStatusEnum(str,enum.Enum):""" """CREATE_PENDING="CREATE_PENDING"CREATE_IN_PROGRESS="CREATE_IN_PROGRESS"CREATE_COMPLETE="CREATE_COMPLETE"DELETE_PENDING="DELETE_PENDING"DELETE_IN_PROGRESS="DELETE_IN_PROGRESS"DELETE_COMPLETE="DELETE_COMPLETE"DELETE_FAILED="DELETE_FAILED"FAILED="FAILED"@classmethoddefget_by_name(cls,name:T.Optional[str])->T.Optional["ChangeSetStatusEnum"]:returnget_enum_by_name(cls,name)classChangeSetTypeEnum(str,enum.Enum):""" """CREATE="CREATE"UPDATE="UPDATE"IMPORT="IMPORT"@classmethoddefget_by_name(cls,name:T.Optional[str])->T.Optional["ChangeSetTypeEnum"]:returnget_enum_by_name(cls,name)classChangeSetExecutionStatusEnum(str,enum.Enum):""" """UNAVAILABLE="UNAVAILABLE"AVAILABLE="AVAILABLE"EXECUTE_IN_PROGRESS="EXECUTE_IN_PROGRESS"EXECUTE_COMPLETE="EXECUTE_COMPLETE"EXECUTE_FAILED="EXECUTE_FAILED"OBSOLETE="OBSOLETE"@classmethoddefget_by_name(cls,name:T.Optional[str])->T.Optional["ChangeSetExecutionStatusEnum"]:returnget_enum_by_name(cls,name)
[docs]@dataclasses.dataclassclassChangeSet:""" Ref: - describe_change_set: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/cloudformation/client/describe_change_set.html - list_change_sets: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/cloudformation/client/list_change_sets.html """change_set_id:str=dataclasses.field()change_set_name:str=dataclasses.field()stack_id:str=dataclasses.field()stack_name:str=dataclasses.field()description:T.Optional[str]=dataclasses.field(default=None)params:T.Dict[str,Parameter]=dataclasses.field(default_factory=dict)creation_time:T.Optional[datetime]=dataclasses.field(default=None)execution_status:T.Optional[ChangeSetExecutionStatusEnum]=dataclasses.field(default=None)status:T.Optional[ChangeSetStatusEnum]=dataclasses.field(default=None)status_reason:T.Optional[str]=dataclasses.field(default=None)notification_arns:T.Optional[T.List[str]]=dataclasses.field(default=None)rollback_configuration:T.Optional[dict]=dataclasses.field(default=None)capabilities:T.Optional[T.List[str]]=dataclasses.field(default=None)tags:T.Optional[T.Dict[str,str]]=dataclasses.field(default_factory=dict)changes:T.Optional[T.List[dict]]=dataclasses.field(default_factory=list)include_nested_stacks:T.Optional[bool]=dataclasses.field(default=None)next_token:T.Optional[str]=dataclasses.field(default=None)parent_change_set_id:T.Optional[str]=dataclasses.field(default=None)root_change_set_id:T.Optional[str]=dataclasses.field(default=None)defis_status_create_pending(self)->bool:# pragma: no cover""" """returnself.status==ChangeSetStatusEnum.CREATE_PENDING.valuedefis_status_create_in_progress(self)->bool:# pragma: no cover""" """returnself.status==ChangeSetStatusEnum.CREATE_IN_PROGRESS.valuedefis_status_create_complete(self)->bool:# pragma: no cover""" """returnself.status==ChangeSetStatusEnum.CREATE_COMPLETE.valuedefis_status_delete_pending(self)->bool:# pragma: no cover""" """returnself.status==ChangeSetStatusEnum.DELETE_PENDING.valuedefis_status_delete_in_progress(self)->bool:# pragma: no cover""" """returnself.status==ChangeSetStatusEnum.DELETE_IN_PROGRESS.valuedefis_status_delete_complete(self)->bool:# pragma: no cover""" """returnself.status==ChangeSetStatusEnum.DELETE_COMPLETE.valuedefis_status_delete_failed(self)->bool:# pragma: no cover""" """returnself.status==ChangeSetStatusEnum.DELETE_FAILED.valuedefis_status_failed(self)->bool:# pragma: no cover""" """returnself.status==ChangeSetStatusEnum.FAILED.valuedefis_exec_status_unavailable(self)->bool:# pragma: no cover""" """returnself.execution_status==ChangeSetExecutionStatusEnum.UNAVAILABLE.valuedefis_exec_status_available(self)->bool:# pragma: no cover""" """returnself.execution_status==ChangeSetExecutionStatusEnum.AVAILABLE.valuedefis_exec_status_execute_in_progress(self)->bool:# pragma: no cover""" """return(self.execution_status==ChangeSetExecutionStatusEnum.EXECUTE_IN_PROGRESS.value)defis_exec_status_execute_complete(self)->bool:# pragma: no cover""" """return(self.execution_status==ChangeSetExecutionStatusEnum.EXECUTE_COMPLETE.value)defis_exec_status_execute_failed(self)->bool:# pragma: no cover""" """return(self.execution_status==ChangeSetExecutionStatusEnum.EXECUTE_FAILED.value)defis_exec_status_obsolete(self)->bool:# pragma: no cover""" """returnself.execution_status==ChangeSetExecutionStatusEnum.OBSOLETE.value
[docs]@classmethoddeffrom_describe_change_set_response(cls,data:dict)->"ChangeSet":""" Create a :class:`~aws_cottonformation.stack.ChangeSet` object from the ``describe_change_set`` API response. Ref: - describe_change_set: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/cloudformation/client/describe_change_set.html """returncls(change_set_id=data["ChangeSetId"],change_set_name=data["ChangeSetName"],stack_id=data["StackId"],stack_name=data["StackName"],description=data.get("Description"),params={dct["ParameterKey"]:Parameter(key=dct["ParameterKey"],value=dct["ParameterValue"],use_previous_value=dct.get("UsePreviousValue"),resolved_value=dct.get("ResolvedValue"),)fordctindata.get("Parameters",[])},creation_time=data.get("CreationTime"),execution_status=ChangeSetExecutionStatusEnum.get_by_name(data.get("ExecutionStatus")),status=ChangeSetStatusEnum.get_by_name(data.get("Status")),status_reason=data.get("StatusReason"),notification_arns=data.get("NotificationARNs"),rollback_configuration=data.get("RollbackConfiguration"),capabilities=data.get("Capabilities"),tags=to_tag_dict(data.get("Tags",[])),changes=data.get("Changes",[]),include_nested_stacks=data.get("IncludeNestedStacks"),)