Add next tests:
* create instance with verification of network cannectivity * create / attach volume Change base module for sanity networks test: change request list admin from iuser to admin
This commit is contained in:
parent
e028b37b70
commit
1e6f63d5e0
|
@ -25,7 +25,7 @@ username = admin
|
||||||
# The above non-administrative user's password
|
# The above non-administrative user's password
|
||||||
password = nova
|
password = nova
|
||||||
# The above non-administrative user's tenant name
|
# The above non-administrative user's tenant name
|
||||||
tenant_name = service
|
tenant_name = admin
|
||||||
|
|
||||||
# This should be the username of an alternate user WITHOUT
|
# This should be the username of an alternate user WITHOUT
|
||||||
# administrative privileges
|
# administrative privileges
|
||||||
|
@ -196,7 +196,7 @@ public_network_id = eeb739fc-97a0-46b3-b8b9-12212b8247c4
|
||||||
# A shared public router would commonly be used where IP namespaces
|
# A shared public router would commonly be used where IP namespaces
|
||||||
# were disabled. If namespaces are enabled, it would be preferable
|
# were disabled. If namespaces are enabled, it would be preferable
|
||||||
# for each tenant to have their own router.
|
# for each tenant to have their own router.
|
||||||
public_router_id =
|
public_router_id = 30dc6a2e-d22e-48e5-8fa3-34a7d501d673
|
||||||
|
|
||||||
# Whether or not quantum is expected to be available
|
# Whether or not quantum is expected to be available
|
||||||
quantum_available = true
|
quantum_available = true
|
||||||
|
|
|
@ -68,3 +68,18 @@ class FuelTestAssertMixin(object):
|
||||||
if content in body:
|
if content in body:
|
||||||
return
|
return
|
||||||
self.assertTrue(content in body, msg)
|
self.assertTrue(content in body, msg)
|
||||||
|
|
||||||
|
def verify_response_body_content(self, exp_content, act_content, msg):
|
||||||
|
"""
|
||||||
|
Method provides human readable message for the verification
|
||||||
|
if the content value ib body is the same as expected
|
||||||
|
|
||||||
|
:param exp_content: expected value
|
||||||
|
:param act_content: actual content that is present in the body
|
||||||
|
:param msg: message to be used instead the default one
|
||||||
|
"""
|
||||||
|
self.assertEquals(exp_content,
|
||||||
|
act_content,
|
||||||
|
''.join(('Actual value - {actual_content}'.format(
|
||||||
|
actual_content=act_content),
|
||||||
|
'\n', msg)))
|
||||||
|
|
|
@ -230,11 +230,10 @@ class NetworkScenarioTest(OfficialClientTest):
|
||||||
def _create_keypair(self, client, namestart='ost1_test-keypair-smoke-'):
|
def _create_keypair(self, client, namestart='ost1_test-keypair-smoke-'):
|
||||||
kp_name = rand_name(namestart)
|
kp_name = rand_name(namestart)
|
||||||
keypair = client.keypairs.create(kp_name)
|
keypair = client.keypairs.create(kp_name)
|
||||||
try:
|
self.verify_response_body_content(keypair.id,
|
||||||
self.assertEqual(keypair.id, kp_name)
|
kp_name,
|
||||||
self.set_resource(kp_name, keypair)
|
'Creation of keypair failed')
|
||||||
except AttributeError:
|
self.set_resource(kp_name, keypair)
|
||||||
self.fail("Keypair object not successfully created.")
|
|
||||||
return keypair
|
return keypair
|
||||||
|
|
||||||
def _create_security_group(self, client, namestart='ost1_test-secgroup-smoke-'):
|
def _create_security_group(self, client, namestart='ost1_test-secgroup-smoke-'):
|
||||||
|
@ -242,12 +241,13 @@ class NetworkScenarioTest(OfficialClientTest):
|
||||||
sg_name = rand_name(namestart)
|
sg_name = rand_name(namestart)
|
||||||
sg_desc = sg_name + " description"
|
sg_desc = sg_name + " description"
|
||||||
secgroup = client.security_groups.create(sg_name, sg_desc)
|
secgroup = client.security_groups.create(sg_name, sg_desc)
|
||||||
try:
|
self.verify_response_body_content(secgroup.name,
|
||||||
self.assertEqual(secgroup.name, sg_name)
|
sg_name,
|
||||||
self.assertEqual(secgroup.description, sg_desc)
|
"Security group creation failed")
|
||||||
self.set_resource(sg_name, secgroup)
|
self.verify_response_body_content(secgroup.description,
|
||||||
except AttributeError:
|
sg_desc,
|
||||||
self.fail("SecurityGroup object not successfully created.")
|
"Security group creation failed")
|
||||||
|
self.set_resource(sg_name, secgroup)
|
||||||
|
|
||||||
# Add rules to the security group
|
# Add rules to the security group
|
||||||
|
|
||||||
|
@ -290,8 +290,9 @@ class NetworkScenarioTest(OfficialClientTest):
|
||||||
result = self.network_client.create_network(body=body)
|
result = self.network_client.create_network(body=body)
|
||||||
network = net_common.DeletableNetwork(client=self.network_client,
|
network = net_common.DeletableNetwork(client=self.network_client,
|
||||||
**result['network'])
|
**result['network'])
|
||||||
self.assertEqual(network.name, name)
|
self.verify_response_body_content(network.name,
|
||||||
self.set_resource(name, network)
|
name,
|
||||||
|
"Network creation failed")
|
||||||
return network
|
return network
|
||||||
|
|
||||||
def _list_networks(self):
|
def _list_networks(self):
|
||||||
|
@ -335,7 +336,9 @@ class NetworkScenarioTest(OfficialClientTest):
|
||||||
self.assertIsNotNone(result, 'Unable to allocate tenant network')
|
self.assertIsNotNone(result, 'Unable to allocate tenant network')
|
||||||
subnet = net_common.DeletableSubnet(client=self.network_client,
|
subnet = net_common.DeletableSubnet(client=self.network_client,
|
||||||
**result['subnet'])
|
**result['subnet'])
|
||||||
self.assertEqual(subnet.cidr, str(subnet_cidr))
|
self.verify_response_body_content(subnet.cidr,
|
||||||
|
str(subnet_cidr),
|
||||||
|
"Sub-net creation failed")
|
||||||
self.set_resource(rand_name(namestart), subnet)
|
self.set_resource(rand_name(namestart), subnet)
|
||||||
return subnet
|
return subnet
|
||||||
|
|
||||||
|
@ -364,11 +367,10 @@ class NetworkScenarioTest(OfficialClientTest):
|
||||||
}
|
}
|
||||||
server = client.servers.create(name, base_image_id, flavor_id,
|
server = client.servers.create(name, base_image_id, flavor_id,
|
||||||
**create_kwargs)
|
**create_kwargs)
|
||||||
try:
|
self.verify_response_body_content(server.name,
|
||||||
self.assertEqual(server.name, name)
|
name,
|
||||||
self.set_resource(name, server)
|
"Instance creation failed")
|
||||||
except AttributeError:
|
self.set_resource(name, server)
|
||||||
self.fail("Server not successfully created.")
|
|
||||||
self.status_timeout(client.servers, server.id, 'ACTIVE')
|
self.status_timeout(client.servers, server.id, 'ACTIVE')
|
||||||
# The instance retrieved on creation is missing network
|
# The instance retrieved on creation is missing network
|
||||||
# details, necessitating retrieval after it becomes active to
|
# details, necessitating retrieval after it becomes active to
|
||||||
|
@ -380,8 +382,10 @@ class NetworkScenarioTest(OfficialClientTest):
|
||||||
def _create_floating_ip(self, server, external_network_id):
|
def _create_floating_ip(self, server, external_network_id):
|
||||||
result = self.network_client.list_ports(device_id=server.id)
|
result = self.network_client.list_ports(device_id=server.id)
|
||||||
ports = result.get('ports', [])
|
ports = result.get('ports', [])
|
||||||
self.assertEqual(len(ports), 1,
|
self.verify_response_body_content(len(ports), 1,
|
||||||
"Unable to determine which port to target.")
|
("Unable to determine "
|
||||||
|
"which port to target."))
|
||||||
|
|
||||||
port_id = ports[0]['id']
|
port_id = ports[0]['id']
|
||||||
body = dict(
|
body = dict(
|
||||||
floatingip=dict(
|
floatingip=dict(
|
||||||
|
|
|
@ -2,9 +2,9 @@ import netaddr
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from fuel_health import clients
|
from fuel_health import clients
|
||||||
from fuel_health import exceptions
|
|
||||||
from fuel_health.common import log as logging
|
from fuel_health.common import log as logging
|
||||||
from fuel_health.common.utils.data_utils import rand_name
|
from fuel_health.common.utils.data_utils import rand_name
|
||||||
|
from fuel_health import exceptions
|
||||||
import fuel_health.test
|
import fuel_health.test
|
||||||
from fuel_health.tests import smoke
|
from fuel_health.tests import smoke
|
||||||
|
|
||||||
|
@ -57,6 +57,7 @@ class BaseComputeTest(fuel_health.test.BaseTestCase):
|
||||||
cls.network_client = os.config.network
|
cls.network_client = os.config.network
|
||||||
|
|
||||||
cls.servers = []
|
cls.servers = []
|
||||||
|
cls.volumes = []
|
||||||
|
|
||||||
cls.servers_client_v3_auth = os.servers_client_v3_auth
|
cls.servers_client_v3_auth = os.servers_client_v3_auth
|
||||||
|
|
||||||
|
@ -157,9 +158,23 @@ class BaseComputeTest(fuel_health.test.BaseTestCase):
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def clear_volumes(cls):
|
||||||
|
for volume in cls.volumes:
|
||||||
|
try:
|
||||||
|
cls.volumes_client.delete_volume(volume['id'])
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
for volume in cls.volumes:
|
||||||
|
try:
|
||||||
|
cls.volumes_client.wait_for_resource_deletion(volume['id'])
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def create_server(cls, **kwargs):
|
def create_server(cls, **kwargs):
|
||||||
"""Wrapper utility that returns a test server."""
|
"""Wrapper utility that returns a test server."""
|
||||||
|
name = rand_name('ost1_test-' + '-instance' + cls.__name__ )
|
||||||
name = rand_name("ost1_test-" + cls.__name__ + "-instance")
|
name = rand_name("ost1_test-" + cls.__name__ + "-instance")
|
||||||
if 'name' in kwargs:
|
if 'name' in kwargs:
|
||||||
name = kwargs.pop('name')
|
name = kwargs.pop('name')
|
||||||
|
@ -189,6 +204,7 @@ class BaseComputeTest(fuel_health.test.BaseTestCase):
|
||||||
def tearDownClass(cls):
|
def tearDownClass(cls):
|
||||||
cls.clear_servers()
|
cls.clear_servers()
|
||||||
cls.clear_isolated_creds()
|
cls.clear_isolated_creds()
|
||||||
|
cls.clear_volumes()
|
||||||
|
|
||||||
def wait_for(self, condition):
|
def wait_for(self, condition):
|
||||||
"""Repeatedly calls condition() until a timeout."""
|
"""Repeatedly calls condition() until a timeout."""
|
||||||
|
|
|
@ -131,7 +131,9 @@ class TestNetwork(nmanager.NetworkScenarioTest):
|
||||||
result = self.network_client.create_router(body=body)
|
result = self.network_client.create_router(body=body)
|
||||||
router = net_common.DeletableRouter(client=self.network_client,
|
router = net_common.DeletableRouter(client=self.network_client,
|
||||||
**result['router'])
|
**result['router'])
|
||||||
self.assertEqual(router.name, name)
|
self.verify_response_body_content(router.name,
|
||||||
|
name,
|
||||||
|
"Router creation failed")
|
||||||
self.set_resource(name, router)
|
self.set_resource(name, router)
|
||||||
return router
|
return router
|
||||||
|
|
||||||
|
@ -167,21 +169,35 @@ class TestNetwork(nmanager.NetworkScenarioTest):
|
||||||
seen_names = [n['name'] for n in seen_nets]
|
seen_names = [n['name'] for n in seen_nets]
|
||||||
seen_ids = [n['id'] for n in seen_nets]
|
seen_ids = [n['id'] for n in seen_nets]
|
||||||
for mynet in self.networks:
|
for mynet in self.networks:
|
||||||
self.assertIn(mynet.name, seen_names)
|
self.verify_response_body(seen_names,
|
||||||
self.assertIn(mynet.id, seen_ids)
|
mynet.name,
|
||||||
|
('Network is not created '
|
||||||
|
'properly'))
|
||||||
|
self.verify_response_body(seen_ids,
|
||||||
|
mynet.id,
|
||||||
|
('Network does is created'
|
||||||
|
' properly '))
|
||||||
seen_subnets = self._list_subnets()
|
seen_subnets = self._list_subnets()
|
||||||
seen_net_ids = [n['network_id'] for n in seen_subnets]
|
seen_net_ids = [n['network_id'] for n in seen_subnets]
|
||||||
seen_subnet_ids = [n['id'] for n in seen_subnets]
|
seen_subnet_ids = [n['id'] for n in seen_subnets]
|
||||||
for mynet in self.networks:
|
for mynet in self.networks:
|
||||||
self.assertIn(mynet.id, seen_net_ids)
|
self.verify_response_body(seen_net_ids,
|
||||||
|
mynet.id,
|
||||||
|
'Network is not created properly')
|
||||||
for mysubnet in self.subnets:
|
for mysubnet in self.subnets:
|
||||||
self.assertIn(mysubnet.id, seen_subnet_ids)
|
self.verify_response_body(seen_subnet_ids,
|
||||||
|
mysubnet.id,
|
||||||
|
'Sub-net is not created properly')
|
||||||
seen_routers = self._list_routers()
|
seen_routers = self._list_routers()
|
||||||
seen_router_ids = [n['id'] for n in seen_routers]
|
seen_router_ids = [n['id'] for n in seen_routers]
|
||||||
seen_router_names = [n['name'] for n in seen_routers]
|
seen_router_names = [n['name'] for n in seen_routers]
|
||||||
for myrouter in self.routers:
|
for myrouter in self.routers:
|
||||||
self.assertIn(myrouter.name, seen_router_names)
|
self.verify_response_body(seen_router_names,
|
||||||
self.assertIn(myrouter.id, seen_router_ids)
|
myrouter.name,
|
||||||
|
'Router is not created properly')
|
||||||
|
self.verify_response_body(seen_router_ids,
|
||||||
|
myrouter.id,
|
||||||
|
'Router is not created properly')
|
||||||
|
|
||||||
@attr(type=['fuel', 'smoke'])
|
@attr(type=['fuel', 'smoke'])
|
||||||
def test_005_create_servers(self):
|
def test_005_create_servers(self):
|
||||||
|
@ -249,4 +265,3 @@ class TestNetwork(nmanager.NetworkScenarioTest):
|
||||||
for floating_ip in floating_ips:
|
for floating_ip in floating_ips:
|
||||||
ip_address = floating_ip.floating_ip_address
|
ip_address = floating_ip.floating_ip_address
|
||||||
self._check_vm_connectivity(ip_address, ssh_login, private_key)
|
self._check_vm_connectivity(ip_address, ssh_login, private_key)
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,97 @@
|
||||||
|
from fuel_health.common.utils.data_utils import rand_name
|
||||||
|
from fuel_health.test import attr
|
||||||
|
from fuel_health.tests.smoke import base
|
||||||
|
|
||||||
|
class VolumesTest(base.BaseComputeTest):
|
||||||
|
|
||||||
|
_interface = 'json'
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def setUpClass(cls):
|
||||||
|
super(VolumesTest, cls).setUpClass()
|
||||||
|
cls.client = cls.servers_client
|
||||||
|
resp, server = cls.create_server(name='ost1_test-instance',
|
||||||
|
wait_until='ACTIVE',
|
||||||
|
adminPass='password')
|
||||||
|
resp, server['addresses'] = cls.client.list_addresses(server['id'])
|
||||||
|
cls.server_id = server['id']
|
||||||
|
cls.server_address = server['addresses']
|
||||||
|
cls.device = 'vdb'
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def tearDownClass(cls):
|
||||||
|
super(VolumesTest, cls).tearDownClass()
|
||||||
|
|
||||||
|
@attr(type=["fuel", "smoke"])
|
||||||
|
def test_volume_create(self):
|
||||||
|
"""
|
||||||
|
Test verifies:
|
||||||
|
that user can create instance
|
||||||
|
that user can create volume
|
||||||
|
that user can attach volume to instance
|
||||||
|
that user can detach volume from instance
|
||||||
|
that user can delete volume
|
||||||
|
"""
|
||||||
|
v_name = rand_name('ost1_test-test')
|
||||||
|
metadata = {'Type': 'work'}
|
||||||
|
|
||||||
|
#Create volume
|
||||||
|
resp, volume = self.volumes_client.create_volume(size=1,
|
||||||
|
display_name=v_name,
|
||||||
|
metadata=metadata)
|
||||||
|
self.verify_response_status(resp.status, 'Compute')
|
||||||
|
|
||||||
|
self.verify_response_body(volume, 'id',
|
||||||
|
'Volume is not created. '
|
||||||
|
'Looks like something broken in Storage.')
|
||||||
|
self.verify_response_body(volume, 'display_name',
|
||||||
|
'Volume is not created. '
|
||||||
|
'Looks like something broken in Storage.')
|
||||||
|
|
||||||
|
self.verify_response_body_content(v_name,
|
||||||
|
volume['display_name'],
|
||||||
|
("The created volume"
|
||||||
|
" name is not equal "
|
||||||
|
"to the requested"
|
||||||
|
" name"))
|
||||||
|
|
||||||
|
#Wait for Volume status to become AVAILABLE
|
||||||
|
self.volumes_client.wait_for_volume_status(volume['id'], 'available')
|
||||||
|
|
||||||
|
# Attach the volume to the server
|
||||||
|
device = '/dev/%s' % self.device
|
||||||
|
resp, body = self.servers_client.attach_volume(self.server_id,
|
||||||
|
volume['id'],
|
||||||
|
device=device)
|
||||||
|
self.verify_response_status(resp.status, 'Nova Compute')
|
||||||
|
|
||||||
|
self.volumes_client.wait_for_volume_status(volume['id'], 'in-use')
|
||||||
|
|
||||||
|
self.attached = True
|
||||||
|
|
||||||
|
resp, body = self.volumes_client.get_volume(volume['id'])
|
||||||
|
self.verify_response_status(resp.status, 'Storage Objects')
|
||||||
|
|
||||||
|
for attachment in body['attachments']:
|
||||||
|
self.verify_response_body_content('/dev/%s' % self.device,
|
||||||
|
attachment['device'],
|
||||||
|
('Device is not equal, '
|
||||||
|
'attach volume fail'))
|
||||||
|
|
||||||
|
self.verify_response_body_content(self.server_id,
|
||||||
|
attachment['server_id'],
|
||||||
|
('Server id is not equal,'
|
||||||
|
'Volume attachment fails'))
|
||||||
|
|
||||||
|
self.verify_response_body_content(volume['id'],
|
||||||
|
attachment['volume_id'],
|
||||||
|
'Wrong volume is attached')
|
||||||
|
|
||||||
|
# detach volume
|
||||||
|
self.servers_client.detach_volume(self.server_id, volume['id'])
|
||||||
|
self.volumes_client.wait_for_volume_status(volume['id'], 'available')
|
||||||
|
|
||||||
|
# delete volume
|
||||||
|
resp, body = self.volumes_client.delete_volume(volume['id'])
|
||||||
|
self.verify_response_status(resp.status, 'Storage Object')
|
||||||
|
|
Loading…
Reference in New Issue