# limitations under the License.
import logging
import os
+import re
import time
import unittest
import uuid
from snaps.openstack.create_security_group import SecurityGroupSettings, OpenStackSecurityGroup
from snaps.openstack.tests import openstack_tests, validation_utils
from snaps.openstack.utils import nova_utils
-from snaps.openstack.tests.os_source_file_test import OSComponentTestCase, OSIntegrationTestCase
+from snaps.openstack.tests.os_source_file_test import OSIntegrationTestCase
__author__ = 'spisarski'
VmInstanceSettings(config={'name': 'foo'})
def test_name_flavor_only(self):
- settings = VmInstanceSettings(name='foo', flavor='bar')
+ with self.assertRaises(Exception):
+ VmInstanceSettings(name='foo', flavor='bar')
+
+ def test_config_with_name_flavor_only(self):
+ with self.assertRaises(Exception):
+ VmInstanceSettings(config={'name': 'foo', 'flavor': 'bar'})
+
+ def test_name_flavor_port_only(self):
+ port_settings = PortSettings(name='foo-port', network_name='bar-net')
+ settings = VmInstanceSettings(name='foo', flavor='bar', port_settings=[port_settings])
self.assertEquals('foo', settings.name)
self.assertEquals('bar', settings.flavor)
- self.assertEquals(0, len(settings.port_settings))
+ self.assertEquals(1, len(settings.port_settings))
+ self.assertEquals('foo-port', settings.port_settings[0].name)
+ self.assertEquals('bar-net', settings.port_settings[0].network_name)
self.assertEquals(0, len(settings.security_group_names))
self.assertEquals(0, len(settings.floating_ip_settings))
self.assertIsNone(settings.sudo_user)
self.assertEquals(180, settings.ssh_connect_timeout)
self.assertIsNone(settings.availability_zone)
- def test_config_with_name_flavor_only(self):
- settings = VmInstanceSettings(config={'name': 'foo', 'flavor': 'bar'})
+ def test_config_with_name_flavor_port_only(self):
+ port_settings = PortSettings(name='foo-port', network_name='bar-net')
+ settings = VmInstanceSettings(config={'name': 'foo', 'flavor': 'bar', 'ports': [port_settings]})
self.assertEquals('foo', settings.name)
self.assertEquals('bar', settings.flavor)
- self.assertEquals(0, len(settings.port_settings))
+ self.assertEquals(1, len(settings.port_settings))
+ self.assertEquals('foo-port', settings.port_settings[0].name)
+ self.assertEquals('bar-net', settings.port_settings[0].network_name)
self.assertEquals(0, len(settings.security_group_names))
self.assertEquals(0, len(settings.floating_ip_settings))
self.assertIsNone(settings.sudo_user)
self.floating_ip_name = guid + 'fip1'
# Initialize for tearDown()
- self.image_creator = None
+ self.image_creators = list()
self.network_creator = None
self.flavor_creator = None
self.inst_creator = None
self.port_settings = PortSettings(
name=self.port_1_name, network_name=self.priv_net_config.network_settings.name)
+ # set the default image settings, then set any custom parameters sent from the app
self.os_image_settings = openstack_tests.cirros_url_image(name=guid + '-image')
+ if self.image_metadata:
+ if self.image_metadata['disk_url']:
+ self.os_image_settings.url = self.image_metadata['disk_url']
+ if self.image_metadata['extra_properties']:
+ self.os_image_settings.extra_properties = self.image_metadata['extra_properties']
+
try:
- # Create Image
- self.image_creator = OpenStackImage(self.os_creds, self.os_image_settings)
- self.image_creator.create()
+ # Create Image; if this is a 3-part image create the kernel and ramdisk images first
+ if self.image_metadata:
+ if self.image_metadata['kernel_url']:
+ kernel_image_settings = openstack_tests.cirros_url_image(
+ name=self.os_image_settings.name+'_kernel', url=self.image_metadata['kernel_url'])
+ self.image_creators.append(OpenStackImage(self.os_creds, kernel_image_settings))
+ kernel_image = self.image_creators[-1].create()
+ self.os_image_settings.extra_properties['kernel_id'] = kernel_image.id
+
+ if self.image_metadata['ramdisk_url']:
+ ramdisk_image_settings = openstack_tests.cirros_url_image(
+ name=self.os_image_settings.name+'_ramdisk', url=self.image_metadata['ramdisk_url'])
+ self.image_creators.append(OpenStackImage(self.os_creds, ramdisk_image_settings))
+ ramdisk_image = self.image_creators[-1].create()
+ self.os_image_settings.extra_properties['ramdisk_id'] = ramdisk_image.id
+
+ self.image_creators.append(OpenStackImage(self.os_creds, self.os_image_settings))
+ self.image_creators[-1].create()
# Create Network
self.network_creator = OpenStackNetwork(self.os_creds, self.priv_net_config.network_settings)
# Create Flavor
self.flavor_creator = OpenStackFlavor(
self.admin_os_creds,
- FlavorSettings(name=guid + '-flavor-name', ram=1024, disk=10, vcpus=1))
+ FlavorSettings(name=guid + '-flavor-name', ram=1024, disk=10, vcpus=1, metadata=self.flavor_metadata))
self.flavor_creator.create()
except Exception as e:
self.tearDown()
if self.flavor_creator:
try:
self.flavor_creator.clean()
- except Exception as e:
- logger.error('Unexpected exception cleaning flavor with message - ' + e.message)
-
- if self.network_creator:
- try:
- self.network_creator.clean()
except Exception as e:
logger.error('Unexpected exception cleaning network with message - ' + e.message)
- if self.image_creator:
+ if self.image_creators:
try:
- self.image_creator.clean()
+ while self.image_creators:
+ self.image_creators[-1].clean()
+ self.image_creators.pop()
except Exception as e:
logger.error('Unexpected exception cleaning image with message - ' + e.message)
instance_settings = VmInstanceSettings(
name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[self.port_settings])
- self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings)
+ self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creators[-1].image_settings)
vm = self.inst_creator.create()
ip = self.inst_creator.get_port_ip(self.port_settings.name)
self.assertTrue(self.inst_creator.vm_active(block=True))
found = False
- timeout = 100
+ timeout = 160
start_time = time.time()
- match_value = 'Lease of ' + ip + ' obtained,'
+ match_value = 'Lease of.*obtained'
+ logger.info("Looking for expression %s in the console log" % match_value)
while timeout > time.time() - start_time:
output = vm.get_console_output()
- if match_value in output:
- found = True
+ if re.search(match_value, output):
+ logger.info('DHCP lease obtained logged in console')
+ if ip in output:
+ logger.info('With correct IP address')
+ found = True
+ else:
+ logger.error('With incorrect IP address')
break
+
self.assertTrue(found)
self.nova = nova_utils.nova_client(self.os_creds)
self.os_image_settings = openstack_tests.cirros_url_image(name=guid + '-image')
+ net_config = openstack_tests.get_priv_net_config(
+ net_name=guid + '-pub-net', subnet_name=guid + '-pub-subnet',
+ router_name=guid + '-pub-router', external_net=self.ext_net_name)
+
# Initialize for tearDown()
self.image_creator = None
self.flavor_creator = None
+
+ self.net_creator = None
self.inst_creator = None
try:
# Create Image
self.image_creator = OpenStackImage(self.os_creds, self.os_image_settings)
self.image_creator.create()
+
# Create Flavor
self.flavor_creator = OpenStackFlavor(
self.admin_os_creds,
- FlavorSettings(name=guid + '-flavor-name', ram=2048, disk=10, vcpus=2))
+ FlavorSettings(name=guid + '-flavor-name', ram=2048, disk=10, vcpus=2, metadata=self.flavor_metadata))
self.flavor_creator.create()
+
+ # Create Network
+ self.network_creator = OpenStackNetwork(self.os_creds, net_config.network_settings)
+ self.network_creator.create()
+
+ self.port_settings = PortSettings(name=guid + '-port',
+ network_name=net_config.network_settings.name)
+
except Exception as e:
self.tearDown()
raise e
except Exception as e:
logger.error('Unexpected exception cleaning flavor with message - ' + e.message)
+ if self.net_creator:
+ try:
+ self.net_creator.clean()
+ except Exception as e:
+ logger.error('Unexpected exception cleaning network with message - ' + e.message)
+
if self.image_creator:
try:
self.image_creator.clean()
"""
Tests the creation of an OpenStack instance with a single port with a static IP without a Floating IP.
"""
- instance_settings = VmInstanceSettings(name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name)
+ instance_settings = VmInstanceSettings(name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name,
+ port_settings=[self.port_settings])
self.inst_creator = OpenStackVmInstance(
self.os_creds, instance_settings, self.image_creator.image_settings)
# Create Flavor
self.flavor_creator = OpenStackFlavor(
self.admin_os_creds,
- FlavorSettings(name=guid + '-flavor-name', ram=2048, disk=10, vcpus=2))
+ FlavorSettings(name=guid + '-flavor-name', ram=2048, disk=10, vcpus=2, metadata=self.flavor_metadata))
self.flavor_creator.create()
self.keypair_creator = OpenStackKeypair(
self.assertTrue(inst_creator.vm_active(block=True))
self.assertEquals(vm_inst, inst_creator.get_vm_inst())
- validate_ssh_client(inst_creator)
+ self.assertTrue(validate_ssh_client(inst_creator))
def test_ssh_client_fip_after_active(self):
"""
self.assertTrue(inst_creator.vm_active(block=True))
self.assertEquals(vm_inst, inst_creator.get_vm_inst())
- validate_ssh_client(inst_creator)
+ self.assertTrue(validate_ssh_client(inst_creator))
# TODO - Determine how allowed_address_pairs is supposed to operate before continuing this test
# see http://docs.openstack.org/developer/dragonflow/specs/allowed_address_pairs.html for a functional description
# Create Flavor
self.flavor_creator = OpenStackFlavor(
self.admin_os_creds,
- FlavorSettings(name=guid + '-flavor-name', ram=2048, disk=10, vcpus=2))
+ FlavorSettings(name=guid + '-flavor-name', ram=2048, disk=10, vcpus=2, metadata=self.flavor_metadata))
self.flavor_creator.create()
except Exception as e:
self.tearDown()
self.inst_creator.create()
-class CreateInstanceOnComputeHost(OSComponentTestCase):
+class CreateInstanceOnComputeHost(OSIntegrationTestCase):
"""
Test for the CreateInstance where one VM is deployed to each compute node
"""
Instantiates the CreateImage object that is responsible for downloading and creating an OS image file
within OpenStack
"""
+ super(self.__class__, self).__start__()
+
guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
self.vm_inst_name = guid + '-inst'
self.port_base_name = guid + 'port'
try:
# Create Network
- self.network_creator = OpenStackNetwork(self.os_creds, self.priv_net_config.network_settings)
+ self.network_creator = OpenStackNetwork(self.admin_os_creds, self.priv_net_config.network_settings)
self.network_creator.create()
# Create Flavor
self.flavor_creator = OpenStackFlavor(
- self.os_creds,
- FlavorSettings(name=guid + '-flavor-name', ram=512, disk=1, vcpus=1))
+ self.admin_os_creds,
+ FlavorSettings(name=guid + '-flavor-name', ram=512, disk=1, vcpus=1, metadata=self.flavor_metadata))
self.flavor_creator.create()
# Create Image
- self.image_creator = OpenStackImage(self.os_creds, self.os_image_settings)
+ self.image_creator = OpenStackImage(self.admin_os_creds, self.os_image_settings)
self.image_creator.create()
except Exception as e:
except Exception as e:
logger.error('Unexpected exception cleaning image with message - ' + e.message)
+ super(self.__class__, self).__clean__()
+
def test_deploy_vm_to_each_compute_node(self):
"""
Tests the creation of OpenStack VM instances to each compute node.
"""
from snaps.openstack.utils import nova_utils
- nova = nova_utils.nova_client(self.os_creds)
+ nova = nova_utils.nova_client(self.admin_os_creds)
zones = nova_utils.get_nova_availability_zones(nova)
# Create Instance on each server/zone
name=inst_name, flavor=self.flavor_creator.flavor_settings.name, availability_zone=zone,
port_settings=[port_settings])
inst_creator = OpenStackVmInstance(
- self.os_creds, instance_settings, self.image_creator.image_settings)
+ self.admin_os_creds, instance_settings, self.image_creator.image_settings)
self.inst_creators.append(inst_creator)
inst_creator.create()
# Create Flavor
self.flavor_creator = OpenStackFlavor(
self.admin_os_creds,
- FlavorSettings(name=self.guid + '-flavor-name', ram=2048, disk=10, vcpus=2))
+ FlavorSettings(name=self.guid + '-flavor-name', ram=2048, disk=10, vcpus=2,
+ metadata=self.flavor_metadata))
self.flavor_creator.create()
# Create Keypair
self.nova = nova_utils.nova_client(self.os_creds)
self.os_image_settings = openstack_tests.cirros_url_image(name=self.guid + '-image')
- self.keypair_priv_filepath = 'tmp/' + self.guid
- self.keypair_pub_filepath = self.keypair_priv_filepath + '.pub'
- self.keypair_name = self.guid + '-kp'
self.vm_inst_name = self.guid + '-inst'
self.port_1_name = self.guid + 'port-1'
self.port_2_name = self.guid + 'port-2'
self.floating_ip_name = self.guid + 'fip1'
- self.pub_net_config = openstack_tests.get_pub_net_config(
+ net_config = openstack_tests.get_priv_net_config(
net_name=self.guid + '-pub-net', subnet_name=self.guid + '-pub-subnet',
router_name=self.guid + '-pub-router', external_net=self.ext_net_name)
# Initialize for tearDown()
self.image_creator = None
- self.keypair_creator = None
self.flavor_creator = None
self.network_creator = None
self.router_creator = None
self.image_creator.create()
# Create Network
- self.network_creator = OpenStackNetwork(self.os_creds, self.pub_net_config.network_settings)
+ self.network_creator = OpenStackNetwork(self.os_creds, net_config.network_settings)
self.network_creator.create()
- # Create Router
- self.router_creator = OpenStackRouter(self.os_creds, self.pub_net_config.router_settings)
- self.router_creator.create()
-
# Create Flavor
self.flavor_creator = OpenStackFlavor(
self.admin_os_creds,
- FlavorSettings(name=self.guid + '-flavor-name', ram=2048, disk=10, vcpus=2))
+ FlavorSettings(name=self.guid + '-flavor-name', ram=2048, disk=10, vcpus=2,
+ metadata=self.flavor_metadata))
self.flavor_creator.create()
- self.keypair_creator = OpenStackKeypair(
- self.os_creds, KeypairSettings(
- name=self.keypair_name, public_filepath=self.keypair_pub_filepath,
- private_filepath=self.keypair_priv_filepath))
- self.keypair_creator.create()
+ self.port_settings = PortSettings(name=self.guid + '-port',
+ network_name=net_config.network_settings.name)
except Exception as e:
self.tearDown()
raise e
except Exception as e:
logger.error('Unexpected exception cleaning security group with message - ' + e.message)
- if self.keypair_creator:
- try:
- self.keypair_creator.clean()
- except Exception as e:
- logger.error('Unexpected exception cleaning keypair with message - ' + e.message)
-
- if os.path.isfile(self.keypair_pub_filepath):
- os.remove(self.keypair_pub_filepath)
-
- if os.path.isfile(self.keypair_priv_filepath):
- os.remove(self.keypair_priv_filepath)
-
if self.flavor_creator:
try:
self.flavor_creator.clean()
except Exception as e:
logger.error('Unexpected exception cleaning flavor with message - ' + e.message)
- if self.router_creator:
- try:
- self.router_creator.clean()
- except Exception as e:
- logger.error('Unexpected exception cleaning router with message - ' + e.message)
-
if self.network_creator:
try:
self.network_creator.clean()
"""
# Create instance
instance_settings = VmInstanceSettings(
- name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name)
+ name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[self.port_settings])
self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings)
- vm_inst = self.inst_creator.create()
+ vm_inst = self.inst_creator.create(block=True)
self.assertIsNotNone(vm_inst)
# Create security group object to add to instance
"""
# Create instance
instance_settings = VmInstanceSettings(
- name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name)
+ name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[self.port_settings])
self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings)
- vm_inst = self.inst_creator.create()
+ vm_inst = self.inst_creator.create(block=True)
self.assertIsNotNone(vm_inst)
# Create security group object to add to instance
# Create instance
instance_settings = VmInstanceSettings(
name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name,
- security_group_names=[sec_grp_settings.name])
+ security_group_names=[sec_grp_settings.name], port_settings=[self.port_settings])
self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings)
- vm_inst = self.inst_creator.create()
+ vm_inst = self.inst_creator.create(block=True)
self.assertIsNotNone(vm_inst)
# Check that group has been added
# Create instance
instance_settings = VmInstanceSettings(
- name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name)
+ name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[self.port_settings])
self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings)
- vm_inst = self.inst_creator.create()
+ vm_inst = self.inst_creator.create(block=True)
self.assertIsNotNone(vm_inst)
# Check that group has been added
- self.assertFalse(inst_has_sec_grp(vm_inst, sec_grp_settings.name))
+ self.assertFalse(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
# Add security group to instance after activated
self.assertFalse(self.inst_creator.remove_security_group(sec_grp))
# Create instance
instance_settings = VmInstanceSettings(
name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name,
- security_group_names=[sec_grp_settings.name])
+ security_group_names=[sec_grp_settings.name], port_settings=[self.port_settings])
self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings)
- vm_inst = self.inst_creator.create()
+ vm_inst = self.inst_creator.create(block=True)
self.assertIsNotNone(vm_inst)
# Check that group has been added
- self.assertTrue(inst_has_sec_grp(vm_inst, sec_grp_settings.name))
+ self.assertTrue(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
# Add security group to instance after activated
self.assertTrue(self.inst_creator.add_security_group(sec_grp))
return True
return False
+
+
+class CreateInstanceFromThreePartImage(OSIntegrationTestCase):
+ """
+ Test for the CreateInstance class for creating an image from a 3-part image
+ """
+
+ def setUp(self):
+ """
+ Instantiates the CreateImage object that is responsible for downloading and creating an OS image file
+ within OpenStack
+ """
+ super(self.__class__, self).__start__()
+
+ guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
+ self.image_name = guid
+ self.vm_inst_name = guid + '-inst'
+ self.nova = nova_utils.nova_client(self.os_creds)
+
+ net_config = openstack_tests.get_priv_net_config(
+ net_name=guid + '-pub-net', subnet_name=guid + '-pub-subnet',
+ router_name=guid + '-pub-router', external_net=self.ext_net_name)
+
+ # Initialize for tearDown()
+ self.image_creators = list()
+ self.network_creator = None
+ self.flavor_creator = None
+ self.inst_creator = None
+
+ try:
+ # Create Images
+ # Create the kernel image
+ kernel_image_settings = openstack_tests.cirros_url_image(
+ name=self.image_name+'_kernel',
+ url='http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-kernel')
+ self.image_creators.append(OpenStackImage(self.os_creds, kernel_image_settings))
+ kernel_image = self.image_creators[-1].create()
+
+ # Create the ramdisk image
+ ramdisk_image_settings = openstack_tests.cirros_url_image(
+ name=self.image_name+'_ramdisk',
+ url='http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-initramfs')
+ self.image_creators.append(OpenStackImage(self.os_creds, ramdisk_image_settings))
+ ramdisk_image = self.image_creators[-1].create()
+ self.assertIsNotNone(ramdisk_image)
+
+ # Create the main image
+ os_image_settings = openstack_tests.cirros_url_image(
+ name=self.image_name,
+ url='http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img')
+ properties = dict()
+ properties['kernel_id'] = kernel_image.id
+ properties['ramdisk_id'] = ramdisk_image.id
+ os_image_settings.extra_properties = properties
+ self.image_creators.append(OpenStackImage(self.os_creds, os_image_settings))
+ created_image = self.image_creators[-1].create()
+ self.assertIsNotNone(created_image)
+
+ # Create Flavor
+ self.flavor_creator = OpenStackFlavor(
+ self.admin_os_creds,
+ FlavorSettings(name=guid + '-flavor-name', ram=2048, disk=10, vcpus=2, metadata=self.flavor_metadata))
+ self.flavor_creator.create()
+
+ # Create Network
+ self.network_creator = OpenStackNetwork(self.os_creds, net_config.network_settings)
+ self.network_creator.create()
+
+ self.port_settings = PortSettings(name=guid + '-port',
+ network_name=net_config.network_settings.name)
+ except Exception as e:
+ self.tearDown()
+ raise e
+
+ def tearDown(self):
+ """
+ Cleans the created object
+ """
+ if self.inst_creator:
+ try:
+ self.inst_creator.clean()
+ except Exception as e:
+ logger.error('Unexpected exception cleaning VM instance with message - ' + e.message)
+
+ if self.flavor_creator:
+ try:
+ self.flavor_creator.clean()
+ except Exception as e:
+ logger.error('Unexpected exception cleaning flavor with message - ' + e.message)
+
+ if self.network_creator:
+ try:
+ self.network_creator.clean()
+ except Exception as e:
+ logger.error('Unexpected exception cleaning network with message - ' + e.message)
+
+ if self.image_creators:
+ try:
+ while self.image_creators:
+ self.image_creators[0].clean()
+ self.image_creators.pop(0)
+ except Exception as e:
+ logger.error('Unexpected exception cleaning image with message - ' + e.message)
+
+ super(self.__class__, self).__clean__()
+
+ def test_create_delete_instance_from_three_part_image(self):
+ """
+ Tests the creation of an OpenStack instance from a 3-part image.
+ """
+ instance_settings = VmInstanceSettings(name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name,
+ port_settings=[self.port_settings])
+
+ # The last created image is the main image from which we create the instance
+ self.inst_creator = OpenStackVmInstance(
+ self.os_creds, instance_settings, self.image_creators[-1].image_settings)
+
+ vm_inst = self.inst_creator.create()
+ self.assertEquals(1, len(nova_utils.get_servers_by_name(self.nova, instance_settings.name)))
+
+ # Delete instance
+ nova_utils.delete_vm_instance(self.nova, vm_inst)
+
+ self.assertTrue(self.inst_creator.vm_deleted(block=True))
+ self.assertEquals(0, len(nova_utils.get_servers_by_name(self.nova, instance_settings.name)))
+
+ # Exception should not be thrown
+ self.inst_creator.clean()