Aparna & Cameron | get_diagnostics fetches info for the ec2 instance
This commit is contained in:
parent
49dc3c2b24
commit
3bbb534212
65
ec2driver.py
65
ec2driver.py
|
@ -15,6 +15,7 @@
|
|||
|
||||
"""Connection to the Amazon Web Services - EC2 service"""
|
||||
from boto import ec2
|
||||
import boto.ec2.cloudwatch
|
||||
from boto import exception as boto_exc
|
||||
from ec2driver_config import *
|
||||
|
||||
|
@ -32,7 +33,9 @@ from nova.openstack.common import loopingcall
|
|||
from nova.virt import driver
|
||||
from nova.virt import virtapi
|
||||
from nova.compute import flavors
|
||||
|
||||
from nova.compute import utils as compute_utils
|
||||
|
||||
import base64
|
||||
from novaclient.v1_1 import client
|
||||
from credentials import get_nova_creds
|
||||
|
@ -78,6 +81,8 @@ EC2_STATE_MAP = {
|
|||
"stopped" : power_state.SHUTDOWN
|
||||
}
|
||||
|
||||
DIAGNOSTIC_KEYS_TO_FILTER = ['group', 'block_device_mapping']
|
||||
|
||||
def set_nodes(nodes):
|
||||
"""Sets EC2Driver's node.list.
|
||||
|
||||
|
@ -126,9 +131,14 @@ class EC2Driver(driver.ComputeDriver):
|
|||
self._mounts = {}
|
||||
self._interfaces = {}
|
||||
|
||||
# To connect to EC2
|
||||
self.creds = get_nova_creds()
|
||||
self.nova = client.Client(**self.creds)
|
||||
|
||||
# To connect to EC2
|
||||
self.ec2_conn = ec2.connect_to_region(
|
||||
aws_region, aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key)
|
||||
self.cloudwatch_conn = ec2.cloudwatch.connect_to_region(
|
||||
aws_region, aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key)
|
||||
|
||||
self.reservation = self.ec2_conn.get_all_reservations()
|
||||
|
||||
|
@ -328,6 +338,10 @@ class EC2Driver(driver.ComputeDriver):
|
|||
if 'ec2_id' not in instance['metadata']:
|
||||
LOG.warning(_("Key '%s' not in EC2 instances") % instance['name'], instance=instance)
|
||||
return
|
||||
elif 'public_ip' not in instance['metadata'] and 'public_ip_address' not in instance['metadata']:
|
||||
print instance['metadata']
|
||||
LOG.warning(_("Public IP is null"), instance=instance)
|
||||
return
|
||||
else:
|
||||
# Deleting the instance from EC2
|
||||
ec2_id = instance['metadata']['ec2_id']
|
||||
|
@ -392,6 +406,7 @@ class EC2Driver(driver.ComputeDriver):
|
|||
raise exception.InterfaceDetachFailed('not attached')
|
||||
|
||||
def get_info(self, instance):
|
||||
LOG.info("*************** GET INFO ********************")
|
||||
if 'metadata' not in instance or 'ec2_id' not in instance['metadata']:
|
||||
raise exception.InstanceNotFound(instance_id=instance['name'])
|
||||
|
||||
|
@ -407,23 +422,39 @@ class EC2Driver(driver.ComputeDriver):
|
|||
'num_cpu': 2,
|
||||
'cpu_time': 0}
|
||||
|
||||
def allow_key(self, key):
|
||||
for key_to_filter in DIAGNOSTIC_KEYS_TO_FILTER:
|
||||
if key == key_to_filter:
|
||||
return False
|
||||
return True
|
||||
|
||||
def get_diagnostics(self, instance_name):
|
||||
return {'cpu0_time': 17300000000,
|
||||
'memory': 524288,
|
||||
'vda_errors': -1,
|
||||
'vda_read': 262144,
|
||||
'vda_read_req': 112,
|
||||
'vda_write': 5778432,
|
||||
'vda_write_req': 488,
|
||||
'vnet1_rx': 2070139,
|
||||
'vnet1_rx_drop': 0,
|
||||
'vnet1_rx_errors': 0,
|
||||
'vnet1_rx_packets': 26701,
|
||||
'vnet1_tx': 140208,
|
||||
'vnet1_tx_drop': 0,
|
||||
'vnet1_tx_errors': 0,
|
||||
'vnet1_tx_packets': 662,
|
||||
}
|
||||
LOG.info("******* GET DIAGNOSTICS *********************************************")
|
||||
instance = self.nova.servers.get(instance_name)
|
||||
|
||||
ec2_id = instance.metadata['ec2_id']
|
||||
ec2_instances = self.ec2_conn.get_only_instances(instance_ids=[ec2_id], filters=None, dry_run=False, max_results=None)
|
||||
if ec2_instances.__len__() == 0:
|
||||
LOG.warning(_("EC2 instance with ID %s not found") % ec2_id, instance=instance)
|
||||
raise exception.InstanceNotFound(instance_id=instance['name'])
|
||||
ec2_instance = ec2_instances[0]
|
||||
|
||||
diagnostics = {}
|
||||
for key, value in ec2_instance.__dict__.items() :
|
||||
if self.allow_key(key):
|
||||
diagnostics['instance.' + key] = str(value)
|
||||
|
||||
|
||||
metrics = self.cloudwatch_conn.list_metrics(dimensions={'InstanceId': ec2_id})
|
||||
import datetime
|
||||
for metric in metrics:
|
||||
end = datetime.datetime.utcnow()
|
||||
start = end - datetime.timedelta(hours=1)
|
||||
details = metric.query(start, end, 'Average', None, 3600)
|
||||
if (len(details) > 0):
|
||||
diagnostics['metrics.' + str(metric)] = details[0]
|
||||
|
||||
return diagnostics
|
||||
|
||||
def get_all_bw_counters(self, instances):
|
||||
"""Return bandwidth usage counters for each interface on each
|
||||
|
|
|
@ -31,11 +31,11 @@ class EC2DriverTest(unittest.TestCase):
|
|||
time.sleep(10)
|
||||
instance = self.nova.servers.get(server.id)
|
||||
self.servers.append(instance)
|
||||
return instance
|
||||
return instance, server.id
|
||||
|
||||
def test_spawn(self):
|
||||
print "******* Spawn Test ***********"
|
||||
instance = self.spawn_ec2_instance()
|
||||
instance, instance_ref = self.spawn_ec2_instance()
|
||||
|
||||
ec2_instance = self.ec2_conn.get_only_instances(instance_ids=[instance.metadata['ec2_id']], filters=None,
|
||||
dry_run=False, max_results=None)
|
||||
|
@ -45,7 +45,7 @@ class EC2DriverTest(unittest.TestCase):
|
|||
|
||||
def test_destroy(self):
|
||||
print "******* Destroy Test ***********"
|
||||
instance = self.spawn_ec2_instance()
|
||||
instance, instance_ref = self.spawn_ec2_instance()
|
||||
|
||||
ec2_id = instance.metadata['ec2_id']
|
||||
|
||||
|
@ -73,7 +73,7 @@ class EC2DriverTest(unittest.TestCase):
|
|||
|
||||
def test_power_off(self):
|
||||
print "******* Power Off Test ***********"
|
||||
instance = self.spawn_ec2_instance()
|
||||
instance, instance_ref = self.spawn_ec2_instance()
|
||||
# Send poweroff to the instance
|
||||
self.nova.servers.stop(instance)
|
||||
|
||||
|
@ -88,7 +88,7 @@ class EC2DriverTest(unittest.TestCase):
|
|||
|
||||
def test_soft_reboot(self):
|
||||
print "******* Soft Reboot Test ***********"
|
||||
instance = self.spawn_ec2_instance()
|
||||
instance, instance_ref = self.spawn_ec2_instance()
|
||||
# Send reboot to the instance with reboot_type = 'soft'
|
||||
self.nova.servers.reboot(instance, client.servers.REBOOT_SOFT)
|
||||
|
||||
|
@ -110,7 +110,7 @@ class EC2DriverTest(unittest.TestCase):
|
|||
|
||||
def test_hard_reboot(self):
|
||||
print "******* Hard Reboot Test ***********"
|
||||
instance = self.spawn_ec2_instance()
|
||||
instance, instance_ref = self.spawn_ec2_instance()
|
||||
# Send reboot to the instance with reboot_type = 'soft'
|
||||
self.nova.servers.reboot(instance, client.servers.REBOOT_HARD)
|
||||
|
||||
|
@ -131,7 +131,7 @@ class EC2DriverTest(unittest.TestCase):
|
|||
|
||||
def test_resize(self):
|
||||
print "******* Resize Test ***********"
|
||||
instance = self.spawn_ec2_instance()
|
||||
instance, instance_ref = self.spawn_ec2_instance()
|
||||
|
||||
ec2_instance = self.ec2_conn.get_only_instances(instance_ids=[instance.metadata['ec2_id']], filters=None,
|
||||
dry_run=False, max_results=None)[0]
|
||||
|
@ -175,7 +175,7 @@ class EC2DriverTest(unittest.TestCase):
|
|||
server = self.nova.servers.create(name="cirros-test", image=image.id, flavor=flavor.id,
|
||||
userdata=user_data_content)
|
||||
instance = self.nova.servers.get(server.id)
|
||||
while instance.status != 'ACTIVE':
|
||||
while instance.status != 'ACTIVE' and 'ec2_id' not in instance.metadata:
|
||||
time.sleep(10)
|
||||
instance = self.nova.servers.get(server.id)
|
||||
self.servers.append(instance)
|
||||
|
@ -194,6 +194,16 @@ class EC2DriverTest(unittest.TestCase):
|
|||
print raw_response
|
||||
self.assertEqual(raw_response.code, 200)
|
||||
|
||||
def test_diagnostics(self):
|
||||
print "******* Diagnostics Test ***********"
|
||||
instance, instance_ref = self.spawn_ec2_instance()
|
||||
print "instance_ref: ", instance_ref
|
||||
|
||||
diagnostics = instance.diagnostics()[1]
|
||||
|
||||
self.assertEqual(diagnostics['instance.instance_type'], 't2.micro')
|
||||
self.assertEqual(diagnostics['instance._state'], 'running(16)')
|
||||
|
||||
@classmethod
|
||||
def tearDown(self):
|
||||
print "Cleanup: Destroying the instance used for testing"
|
||||
|
|
Loading…
Reference in New Issue