From e00d365630d87d49958384e3500e9cff54f3f613 Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Wed, 19 Feb 2014 16:26:40 -0500 Subject: [PATCH] Refactored subnet tagging to account for AWS delays; added 'tags' attribute to 'subnet' node in the returned json. --- cloud/ec2_vpc | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/cloud/ec2_vpc b/cloud/ec2_vpc index e92b9f77ed3..911cb4125df 100644 --- a/cloud/ec2_vpc +++ b/cloud/ec2_vpc @@ -280,10 +280,18 @@ def create_vpc(module, vpc_conn): add_subnet = False if add_subnet: try: - created_subnet = vpc_conn.create_subnet(vpc.id, subnet['cidr'], subnet.get('az', None)) - subnet_tags = subnet.get('tags', None) - if subnet_tags: - vpc_conn.create_tags(created_subnet.id, subnet_tags) + new_subnet = vpc_conn.create_subnet(vpc.id, subnet['cidr'], subnet.get('az', None)) + new_subnet_tags = subnet.get('tags', None) + if new_subnet_tags: + # Sometimes AWS takes its time to create a subnet and so using new subnets's id + # to create tags results in exception. + # boto doesn't seem to refresh 'state' of the newly created subnet, i.e.: it's always 'pending' + # so i resorted to polling vpc_conn.get_all_subnets with the id of the newly added subnet + while len(vpc_conn.get_all_subnets(filters={ 'subnet-id': new_subnet.id })) == 0: + time.sleep(0.1) + + vpc_conn.create_tags(new_subnet.id, new_subnet_tags) + changed = True except EC2ResponseError, e: module.fail_json(msg='Unable to create subnet {0}, error: {1}'.format(subnet['cidr'], e)) @@ -411,14 +419,15 @@ def create_vpc(module, vpc_conn): created_vpc_id = vpc.id returned_subnets = [] current_subnets = vpc_conn.get_all_subnets(filters={ 'vpc_id': vpc.id }) + for sn in current_subnets: returned_subnets.append({ + 'tags': dict((t.name, t.value) for t in vpc_conn.get_all_tags(filters={'resource-id': sn.id})), 'cidr': sn.cidr_block, 'az': sn.availability_zone, 'id': sn.id, }) - return (vpc_dict, created_vpc_id, returned_subnets, changed) def terminate_vpc(module, vpc_conn, vpc_id=None, cidr=None):