Source code for infrahouse_toolkit.cli.ih_ec2.cmd_subnets
"""
.. topic:: ``ih-ec2 subnets``
A ``ih-ec2 subnets`` subcommand.
See ``ih-ec2 subnets`` for more details.
"""
import sys
from logging import getLogger
import click
from botocore.exceptions import ClientError
from infrahouse_core.logging import setup_logging
from tabulate import tabulate
LOG = getLogger()
[docs]def get_vpc_name(ec2_client, vpc_id):
"""
Given a vpc_id find out its name.
"""
response = ec2_client.describe_vpcs(
VpcIds=[
vpc_id,
]
)
for tag in response["Vpcs"][0]["Tags"]:
if tag["Key"] == "Name":
return tag["Value"]
return vpc_id
[docs]def list_subnets(ec2_client):
"""
Find and print information about available subnets in a region.
"""
response = ec2_client.describe_subnets()
header = ["SubnetId", "Name", "Public", "CidrBlock", "VpcId", "VpcName"]
rows = []
vpc_names = {}
for subnet in response["Subnets"]:
row = []
vpc_id = subnet["VpcId"]
for field in header:
if field == "Name":
value = ""
for tag in subnet["Tags"]:
if tag["Key"] == "Name":
value = tag["Value"]
elif field == "VpcName":
if vpc_id not in vpc_names:
vpc_names[vpc_id] = get_vpc_name(ec2_client, vpc_id)
value = vpc_names[vpc_id]
elif field == "Public":
value = subnet["MapPublicIpOnLaunch"]
else:
value = subnet[field]
row.append(value)
rows.append(row)
print(tabulate(sorted(rows, key=lambda x: x[1]), headers=header, tablefmt="outline"))
@click.command(name="subnets")
@click.pass_context
def cmd_subnets(ctx):
"""
Describe AWS subnets.
"""
setup_logging(debug=ctx.obj["debug"])
ec2_client = ctx.obj["ec2_client"]
aws_config = ctx.obj["aws_config"]
try:
list_subnets(ec2_client)
except ClientError as err:
LOG.exception(err)
LOG.info("Try to run ih-ec2 with --aws-profile option.")
LOG.info("Available profiles:\n\t%s", "\n\t".join(aws_config.profiles))
sys.exit(1)