from typing import Any
from typing import Dict
[docs]async def get(
hub,
ctx,
*,
name: str,
route_table_id: str = None,
destination_cidr_block: str = None,
destination_ipv6_cidr_block: str = None,
destination_prefix_list_id: str = None,
resource_id: str = None,
) -> Dict[str, Any]:
"""Check if a route is attached to a route table.
If resource_id is received as input search is done using only resource_id, If other parameters are specified
they will be ignored. If resource_id is not specified then route_table_id and one of the destination should be
specified. If more than one destination is specified search is done using only one destination in the priority order
destination_cidr_block, destination_ipv6_cidr_block, destination_prefix_list_id
Args:
name(str): An Idem name of the resource
route_table_id(str, Optional): The ID of the route table for the route.
destination_cidr_block(str, Optional): The IPv4 CIDR address block used for the destination match. Routing decisions are based on the
most specific match. We modify the specified CIDR block to its canonical form; for example, if
you specify 100.68.0.18/18, we modify it to 100.68.0.0/18. Defaults to None.
destination_ipv6_cidr_block(str, Optional): The IPv6 CIDR block used for the destination match. Routing decisions are based on the most
specific match. Defaults to None.
destination_prefix_list_id(str, Optional): The ID of a prefix list used for the destination match. Defaults to None.
resource_id(str, Optional): Unique identifier to identify the route in a route table. format of resource id is
<route_table_id>/<destination_cidr_block or destination_ipv6_cidr_block or destination_prefix_list_id>
Returns
Dict[bool, list, dict or None]:
result(bool):
Whether the result of the function has been successful (``True``) or not (``False``).
comment(list):
A list of messages.
ret(dict or None):
The EC2 route in "present" format.
Examples:
Calling this exec module function from the cli:
.. code-block:: bash
idem exec aws.ec2.route.get name="idem_name" resource_id="resource_id"
Calling this exec module function from within a state module in pure python:
.. code-block:: python
async def state_function(hub, ctx, name, resource_id, **kwargs):
ret = await hub.exec.aws.ec2.route.get(
ctx, name=name, resource_id=resource_id
)
Using in a state:
.. code-block:: yaml
my_unmanaged_resource:
exec.run:
- path: aws.ec2.route.get
- kwargs:
name: my_resource
resource_id: resource_id
"""
result = dict(comment=[], result=True, ret=None)
if resource_id:
route_table_id, route_destination = resource_id.split("/", 1)
elif route_table_id and (
destination_cidr_block
or destination_ipv6_cidr_block
or destination_prefix_list_id
):
if destination_cidr_block:
route_destination = destination_cidr_block
elif destination_ipv6_cidr_block:
route_destination = destination_ipv6_cidr_block
else:
route_destination = destination_prefix_list_id
else:
result["result"] = False
result["comment"] = [
f"aws.ec2.route {name} either resource_id or both route table id and one of the destination"
f" should be specified."
]
return result
ret = await hub.tool.aws.ec2.route_table.search_raw(
ctx=ctx, resource_id=route_table_id
)
if not ret["result"]:
if "InvalidRouteTableID.NotFound" in str(ret["comment"]):
result["comment"].append(
hub.tool.aws.comment_utils.get_empty_comment(
resource_type="aws.ec2.route", name=name
)
)
result["comment"] += list(ret["comment"])
return result
result["comment"] += list(ret["comment"])
result["result"] = False
return result
if not ret["ret"]["RouteTables"]:
result["comment"].append(
hub.tool.aws.comment_utils.get_empty_comment(
resource_type="aws.ec2.route", name=name
)
)
return result
resource = ret["ret"]["RouteTables"][0]
routes_associated_with_route_table = resource["Routes"]
route_found = None
for route in routes_associated_with_route_table:
if route["State"] == "active":
if (
"DestinationCidrBlock" in route
and route_destination == route["DestinationCidrBlock"]
):
route_found = route
break
elif (
"DestinationIpv6CidrBlock" in route
and route_destination == route["DestinationIpv6CidrBlock"]
):
route_found = route
break
elif (
"DestinationPrefixListId" in route
and route_destination == route["DestinationPrefixListId"]
):
route_found = route
break
if route_found:
result["ret"] = hub.tool.aws.ec2.conversion_utils.convert_raw_route_to_present(
raw_resource=route_found,
route_table_id=route_table_id,
idem_resource_name=name,
)
else:
result["comment"].append(
hub.tool.aws.comment_utils.get_empty_comment(
resource_type="aws.ec2.route", name=name
)
)
return result