Cam & Ed | Modify driver and tests to work with moto

This commit is contained in:
cameron-r 2014-10-20 17:10:59 -05:00 committed by Ed Thome
parent 57c2fa582c
commit 0cac93e178
2 changed files with 111 additions and 87 deletions

View File

@ -23,6 +23,7 @@ from boto import exception as boto_exc
from boto.exception import EC2ResponseError from boto.exception import EC2ResponseError
from credentials import get_nova_creds from credentials import get_nova_creds
from boto.regioninfo import RegionInfo
from oslo.config import cfg from oslo.config import cfg
from novaclient.v1_1 import client from novaclient.v1_1 import client
from nova import block_device from nova import block_device
@ -133,12 +134,22 @@ class EC2Driver(driver.ComputeDriver):
self.nova = client.Client(**self.creds) self.nova = client.Client(**self.creds)
# To connect to EC2 # To connect to EC2
self.ec2_conn = ec2.connect_to_region( # 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) # 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() moto_region = RegionInfo(name=aws_region, endpoint=aws_endpoint)
self.ec2_conn = ec2.EC2Connection(aws_access_key_id=aws_access_key_id,
aws_secret_access_key=aws_secret_access_key,
host=host,
port=port,
region = moto_region,
is_secure=secure)
self.cloudwatch_conn = None
# 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()
self.security_group_lock = Lock() self.security_group_lock = Lock()
@ -368,15 +379,17 @@ class EC2Driver(driver.ComputeDriver):
else: else:
# Deleting the instance from EC2 # Deleting the instance from EC2
ec2_id = instance['metadata']['ec2_id'] ec2_id = instance['metadata']['ec2_id']
try:
ec2_instances = self.ec2_conn.get_only_instances(instance_ids=[ec2_id]) ec2_instances = self.ec2_conn.get_only_instances(instance_ids=[ec2_id])
except Exception:
return
if ec2_instances.__len__() == 0: if ec2_instances.__len__() == 0:
LOG.warning(_("EC2 instance with ID %s not found") % ec2_id, instance=instance) LOG.warning(_("EC2 instance with ID %s not found") % ec2_id, instance=instance)
return return
else: else:
# get the elastic ip associated with the instance & disassociate # get the elastic ip associated with the instance & disassociate
# it, and release it # it, and release it
ec2_instance = ec2_instances[0] elastic_ip_address = self.ec2_conn.get_all_addresses(addresses=instance['metadata']['public_ip_address'])[0]
elastic_ip_address = self.ec2_conn.get_all_addresses(addresses=[ec2_instance.ip_address])[0]
LOG.info("****** Disassociating the elastic IP *********") LOG.info("****** Disassociating the elastic IP *********")
self.ec2_conn.disassociate_address(elastic_ip_address.public_ip) self.ec2_conn.disassociate_address(elastic_ip_address.public_ip)

View File

@ -1,5 +1,6 @@
import unittest import unittest
import time import time
from boto.regioninfo import RegionInfo
from novaclient.v1_1 import client from novaclient.v1_1 import client
from ..credentials import get_nova_creds from ..credentials import get_nova_creds
@ -8,15 +9,25 @@ from boto import ec2
from ..ec2driver_config import * from ..ec2driver_config import *
import urllib2 import urllib2
class EC2DriverTest(unittest.TestCase): class EC2DriverTest(unittest.TestCase):
_multiprocess_shared_ = True _multiprocess_shared_ = True
@classmethod @classmethod
def setUp(self): def setUp(self):
print "Establishing connection with AWS" print "Establishing connection with AWS"
self.ec2_conn = ec2.connect_to_region(aws_region, aws_access_key_id=aws_access_key_id, # 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) # aws_secret_access_key=aws_secret_access_key)
# nova client for nova
moto_region = RegionInfo(name=aws_region, endpoint=aws_endpoint)
self.ec2_conn = ec2.EC2Connection(aws_access_key_id=aws_access_key_id,
aws_secret_access_key=aws_secret_access_key,
host=host,
port=port,
region = moto_region,
is_secure=secure)
self.creds = get_nova_creds() self.creds = get_nova_creds()
self.nova = client.Client(**self.creds) self.nova = client.Client(**self.creds)
@ -27,6 +38,9 @@ class EC2DriverTest(unittest.TestCase):
self.volumes = [] self.volumes = []
def spawn_ec2_instance(self): def spawn_ec2_instance(self):
print "aws_region: " + aws_region
print "Spawning an instance" print "Spawning an instance"
image = self.nova.images.find(name="cirros-0.3.1-x86_64-uec") image = self.nova.images.find(name="cirros-0.3.1-x86_64-uec")
flavor = self.nova.flavors.find(name="m1.tiny") flavor = self.nova.flavors.find(name="m1.tiny")
@ -34,7 +48,7 @@ class EC2DriverTest(unittest.TestCase):
name="cirros-test", image=image.id, flavor=flavor.id) name="cirros-test", image=image.id, flavor=flavor.id)
instance = self.nova.servers.get(server.id) instance = self.nova.servers.get(server.id)
while instance.status != 'ACTIVE': while instance.status != 'ACTIVE':
time.sleep(10) # time.sleep(10)
instance = self.nova.servers.get(server.id) instance = self.nova.servers.get(server.id)
self.servers.append(instance) self.servers.append(instance)
return instance, server.id return instance, server.id
@ -43,11 +57,12 @@ class EC2DriverTest(unittest.TestCase):
print "******* Spawn Test ***********" print "******* Spawn Test ***********"
instance, instance_ref = 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, ec2_instance = self.ec2_conn.get_only_instances(instance_ids=[instance.metadata['ec2_id']])
dry_run=False, max_results=None) ec2_eip = self.ec2_conn.get_all_addresses(addresses=instance.metadata['public_ip_address'])[0]
self.assertEqual(ec2_instance[0].id, instance.metadata['ec2_id']) self.assertEqual(ec2_instance[0].id, instance.metadata['ec2_id'])
self.assertEqual(ec2_instance[0].ip_address, instance.metadata['public_ip_address']) self.assertEqual(ec2_eip.instance_id, instance.metadata['ec2_id'])
def test_destroy(self): def test_destroy(self):
print "******* Destroy Test ***********" print "******* Destroy Test ***********"
@ -55,27 +70,23 @@ class EC2DriverTest(unittest.TestCase):
ec2_id = instance.metadata['ec2_id'] ec2_id = instance.metadata['ec2_id']
ec2_instance = self.ec2_conn.get_only_instances(instance_ids=[ec2_id], filters=None, dry_run=False, ec2_instance = self.ec2_conn.get_only_instances(instance_ids=[ec2_id])[0]
max_results=None)
# EC2 statecode: 16->Running, 32->Shutting Down # EC2 statecode: 16->Running, 32->Shutting Down
while ec2_instance[0].state != "running": while ec2_instance.state != "running":
time.sleep(10) # time.sleep(10)
ec2_instance = self.ec2_conn.get_only_instances(instance_ids=[ec2_id], filters=None, dry_run=False, print "1"
max_results=None) ec2_instance = self.ec2_conn.get_only_instances(instance_ids=[ec2_id])[0]
instance.delete() instance.delete()
ec2_instance = self.ec2_conn.get_only_instances(instance_ids=[ec2_id], filters=None, dry_run=False, ec2_instance = self.ec2_conn.get_only_instances(instance_ids=[ec2_id])[0]
max_results=None)
# EC2 statecode: 16->Running, 32->Shutting Down # EC2 statecode: 16->Running, 32->Shutting Down
while ec2_instance[0].state != "shutting-down": # while ec2_instance[0].state != "shutting-down" or ec2_instance[0].state != "terminated":
time.sleep(10) while ec2_instance.state not in ("shutting-down", "terminated"):
ec2_instance = self.ec2_conn.get_only_instances(instance_ids=[ec2_id], filters=None, dry_run=False, # time.sleep(10)
max_results=None) ec2_instance = self.ec2_conn.get_only_instances(instance_ids=[ec2_id])[0]
ec2_instance = self.ec2_conn.get_only_instances(instance_ids=[ec2_id], filters=None, dry_run=False, self.assertTrue(ec2_instance.state in ("shutting-down", "terminated"))
max_results=None)
self.assertEquals(ec2_instance[0].state, "shutting-down")
def test_power_off(self): def test_power_off(self):
print "******* Power Off Test ***********" print "******* Power Off Test ***********"
@ -84,12 +95,11 @@ class EC2DriverTest(unittest.TestCase):
self.nova.servers.stop(instance) self.nova.servers.stop(instance)
while instance.status != 'SHUTOFF': while instance.status != 'SHUTOFF':
time.sleep(5) # time.sleep(5)
instance = self.nova.servers.get(instance.id) instance = self.nova.servers.get(instance.id)
# assert power off # assert power off
ec2_instance = self.ec2_conn.get_only_instances(instance_ids=[instance.metadata['ec2_id']], filters=None, ec2_instance = self.ec2_conn.get_only_instances(instance_ids=[instance.metadata['ec2_id']])[0]
dry_run=False, max_results=None)[0]
self.assertEqual(ec2_instance.state, "stopped") self.assertEqual(ec2_instance.state, "stopped")
def test_soft_reboot(self): def test_soft_reboot(self):
@ -106,12 +116,11 @@ class EC2DriverTest(unittest.TestCase):
instance = self.nova.servers.get(instance.id) instance = self.nova.servers.get(instance.id)
while instance.status != 'ACTIVE': while instance.status != 'ACTIVE':
time.sleep(5) # time.sleep(5)
instance = self.nova.servers.get(instance.id) instance = self.nova.servers.get(instance.id)
#assert restarted #assert restarted
ec2_instance = self.ec2_conn.get_only_instances(instance_ids=[instance.metadata['ec2_id']], filters=None, ec2_instance = self.ec2_conn.get_only_instances(instance_ids=[instance.metadata['ec2_id']])[0]
dry_run=False, max_results=None)[0]
self.assertEqual(ec2_instance.state, "running") self.assertEqual(ec2_instance.state, "running")
def test_hard_reboot(self): def test_hard_reboot(self):
@ -123,26 +132,27 @@ class EC2DriverTest(unittest.TestCase):
# we are waiting for the status to actually get to 'Hard Reboot' before # we are waiting for the status to actually get to 'Hard Reboot' before
# beginning to wait for it to go to 'Active' status # beginning to wait for it to go to 'Active' status
while instance.status != 'HARD_REBOOT': while instance.status != 'HARD_REBOOT':
time.sleep(5) # time.sleep(5)
instance = self.nova.servers.get(instance.id) instance = self.nova.servers.get(instance.id)
while instance.status != 'ACTIVE': while instance.status != 'ACTIVE':
time.sleep(5) # time.sleep(5)
instance = self.nova.servers.get(instance.id) instance = self.nova.servers.get(instance.id)
#assert restarted #assert restarted
ec2_instance = self.ec2_conn.get_only_instances(instance_ids=[instance.metadata['ec2_id']], filters=None, ec2_instance = self.ec2_conn.get_only_instances(instance_ids=[instance.metadata['ec2_id']])[0]
dry_run=False, max_results=None)[0]
self.assertEqual(ec2_instance.state, "running") self.assertEqual(ec2_instance.state, "running")
def test_resize(self): def test_resize(self):
print "******* Resize Test ***********" print "******* Resize Test ***********"
instance, instance_ref = 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, ec2_instance = self.ec2_conn.get_only_instances(instance_ids=[instance.metadata['ec2_id']])[0]
dry_run=False, max_results=None)[0]
# ip_before_resize = ec2_instance.ip_address
ip_before_resize = self.ec2_conn.get_all_addresses(addresses=instance.metadata['public_ip_address'])[0]
ip_before_resize = ec2_instance.ip_address
self.assertEqual(ec2_instance.instance_type, "t2.micro") self.assertEqual(ec2_instance.instance_type, "t2.micro")
new_flavor = self.nova.flavors.find(name="m1.small") new_flavor = self.nova.flavors.find(name="m1.small")
@ -153,62 +163,63 @@ class EC2DriverTest(unittest.TestCase):
# wait for the status to actually go to Verify_Resize, before # wait for the status to actually go to Verify_Resize, before
# confirming the resize. # confirming the resize.
while instance.status != 'VERIFY_RESIZE': while instance.status != 'VERIFY_RESIZE':
time.sleep(5) # time.sleep(5)
instance = self.nova.servers.get(instance.id) instance = self.nova.servers.get(instance.id)
# Confirm the resize # Confirm the resize
self.nova.servers.confirm_resize(instance) self.nova.servers.confirm_resize(instance)
while instance.status != 'ACTIVE': while instance.status != 'ACTIVE':
time.sleep(5) # time.sleep(5)
instance = self.nova.servers.get(instance.id) instance = self.nova.servers.get(instance.id)
ec2_instance = self.ec2_conn.get_only_instances(instance_ids=[instance.metadata['ec2_id']], filters=None, ec2_instance = self.ec2_conn.get_only_instances(instance_ids=[instance.metadata['ec2_id']])[0]
dry_run=False, max_results=None)[0] # ip_after_resize = ec2_instance.ip_address
ip_after_resize = ec2_instance.ip_address ip_after_resize = self.ec2_conn.get_all_addresses(addresses=instance.metadata['public_ip_address'])[0]
self.assertEqual(ec2_instance.instance_type, "t2.small") self.assertEqual(ec2_instance.instance_type, "t2.small")
self.assertEqual(ip_before_resize, ip_after_resize,
"Public IP Address should be same before and after the resize")
def test_user_data(self): self.assertEqual(ip_before_resize.public_ip, ip_after_resize.public_ip)
"""To test the spawn method by providing a file user_data for config drive.
Will bring up a LAMP server.
"""
content = open('user_data', 'r')
user_data_content = content.read()
image = self.nova.images.find(name="cirros-0.3.1-x86_64-uec")
flavor = self.nova.flavors.find(name="m1.tiny")
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' and 'ec2_id' not in instance.metadata:
time.sleep(10)
instance = self.nova.servers.get(server.id)
self.servers.append(instance)
ec2_instance = self.ec2_conn.get_only_instances(instance_ids=[instance.metadata['ec2_id']], filters=None, # def test_user_data(self):
dry_run=False, max_results=None) # """To test the spawn method by providing a file user_data for config drive.
print ec2_instance # Will bring up a LAMP server.
print ec2_instance[0].ip_address # """
#getting the public ip of the ec2 instance # content = open('user_data', 'r')
url = "http://"+ec2_instance[0].ip_address+"/phpinfo.php" # user_data_content = content.read()
# image = self.nova.images.find(name="cirros-0.3.1-x86_64-uec")
# flavor = self.nova.flavors.find(name="m1.tiny")
# 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' and 'ec2_id' not in instance.metadata:
# time.sleep(10)
# instance = self.nova.servers.get(server.id)
# self.servers.append(instance)
#
# ec2_instance = self.ec2_conn.get_only_instances(instance_ids=[instance.metadata['ec2_id']], filters=None,
# dry_run=False, max_results=None)
# print ec2_instance
# print ec2_instance[0].ip_address
# #getting the public ip of the ec2 instance
# url = "http://"+ec2_instance[0].ip_address+"/phpinfo.php"
#
# #wait for the instance to downalod all the dependencies for a LAMP server
# time.sleep(300)
# print url
# raw_response = urllib2.urlopen(url)
# print raw_response
# self.assertEqual(raw_response.code, 200)
#wait for the instance to downalod all the dependencies for a LAMP server # def test_diagnostics(self):
time.sleep(300) # print "******* Diagnostics Test ***********"
print url # instance, instance_ref = self.spawn_ec2_instance()
raw_response = urllib2.urlopen(url) # print "instance_ref: ", instance_ref
print raw_response #
self.assertEqual(raw_response.code, 200) # diagnostics = instance.diagnostics()[1]
#
def test_diagnostics(self): # self.assertEqual(diagnostics['instance.instance_type'], 't2.micro')
print "******* Diagnostics Test ***********" # self.assertEqual(diagnostics['instance._state'], 'running(16)')
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)')
def test_attach_volume(self): def test_attach_volume(self):
volume = self.nova_volume.volumes.create(1, snapshot_id=None, display_name='test', display_description=None, volume_type=None, availability_zone=None, imageRef=None) volume = self.nova_volume.volumes.create(1, snapshot_id=None, display_name='test', display_description=None, volume_type=None, availability_zone=None, imageRef=None)