Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Basic RDS support for EC2 inventory #2610

Merged
merged 2 commits into from
Apr 27, 2013
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
66 changes: 66 additions & 0 deletions plugins/inventory/ec2.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@
from time import time
import boto
from boto import ec2
from boto import rds
import ConfigParser

try:
Expand Down Expand Up @@ -227,6 +228,7 @@ def do_api_calls_update_cache(self):

for region in self.regions:
self.get_instances_by_region(region)
self.get_rds_instances_by_region(region)

self.write_to_cache(self.inventory, self.cache_path_cache)
self.write_to_cache(self.index, self.cache_path_index)
Expand Down Expand Up @@ -254,6 +256,20 @@ def get_instances_by_region(self, region):
print e
sys.exit(1)

def get_rds_instances_by_region(self, region):
''' Makes an AWS API call to the list of RDS instances in a particular
region '''

try:
conn = rds.connect_to_region(region)
if conn:
instances = conn.get_all_dbinstances()
for instance in instances:
self.add_rds_instance(instance, region)
except boto.exception.BotoServerError as e:
print "Looks like AWS RDS is down: "
print e
sys.exit(1)

def get_instance(self, region, instance_id):
''' Gets details about a specific instance '''
Expand Down Expand Up @@ -322,6 +338,56 @@ def add_instance(self, instance, region):
self.push(self.inventory, key, dest)


def add_rds_instance(self, instance, region):
''' Adds an RDS instance to the inventory and index, as long as it is
addressable '''

# Only want available instances
if instance.status != 'available':
return

# Select the best destination address
#if instance.subnet_id:
#dest = getattr(instance, self.vpc_destination_variable)
#else:
#dest = getattr(instance, self.destination_variable)
dest = instance.endpoint[0]

if not dest:
# Skip instances we cannot address (e.g. private VPC subnet)
return

# Add to index
self.index[dest] = [region, instance.id]

# Inventory: Group by instance ID (always a group of 1)
self.inventory[instance.id] = [dest]

# Inventory: Group by region
self.push(self.inventory, region, dest)

# Inventory: Group by availability zone
self.push(self.inventory, instance.availability_zone, dest)

# Inventory: Group by instance type
self.push(self.inventory, self.to_safe('type_' + instance.instance_class), dest)

# Inventory: Group by security group
try:
key = self.to_safe("security_group_" + instance.security_group.name)
self.push(self.inventory, key, dest)
except AttributeError:
print 'Package boto seems a bit older.'
print 'Please upgrade boto >= 2.3.0.'
sys.exit(1)

# Inventory: Group by engine
self.push(self.inventory, self.to_safe("rds_" + instance.engine), dest)

# Inventory: Group by parameter group
self.push(self.inventory, self.to_safe("rds_parameter_group_" + instance.parameter_group.name), dest)


def get_host_info(self):
''' Get variables about a specific host '''

Expand Down