88 lines
3.3 KiB
Python
88 lines
3.3 KiB
Python
import unittest
|
|
import time
|
|
from boto.exception import EC2ResponseError
|
|
|
|
from boto.regioninfo import RegionInfo
|
|
import datetime
|
|
from novaclient.v1_1 import client
|
|
from boto import ec2
|
|
|
|
from ..credentials import get_nova_creds
|
|
from ..ec2driver_config import *
|
|
|
|
|
|
class EC2TestBase(unittest.TestCase):
|
|
@staticmethod
|
|
def sleep_if_ec2_not_mocked(seconds):
|
|
if not os.environ.get('MOCK_EC2'):
|
|
time.sleep(seconds)
|
|
|
|
def setUp(self):
|
|
print "Establishing connection with AWS"
|
|
|
|
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 = region,
|
|
is_secure=secure)
|
|
|
|
self.creds = get_nova_creds()
|
|
self.nova = client.Client(**self.creds)
|
|
|
|
# nova client for cinder
|
|
self.creds['service_type'] = 'volume'
|
|
self.nova_volume = client.Client(**self.creds)
|
|
|
|
self.servers = []
|
|
self.volumes = []
|
|
|
|
def tearDown(self):
|
|
print "Cleanup: Destroying the instance used for testing"
|
|
for instance in self.servers:
|
|
self.destroy_instance_and_release_elastic_ip(instance)
|
|
|
|
for volume in self.volumes:
|
|
volume.delete()
|
|
|
|
def spawn_ec2_instance(self):
|
|
print "aws_region: " + aws_region
|
|
print "time: " + str(datetime.datetime.now().time())
|
|
|
|
print "Spawning an instance"
|
|
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)
|
|
instance = self.nova.servers.get(server.id)
|
|
while instance.status != 'ACTIVE':
|
|
EC2TestBase.sleep_if_ec2_not_mocked(10)
|
|
instance = self.nova.servers.get(server.id)
|
|
self.servers.append(instance)
|
|
return instance, server.id
|
|
|
|
def destroy_instance_and_release_elastic_ip(self, instance):
|
|
instance.delete()
|
|
self.servers.remove(instance)
|
|
self._wait_for_instance_to_be_destroyed(instance.metadata['ec2_id'])
|
|
self._wait_for_elastic_ip_to_be_released(instance.metadata['public_ip_address'])
|
|
|
|
def _wait_for_elastic_ip_to_be_released(self, public_ip):
|
|
while True:
|
|
try:
|
|
print 'Waiting for EC2 elastic ip to be released...'
|
|
self.sleep_if_ec2_not_mocked(10)
|
|
eip = self.ec2_conn.get_all_addresses(public_ip)
|
|
except EC2ResponseError:
|
|
print 'Elastic ip released.'
|
|
break
|
|
|
|
def _wait_for_instance_to_be_destroyed(self, ec2_id):
|
|
ec2_instance = self.ec2_conn.get_only_instances(instance_ids=[ec2_id])[0]
|
|
# while ec2_instance.state not in ("shutting-down", "terminated"):
|
|
while ec2_instance.state != "terminated":
|
|
print 'Waiting for EC2 instance to shut down...'
|
|
self.sleep_if_ec2_not_mocked(10)
|
|
ec2_instance = self.ec2_conn.get_only_instances(instance_ids=[ec2_id])[0]
|
|
print 'Instance has been shut down.' |