rostran/handlers/resource.py (100 lines of code) (raw):

import typer from rostran.core.properties import Properties from rostran.core.resources import Resource, Resources def get_ref_id(name, value, reason): ref_id = None if ( isinstance(value, dict) and len(value) == 1 and ("Ref" in value or "Fn::GetAtt" in value) ): if "Ref" in value: ref_id = value["Ref"] if not isinstance(ref_id, str): typer.secho( f"The Ref value type of {name} needs to be a string.", fg="yellow" ) else: get_att = value["Fn::GetAtt"] if not isinstance(get_att, list): typer.secho( f"The Fn::GetAtt value type of {name} needs to be a list.", fg="yellow", ) elif len(get_att) != 2: typer.secho( f"The Fn::GetAtt value of {name} needs to be a list of length 2.", fg="yellow", ) elif not isinstance(get_att[0], str): typer.secho( f"The first element of Fn::GetAtt value of {name} needs to be a string", fg="yellow", ) else: ref_id = get_att[0] else: typer.secho(reason, fg="yellow") return ref_id def merge_vpc_gateway_attachment_to_gateway( resource: Resource, out_resources: Resources ): tpl = f" Resource type {resource.type!r} is not supported and will be ignored. Reason: {{}}." raw_vpc_id = resource.properties.get("VpcId") if not raw_vpc_id: typer.secho(tpl.format("missing VpcId"), fg="yellow") raw_vpc_gateway_id = resource.properties.get("VpnGatewayId") if raw_vpc_gateway_id: vpn_gateway_id = get_ref_id( "VpnGatewayId", raw_vpc_gateway_id.value, reason=tpl.format("VpnGatewayId does not reference any resource"), ) out_resource = out_resources.get(vpn_gateway_id) if out_resource: if out_resource.type != "ALIYUN::VPC::VpnGateway": typer.secho( tpl.format( "VpnGatewayId references a resource other than EC2::VpnGateway" ), fg="yellow", ) return out_resource.properties["VpcId"] = raw_vpc_id else: raw_internet_gateway_id = resource.properties.get("InternetGatewayId") if raw_internet_gateway_id: internet_gateway_id = get_ref_id( "InternetGatewayId", raw_internet_gateway_id.value, reason=tpl.format("InternetGatewayId does not reference any resource"), ) out_resource = out_resources.get(internet_gateway_id) if out_resource: if out_resource.type != "ALIYUN::VPC::NatGateway": typer.secho( tpl.format( "InternetGatewayId references a resource other than EC2::InternetGateway" ), fg="yellow", ) return out_resource.properties["VpcId"] = raw_vpc_id def split_nat_gateway(resource: Resource, out_resources: Resources): print(resource.properties.as_dict()) raw_allocation_id = resource.properties.get("AllocationId") print(raw_allocation_id) if not raw_allocation_id: return eip_association_props = Properties.initialize( { "AllocationId": raw_allocation_id.value, "InstanceId": resource.resource_id, }, ) eip_association = Resource( resource_id=f"{resource.resource_id}EIPAssociation", resource_type="ALIYUN::VPC::EIPAssociation", properties=eip_association_props, ) out_resources.add(eip_association)