def get_vpc_overview(con, vpc_id, region_name): """ Retrieve information for the specified VPC. If no VPC ID was specified then just pick the first VPC we find. Returns a dict with the VPC's zones, subnets and route tables and instances. """ logging.debug("Retrieving information for VPC '%s'" % vpc_id) d = {} d['zones'] = con.get_all_zones() # Find the specified VPC, or just use the first one all_vpcs = con.get_all_vpcs() if not all_vpcs: raise VpcRouteSetError("Cannot find any VPCs.") vpc = None if not vpc_id: # Just grab the first available VPC and use it, if no VPC specified vpc = all_vpcs[0] else: # Search through the list of VPCs for the one with the specified ID for v in all_vpcs: if v.id == vpc_id: vpc = v break if not vpc: raise VpcRouteSetError("Cannot find specified VPC '%s' " "in region '%s'." % (vpc_id, region_name)) d['vpc'] = vpc vpc_filter = {"vpc-id" : vpc_id} # Will use this filter expression a lot # Now find the subnets, route tables and instances within this VPC d['subnets'] = con.get_all_subnets(filters=vpc_filter) d['route_tables'] = con.get_all_route_tables(filters=vpc_filter) reservations = con.get_all_reservations(filters=vpc_filter) d['instances'] = [] for r in reservations: # a reservation may have multiple instances d['instances'].extend(r.instances) # Maintain a quick instance lookup for convenience d['instance_by_id'] = {} for i in d['instances']: d['instance_by_id'][i.id] = i # TODO: Need a way to find which route table we should focus on. return d
def connect_to_region(region_name): """ Establish connection to AWS API. """ logging.debug("Connecting to AWS region '%s'" % region_name) con = boto.vpc.connect_to_region(region_name) if not con: raise VpcRouteSetError("Could not establish connection to " "region '%s'." % region_name) return con
def find_instance_and_eni_by_ip(vpc_info, ip): """ Given a specific IP address, find the EC2 instance and ENI. We need this information for setting the route. Returns instance and emi in a tuple. """ for instance in vpc_info['instances']: for eni in instance.interfaces: if eni.private_ip_address == ip: return instance, eni raise VpcRouteSetError("Could not find instance/eni for '%s' " "in VPC '%s'." % (ip, vpc_info['vpc'].id))
def get_vpc_overview(con, vpc_id, region_name): """ Retrieve information for the specified VPC. If no VPC ID was specified then just pick the first VPC we find. Returns a dict with the VPC's zones, subnets and route tables and instances. """ logging.debug("Retrieving information for VPC '%s'" % vpc_id) d = {} d['zones'] = con.get_all_zones() # Find the specified VPC, or just use the first one all_vpcs = con.get_all_vpcs() if not all_vpcs: raise VpcRouteSetError("Cannot find any VPCs.") if not vpc_id: # Just grab the first available VPC and use it, if no VPC specified vpc = all_vpcs[0] vpc_id = vpc.id else: # Search through the list of VPCs for the one with the specified ID vpc = None for v in all_vpcs: if v.id == vpc_id: vpc = v break if not vpc: raise VpcRouteSetError("Cannot find specified VPC '%s' " "in region '%s'." % (vpc_id, region_name)) d['vpc'] = vpc vpc_filter = {"vpc-id": vpc_id} # Will use this filter expression a lot # Now find the subnets, route tables and instances within this VPC d['subnets'] = con.get_all_subnets(filters=vpc_filter) d['route_tables'] = con.get_all_route_tables(filters=vpc_filter) # Route tables are associated with subnets. Maintain a lookup table from # subnet to (list of) route table(s). This is necessary later on, because # we only want to set a route in an RT if the ENI to which we set the route # is associated with the same subnet as the RT. That way, we don't have to # set the route in all tables all the time. d['subnet_rt_lookup'] = {} for rt in d['route_tables']: for assoc in rt.associations: if hasattr(assoc, 'subnet_id'): subnet_id = assoc.subnet_id d['subnet_rt_lookup'].setdefault(subnet_id, []).append(rt.id) reservations = con.get_all_reservations(filters=vpc_filter) d['instances'] = [] for r in reservations: # a reservation may have multiple instances d['instances'].extend(r.instances) # Maintain a quick instance lookup for convenience d['instance_by_id'] = {} for i in d['instances']: d['instance_by_id'][i.id] = i return d