Merge "Wait for actual volume detach in multiattach tests" into mcp/epoxy
diff --git a/tempest/api/compute/admin/test_migrations.py b/tempest/api/compute/admin/test_migrations.py
index fa8a737..6b27355 100644
--- a/tempest/api/compute/admin/test_migrations.py
+++ b/tempest/api/compute/admin/test_migrations.py
@@ -38,8 +38,9 @@
self.client.list_migrations()
@decorators.idempotent_id('1b512062-8093-438e-b47a-37d2f597cd64')
- @testtools.skipUnless(CONF.compute_feature_enabled.resize,
- 'Resize not available.')
+ @testtools.skipIf(not (CONF.compute_feature_enabled.cold_migration and
+ CONF.compute_feature_enabled.resize),
+ 'Cold migration/Resize not available.')
def test_list_migrations_in_flavor_resize_situation(self):
"""Admin can get the migrations list containing the resized server"""
server = self.create_test_server(wait_until="ACTIVE")
@@ -60,8 +61,9 @@
pass
@decorators.idempotent_id('33f1fec3-ba18-4470-8e4e-1d888e7c3593')
- @testtools.skipUnless(CONF.compute_feature_enabled.resize,
- 'Resize not available.')
+ @testtools.skipIf(not (CONF.compute_feature_enabled.cold_migration and
+ CONF.compute_feature_enabled.resize),
+ 'Cold migration/Resize not available.')
def test_resize_server_revert_deleted_flavor(self):
"""Test reverting resized server with original flavor deleted
diff --git a/tempest/api/compute/admin/test_servers_negative.py b/tempest/api/compute/admin/test_servers_negative.py
index c933c80..0d0e164 100644
--- a/tempest/api/compute/admin/test_servers_negative.py
+++ b/tempest/api/compute/admin/test_servers_negative.py
@@ -43,8 +43,9 @@
cls.s1_id = server['id']
@decorators.idempotent_id('28dcec23-f807-49da-822c-56a92ea3c687')
- @testtools.skipUnless(CONF.compute_feature_enabled.resize,
- 'Resize not available.')
+ @testtools.skipIf(not (CONF.compute_feature_enabled.cold_migration and
+ CONF.compute_feature_enabled.resize),
+ 'Cold migration/Resize not available.')
@decorators.attr(type=['negative'])
def test_resize_server_using_overlimit_ram(self):
"""Test resizing server using over limit ram should fail"""
@@ -78,8 +79,9 @@
self.s1_id)
@decorators.idempotent_id('7368a427-2f26-4ad9-9ba9-911a0ec2b0db')
- @testtools.skipUnless(CONF.compute_feature_enabled.resize,
- 'Resize not available.')
+ @testtools.skipIf(not (CONF.compute_feature_enabled.cold_migration and
+ CONF.compute_feature_enabled.resize),
+ 'Cold migration/Resize not available.')
@decorators.attr(type=['negative'])
def test_resize_server_using_overlimit_vcpus(self):
"""Test resizing server using over limit vcpus should fail"""
diff --git a/tempest/api/compute/admin/test_volume_swap.py b/tempest/api/compute/admin/test_volume_swap.py
index d7abf72..46500cc 100644
--- a/tempest/api/compute/admin/test_volume_swap.py
+++ b/tempest/api/compute/admin/test_volume_swap.py
@@ -30,16 +30,34 @@
super(TestVolumeSwapBase, cls).setup_credentials()
@classmethod
+ def setup_clients(cls):
+ super(TestVolumeSwapBase, cls).setup_clients()
+
+ cls.volume_type_client = cls.os_admin.volume_types_client_latest
+ cls.encryption_client = cls.os_admin.encryption_types_client_latest
+
+ @classmethod
def skip_checks(cls):
super(TestVolumeSwapBase, cls).skip_checks()
if not CONF.service_available.cinder:
raise cls.skipException("Cinder is not available")
if not CONF.compute_feature_enabled.swap_volume:
raise cls.skipException("Swapping volumes is not supported.")
- if CONF.compute_feature_enabled.attach_encrypted_volume:
- raise cls.skipException(
- 'Volume swap is not available for OS configurations '
- 'with crypted volumes.')
+
+ @classmethod
+ def _check_default_volume_type(cls):
+ default_volume_type = cls.volume_type_client.\
+ show_default_volume_type()["volume_type"]["id"]
+ volume_encryption = cls.encryption_client.show_encryption_type(
+ default_volume_type)
+ if volume_encryption and volume_encryption.get("provider"):
+ raise cls.skipException("Not allowed to run this test with "
+ "encrypted volume")
+
+ @classmethod
+ def resource_setup(cls):
+ cls._check_default_volume_type()
+ super(TestVolumeSwapBase, cls).resource_setup()
def wait_for_server_volume_swap(self, server_id, old_volume_id,
new_volume_id):
diff --git a/tempest/api/compute/servers/test_delete_server.py b/tempest/api/compute/servers/test_delete_server.py
index dfbed3b..bbaf21d 100644
--- a/tempest/api/compute/servers/test_delete_server.py
+++ b/tempest/api/compute/servers/test_delete_server.py
@@ -97,8 +97,9 @@
waiters.wait_for_server_termination(self.client, server['id'])
@decorators.idempotent_id('ab0c38b4-cdd8-49d3-9b92-0cb898723c01')
- @testtools.skipIf(not CONF.compute_feature_enabled.resize,
- 'Resize not available.')
+ @testtools.skipIf(not (CONF.compute_feature_enabled.cold_migration and
+ CONF.compute_feature_enabled.resize),
+ 'Cold migration/Resize not available.')
def test_delete_server_while_in_verify_resize_state(self):
"""Test deleting a server while it's VM state is VERIFY_RESIZE"""
server = self.create_test_server(wait_until='ACTIVE')
diff --git a/tempest/api/compute/servers/test_device_tagging.py b/tempest/api/compute/servers/test_device_tagging.py
index 5f9bb4f..18f9652 100644
--- a/tempest/api/compute/servers/test_device_tagging.py
+++ b/tempest/api/compute/servers/test_device_tagging.py
@@ -165,6 +165,13 @@
subnet2 = self.subnets_client.create_subnet(
network_id=net2['id'],
cidr='10.2.2.0/24',
+ # Add allocation pool to prevent IP address conflicts.
+ allocation_pools=[
+ {
+ "start": "10.2.2.10",
+ "end": "10.2.2.90"
+ }
+ ],
ip_version=4)['subnet']
self.addCleanup(self.subnets_client.delete_subnet, subnet2['id'])
diff --git a/tempest/api/compute/servers/test_disk_config.py b/tempest/api/compute/servers/test_disk_config.py
index e5e051a..35c5619 100644
--- a/tempest/api/compute/servers/test_disk_config.py
+++ b/tempest/api/compute/servers/test_disk_config.py
@@ -88,8 +88,9 @@
self.assertEqual('AUTO', server['OS-DCF:diskConfig'])
@decorators.idempotent_id('414e7e93-45b5-44bc-8e03-55159c6bfc97')
- @testtools.skipUnless(CONF.compute_feature_enabled.resize,
- 'Resize not available.')
+ @testtools.skipIf(not (CONF.compute_feature_enabled.cold_migration and
+ CONF.compute_feature_enabled.resize),
+ 'Cold migration/Resize not available.')
def test_resize_server_from_manual_to_auto(self):
"""A server should be resized from manual to auto disk config"""
server = self.create_test_server(wait_until='ACTIVE')
@@ -104,8 +105,9 @@
self.assertEqual('AUTO', server['OS-DCF:diskConfig'])
@decorators.idempotent_id('693d16f3-556c-489a-8bac-3d0ca2490bad')
- @testtools.skipUnless(CONF.compute_feature_enabled.resize,
- 'Resize not available.')
+ @testtools.skipIf(not (CONF.compute_feature_enabled.cold_migration and
+ CONF.compute_feature_enabled.resize),
+ 'Cold migration/Resize not available.')
def test_resize_server_from_auto_to_manual(self):
"""A server should be resized from auto to manual disk config"""
server = self.create_test_server(wait_until='ACTIVE')
diff --git a/tempest/api/compute/servers/test_server_actions.py b/tempest/api/compute/servers/test_server_actions.py
index 67f50ba..5d4a5ed 100644
--- a/tempest/api/compute/servers/test_server_actions.py
+++ b/tempest/api/compute/servers/test_server_actions.py
@@ -295,15 +295,17 @@
validation_resources=validation_resources)
@decorators.idempotent_id('1499262a-9328-4eda-9068-db1ac57498d2')
- @testtools.skipUnless(CONF.compute_feature_enabled.resize,
- 'Resize not available.')
+ @testtools.skipIf(not (CONF.compute_feature_enabled.cold_migration and
+ CONF.compute_feature_enabled.resize),
+ 'Cold migration/Resize not available.')
def test_resize_server_confirm(self):
"""Test resizing server and then confirming"""
self._test_resize_server_confirm(self.server_id, stop=False)
@decorators.idempotent_id('c03aab19-adb1-44f5-917d-c419577e9e68')
- @testtools.skipUnless(CONF.compute_feature_enabled.resize,
- 'Resize not available.')
+ @testtools.skipIf(not (CONF.compute_feature_enabled.cold_migration and
+ CONF.compute_feature_enabled.resize),
+ 'Cold migration/Resize not available.')
def test_resize_server_revert(self):
"""Test resizing server and then reverting
@@ -493,8 +495,9 @@
@decorators.idempotent_id('e6c28180-7454-4b59-b188-0257af08a63b')
@decorators.related_bug('1728603')
- @testtools.skipUnless(CONF.compute_feature_enabled.resize,
- 'Resize not available.')
+ @testtools.skipIf(not (CONF.compute_feature_enabled.cold_migration and
+ CONF.compute_feature_enabled.resize),
+ 'Cold migration/Resize not available.')
@utils.services('volume')
def test_resize_volume_backed_server_confirm(self):
"""Test resizing a volume backed server and then confirming"""
@@ -531,16 +534,18 @@
class ServerActionsTestOtherB(ServerActionsBase):
@decorators.idempotent_id('138b131d-66df-48c9-a171-64f45eb92962')
- @testtools.skipUnless(CONF.compute_feature_enabled.resize,
- 'Resize not available.')
+ @testtools.skipIf(not (CONF.compute_feature_enabled.cold_migration and
+ CONF.compute_feature_enabled.resize),
+ 'Cold migration/Resize not available.')
def test_resize_server_confirm_from_stopped(self):
"""Test resizing a stopped server and then confirming"""
self._test_resize_server_confirm(self.server_id, stop=True)
@decorators.idempotent_id('fbbf075f-a812-4022-bc5c-ccb8047eef12')
@decorators.related_bug('1737599')
- @testtools.skipUnless(CONF.compute_feature_enabled.resize,
- 'Resize not available.')
+ @testtools.skipIf(not (CONF.compute_feature_enabled.cold_migration and
+ CONF.compute_feature_enabled.resize),
+ 'Cold migration/Resize not available.')
@utils.services('volume')
def test_resize_server_revert_with_volume_attached(self):
"""Test resizing a volume attached server and then reverting
@@ -883,7 +888,7 @@
# 4.Plain username/password auth, if a password was given.
linux_client = remote_client.RemoteClient(
self.get_server_ip(server, self.validation_resources),
- self.ssh_alt_user,
+ self.ssh_user,
password=None,
pkey=self.validation_resources['keypair']['private_key'],
server=server,
diff --git a/tempest/api/compute/servers/test_servers_negative.py b/tempest/api/compute/servers/test_servers_negative.py
index fa40629..b9d4be22 100644
--- a/tempest/api/compute/servers/test_servers_negative.py
+++ b/tempest/api/compute/servers/test_servers_negative.py
@@ -128,8 +128,9 @@
self.create_test_server, accessIPv6=IPv6)
@decorators.idempotent_id('7ea45b3e-e770-46fa-bfcc-9daaf6d987c0')
- @testtools.skipUnless(CONF.compute_feature_enabled.resize,
- 'Resize not available.')
+ @testtools.skipIf(not (CONF.compute_feature_enabled.cold_migration and
+ CONF.compute_feature_enabled.resize),
+ 'Cold migration/Resize not available.')
@decorators.attr(type=['negative'])
def test_resize_nonexistent_server(self):
"""Resizing a non-existent server should fail"""
@@ -139,8 +140,9 @@
nonexistent_server, self.flavor_ref)
@decorators.idempotent_id('ced1a1d7-2ab6-45c9-b90f-b27d87b30efd')
- @testtools.skipUnless(CONF.compute_feature_enabled.resize,
- 'Resize not available.')
+ @testtools.skipIf(not (CONF.compute_feature_enabled.cold_migration and
+ CONF.compute_feature_enabled.resize),
+ 'Cold migration/Resize not available.')
@decorators.attr(type=['negative'])
def test_resize_server_with_non_existent_flavor(self):
"""Resizing a server with non existent flavor should fail"""
@@ -149,8 +151,9 @@
self.server_id, flavor_ref=nonexistent_flavor)
@decorators.idempotent_id('45436a7d-a388-4a35-a9d8-3adc5d0d940b')
- @testtools.skipUnless(CONF.compute_feature_enabled.resize,
- 'Resize not available.')
+ @testtools.skipIf(not (CONF.compute_feature_enabled.cold_migration and
+ CONF.compute_feature_enabled.resize),
+ 'Cold migration/Resize not available.')
@decorators.attr(type=['negative'])
def test_resize_server_with_null_flavor(self):
"""Resizing a server with null flavor should fail"""
diff --git a/tempest/api/compute/volumes/test_attach_volume.py b/tempest/api/compute/volumes/test_attach_volume.py
index b5501c5..21eef18 100644
--- a/tempest/api/compute/volumes/test_attach_volume.py
+++ b/tempest/api/compute/volumes/test_attach_volume.py
@@ -587,8 +587,9 @@
self.volumes_client.wait_for_resource_deletion(volume['id'])
@decorators.idempotent_id('f01c7169-a124-4fc7-ae60-5e380e247c9c')
- @testtools.skipUnless(CONF.compute_feature_enabled.resize,
- 'Resize not available.')
+ @testtools.skipIf(not (CONF.compute_feature_enabled.cold_migration and
+ CONF.compute_feature_enabled.resize),
+ 'Cold migration/Resize not available.')
def test_resize_server_with_multiattached_volume(self):
"""Test resizing servers with multiattached volume
diff --git a/tempest/api/network/test_ports.py b/tempest/api/network/test_ports.py
index 65e1181..cca804f 100644
--- a/tempest/api/network/test_ports.py
+++ b/tempest/api/network/test_ports.py
@@ -237,7 +237,13 @@
"""Test listing ports filtered by part of ip address string"""
# Create network and subnet
network = self._create_network()
- subnet = self._create_subnet(network)
+ address = self.cidr
+ # Add allocation pool to prevent IP address conflicts.
+ pool_start = ipaddress.ip_address(str(address[2]))
+ pool_end = ipaddress.ip_address(str(address[8]))
+ allocation_pools = {'allocation_pools': [{'start': str(pool_start),
+ 'end': str(pool_end)}]}
+ subnet = self._create_subnet(network, **allocation_pools)
# Get two IP addresses
ip_address_1 = None
ip_address_2 = None
@@ -245,9 +251,7 @@
for ip in ip_network:
if ip == ip_network.network_address:
continue
- if self.ports_client.list_ports(
- network_id=network['id'],
- fixed_ips='ip_address=' + str(ip))['ports']:
+ if pool_start <= ip <= pool_end:
continue
if ip_address_1 is None:
ip_address_1 = str(ip)
diff --git a/tempest/api/volume/base.py b/tempest/api/volume/base.py
index b93ade5..3d82c8f 100644
--- a/tempest/api/volume/base.py
+++ b/tempest/api/volume/base.py
@@ -269,8 +269,11 @@
tenant_network = self.get_tenant_network()
# Since microversion v2.37 'networks' field is required
- if self.compute_request_microversion >= '2.37' and 'networks'\
- not in kwargs:
+ if (
+ self.compute_request_microversion >= '2.37' and
+ 'networks' not in kwargs and
+ not kwargs.get("validatable", False)
+ ):
kwargs['networks'] = 'none'
body, _ = compute.create_test_server(
diff --git a/tempest/config.py b/tempest/config.py
index bc0ff3c..3ccce49 100644
--- a/tempest/config.py
+++ b/tempest/config.py
@@ -970,7 +970,7 @@
default="root",
help="User name used to authenticate to an instance."),
cfg.StrOpt('image_alt_ssh_user',
- default="cirros",
+ default="root",
help="User name used to authenticate to an alt instance."),
cfg.StrOpt('image_ssh_password',
default="password",