OSTF test for cinder-vmware role
Append test "Create volume and attach it to instance" for cinder-vmware role. Added BoolOpt 'cinder_vmware_node_exist' and it processing. Added img_name and **kwargs args for _create_boot_volume function in SmokeChecksTest class. Added img_name arg for _create_server function in SmokeChecksTest class. Closes-bug: #1431321 Implements: blueprint cinder-vmdk-role Change-Id: I9205b9200e9f3cfe293c734b6e76dc4be4a54f87
This commit is contained in:
parent
a4cf5f218c
commit
81fc5d657e
|
@ -258,6 +258,9 @@ VolumeGroup = [
|
|||
cfg.BoolOpt('cinder_node_exist',
|
||||
default=True,
|
||||
help="Allow to run tests if cinder exist"),
|
||||
cfg.BoolOpt('cinder_vmware_node_exist',
|
||||
default=True,
|
||||
help="Allow to run tests if cinder-vmware exist"),
|
||||
cfg.BoolOpt('ceph_exist',
|
||||
default=True,
|
||||
help="Allow to run tests if ceph exist"),
|
||||
|
@ -270,6 +273,9 @@ VolumeGroup = [
|
|||
cfg.StrOpt('backend2_name',
|
||||
default='BACKEND_2',
|
||||
help="Name of the backend2 (must be declared in cinder.conf)"),
|
||||
cfg.StrOpt('cinder_vmware_storage_az',
|
||||
default='vcenter',
|
||||
help="Name of storage availability zone for cinder-vmware."),
|
||||
]
|
||||
|
||||
|
||||
|
@ -537,6 +543,8 @@ class NailgunConfig(object):
|
|||
LOG.info('set proxy successful')
|
||||
self._parse_cluster_generated_data()
|
||||
LOG.info('parse generated successful')
|
||||
self._parse_vmware_attributes()
|
||||
LOG.info('parse vmware attributes successful')
|
||||
except exceptions.SetProxy as exc:
|
||||
raise exc
|
||||
except Exception:
|
||||
|
@ -604,6 +612,8 @@ class NailgunConfig(object):
|
|||
node['online'] is True, data)
|
||||
cinder_nodes = filter(lambda node: 'cinder' in node['roles'],
|
||||
data)
|
||||
cinder_vmware_nodes = filter(lambda node: 'cinder-vmware' in
|
||||
node['roles'], data)
|
||||
controller_ips = []
|
||||
conntroller_names = []
|
||||
public_ips = []
|
||||
|
@ -625,6 +635,8 @@ class NailgunConfig(object):
|
|||
self.compute.online_controllers = online_controllers_ips
|
||||
if not cinder_nodes:
|
||||
self.volume.cinder_node_exist = False
|
||||
if not cinder_vmware_nodes:
|
||||
self.volume.cinder_vmware_node_exist = False
|
||||
|
||||
compute_nodes = filter(lambda node: 'compute' in node['roles'],
|
||||
data)
|
||||
|
@ -680,6 +692,13 @@ class NailgunConfig(object):
|
|||
self.identity.url = data['horizon_url'] + 'dashboard'
|
||||
self.identity.uri = data['keystone_url'] + 'v2.0/'
|
||||
|
||||
def _parse_vmware_attributes(self):
|
||||
if self.volume.cinder_vmware_node_exist:
|
||||
api_url = '/api/clusters/%s/vmware_attributes' % self.cluster_id
|
||||
data = self.req_session.get(self.nailgun_url + api_url).json()
|
||||
az = data['editable']['value']['availability_zones'][0]['az_name']
|
||||
self.volume.cinder_vmware_storage_az = "{0}-cinder".format(az)
|
||||
|
||||
def find_proxy(self, ip):
|
||||
|
||||
endpoint = self.network.raw_data.get(
|
||||
|
|
|
@ -967,13 +967,15 @@ class SmokeChecksTest(OfficialClientTest):
|
|||
self.set_resource(name, role)
|
||||
return role
|
||||
|
||||
def _create_boot_volume(self, client):
|
||||
def _create_boot_volume(self, client, img_name=None, **kwargs):
|
||||
display_name = rand_name('ost1_test-bootable-volume')
|
||||
imageRef = self.get_image_from_name()
|
||||
|
||||
imageRef = self.get_image_from_name(img_name=img_name)
|
||||
|
||||
LOG.debug(
|
||||
'Image ref is {0} for volume {1}'.format(imageRef, display_name))
|
||||
return self._create_volume(
|
||||
client, display_name=display_name, imageRef=imageRef)
|
||||
client, display_name=display_name, imageRef=imageRef, **kwargs)
|
||||
|
||||
def create_instance_from_volume(self, client, volume):
|
||||
if not self.find_micro_flavor():
|
||||
|
@ -1012,12 +1014,14 @@ class SmokeChecksTest(OfficialClientTest):
|
|||
self.set_resource(name, server)
|
||||
return server
|
||||
|
||||
def _create_server(self, client):
|
||||
def _create_server(self, client, img_name=None):
|
||||
if not self.find_micro_flavor():
|
||||
self.fail("m1.micro flavor was not created.")
|
||||
|
||||
name = rand_name('ost1_test-volume-instance')
|
||||
base_image_id = self.get_image_from_name()
|
||||
|
||||
base_image_id = self.get_image_from_name(img_name=img_name)
|
||||
|
||||
if 'neutron' in self.config.network.network_provider:
|
||||
network = [net.id for net in
|
||||
self.compute_client.networks.list()
|
||||
|
|
|
@ -405,3 +405,123 @@ class TestVcenterImageAction(nmanager.SmokeChecksTest):
|
|||
self.verify(30, self._delete_server, 7,
|
||||
"Server can not be deleted.",
|
||||
"server deletion", server)
|
||||
|
||||
|
||||
class VcenterVolumesTest(nmanager.SmokeChecksTest):
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
super(VcenterVolumesTest, cls).setUpClass()
|
||||
if cls.manager.clients_initialized:
|
||||
cls.micro_flavors = cls.find_micro_flavor()
|
||||
|
||||
def setUp(self):
|
||||
super(VcenterVolumesTest, self).setUp()
|
||||
self.check_clients_state()
|
||||
if (not self.config.volume.cinder_vmware_node_exist):
|
||||
self.skipTest('There are no cinder-vmware nodes')
|
||||
self.check_image_exists()
|
||||
|
||||
@classmethod
|
||||
def tearDownClass(cls):
|
||||
super(VcenterVolumesTest, cls).tearDownClass()
|
||||
|
||||
def _wait_for_volume_status(self, volume, status):
|
||||
self.status_timeout(self.volume_client.volumes, volume.id, status)
|
||||
|
||||
def _wait_for_instance_status(self, server, status):
|
||||
self.status_timeout(self.compute_client.servers, server.id, status)
|
||||
|
||||
def test_5_vcenter_volume_create(self):
|
||||
"""vCenter: Create volume and attach it to instance
|
||||
Target component: Compute
|
||||
|
||||
Scenario:
|
||||
1. Create a new small-size volume.
|
||||
2. Wait for volume status to become "available".
|
||||
3. Check volume has correct name.
|
||||
4. Create new instance.
|
||||
5. Wait for "Active" status
|
||||
6. Attach volume to an instance.
|
||||
7. Check volume status is "in use".
|
||||
8. Get information on the created volume by its id.
|
||||
9. Detach volume from the instance.
|
||||
10. Check volume has "available" status.
|
||||
11. Delete volume.
|
||||
12. Verify that volume deleted
|
||||
13. Delete server.
|
||||
|
||||
Duration: 350 s.
|
||||
Available since release: 2014.2-6.1
|
||||
Deployment tags: nova_network, use_vcenter
|
||||
"""
|
||||
msg_s1 = 'Volume was not created.'
|
||||
img_name = 'TestVM-VMDK'
|
||||
az = self.config.volume.cinder_vmware_storage_az
|
||||
# Create volume
|
||||
volume = self.verify(120, self._create_volume, 1,
|
||||
msg_s1,
|
||||
"volume creation",
|
||||
self.volume_client, None, availability_zone=az)
|
||||
|
||||
self.verify(200, self._wait_for_volume_status, 2,
|
||||
msg_s1,
|
||||
"volume becoming 'available'",
|
||||
volume, 'available')
|
||||
|
||||
self.verify_response_true(
|
||||
volume.display_name.startswith('ostf-test-volume'),
|
||||
'Step 3 failed: {msg}'.format(msg=msg_s1))
|
||||
|
||||
# create instance
|
||||
instance = self.verify(200, self._create_server, 4,
|
||||
"Instance creation failed. ",
|
||||
"server creation",
|
||||
self.compute_client, img_name)
|
||||
|
||||
self.verify(200, self._wait_for_instance_status, 5,
|
||||
'Instance status did not become "available".',
|
||||
"instance becoming 'available'",
|
||||
instance, 'ACTIVE')
|
||||
|
||||
# Attach volume
|
||||
self.verify(120, self._attach_volume_to_instance, 6,
|
||||
'Volume couldn`t be attached.',
|
||||
'volume attachment',
|
||||
volume, instance.id)
|
||||
|
||||
self.verify(180, self._wait_for_volume_status, 7,
|
||||
'Attached volume status did not become "in-use".',
|
||||
"volume becoming 'in-use'",
|
||||
volume, 'in-use')
|
||||
|
||||
# get volume details
|
||||
self.verify(20, self.volume_client.volumes.get, 8,
|
||||
"Can not retrieve volume details. ",
|
||||
"retrieving volume details", volume.id)
|
||||
|
||||
# detach volume
|
||||
self.verify(50, self._detach_volume, 9,
|
||||
'Can not detach volume. ',
|
||||
"volume detachment",
|
||||
instance.id, volume.id)
|
||||
|
||||
self.verify(120, self._wait_for_volume_status, 10,
|
||||
'Volume status did not become "available".',
|
||||
"volume becoming 'available'",
|
||||
volume, 'available')
|
||||
|
||||
self.verify(50, self.volume_client.volumes.delete, 11,
|
||||
'Can not delete volume. ',
|
||||
"volume deletion",
|
||||
volume)
|
||||
|
||||
self.verify(50, self.verify_volume_deletion, 12,
|
||||
'Can not delete volume. ',
|
||||
"volume deletion",
|
||||
volume)
|
||||
|
||||
self.verify(30, self._delete_server, 13,
|
||||
"Can not delete server. ",
|
||||
"server deletion",
|
||||
instance)
|
||||
|
|
Loading…
Reference in New Issue