Fix broken volume tests
Fixes volume tests that new CI gates have detected as broken.
Co-Authored-By: Mh Raies <mh.raies@ericsson.com>
Co-Authored-By: Samantha Blanco <samantha.blanco@att.com>
Closes-Bug: #1672863
Closes-Bug: #1672855
Closes-Bug: #1672859
Partial-Bug: #1670553
Change-Id: Ic1525932df6d98d099e3f4f23fbbcbaf99eb61e9
diff --git a/patrole_tempest_plugin/tests/api/volume/admin/test_volumes_backup_admin_rbac.py b/patrole_tempest_plugin/tests/api/volume/admin/test_volumes_backup_admin_rbac.py
index e78f80d..a89aa87 100644
--- a/patrole_tempest_plugin/tests/api/volume/admin/test_volumes_backup_admin_rbac.py
+++ b/patrole_tempest_plugin/tests/api/volume/admin/test_volumes_backup_admin_rbac.py
@@ -13,7 +13,10 @@
# License for the specific language governing permissions and limitations
# under the License.
+from oslo_serialization import base64
+from oslo_serialization import jsonutils as json
from tempest import config
+from tempest.lib.common.utils import data_utils
from tempest.lib import decorators
from tempest import test
@@ -36,6 +39,18 @@
super(VolumesBackupsAdminRbacTest, cls).resource_setup()
cls.volume = cls.create_volume()
+ def _decode_url(self, backup_url):
+ return json.loads(base64.decode_as_text(backup_url))
+
+ def _encode_backup(self, backup):
+ retval = json.dumps(backup)
+ return base64.encode_as_text(retval)
+
+ def _modify_backup_url(self, backup_url, changes):
+ backup = self._decode_url(backup_url)
+ backup.update(changes)
+ return self._encode_backup(backup)
+
@test.attr(type='slow')
@rbac_rule_validation.action(service="cinder",
rule="backup:backup-export")
@@ -58,11 +73,14 @@
# Export a temp backup
export_backup = self.backups_client.export_backup(
backup['id'])['backup-record']
+ new_id = data_utils.rand_uuid()
+ new_url = self._modify_backup_url(
+ export_backup['backup_url'], {'id': new_id})
# Import the temp backup
self.rbac_utils.switch_role(self, switchToRbacRole=True)
import_backup = self.backups_client.import_backup(
backup_service=export_backup['backup_service'],
- backup_url=export_backup['backup_url'])['backup']
+ backup_url=new_url)['backup']
self.addCleanup(self.backups_client.delete_backup, import_backup['id'])
diff --git a/patrole_tempest_plugin/tests/api/volume/rbac_base.py b/patrole_tempest_plugin/tests/api/volume/rbac_base.py
index c762473..2a14b19 100644
--- a/patrole_tempest_plugin/tests/api/volume/rbac_base.py
+++ b/patrole_tempest_plugin/tests/api/volume/rbac_base.py
@@ -57,7 +57,8 @@
cls.rbac_utils.switch_role(cls, switchToRbacRole=False)
version_checker = {
1: [cls.os.volume_hosts_client, cls.os.volume_types_client],
- 2: [cls.os.volume_hosts_v2_client, cls.os.volume_types_v2_client]
+ 2: [cls.os.volume_hosts_v2_client, cls.os.volume_types_v2_client],
+ 3: [cls.os.volume_hosts_v2_client, cls.os.volume_types_v2_client]
}
cls.volume_hosts_client, cls.volume_types_client = \
version_checker[cls._api_version]
diff --git a/patrole_tempest_plugin/tests/api/volume/test_volume_actions_rbac.py b/patrole_tempest_plugin/tests/api/volume/test_volume_actions_rbac.py
index d4ede3d..996e2b7 100644
--- a/patrole_tempest_plugin/tests/api/volume/test_volume_actions_rbac.py
+++ b/patrole_tempest_plugin/tests/api/volume/test_volume_actions_rbac.py
@@ -13,6 +13,9 @@
# License for the specific language governing permissions and limitations
# under the License.
+import testtools
+
+from tempest.common import compute
from tempest.common import waiters
from tempest import config
from tempest.lib.common.utils import data_utils
@@ -28,58 +31,56 @@
class VolumesActionsRbacTest(rbac_base.BaseVolumeRbacTest):
@classmethod
- def skip_checks(cls):
- super(VolumesActionsRbacTest, cls).skip_checks()
- # Nova is needed to create a server
- if not CONF.service_available.nova:
- skip_msg = ("%s skipped as nova is not available" % cls.__name__)
- raise cls.skipException(skip_msg)
- # Glance is needed to create an image
- if not CONF.service_available.glance:
- skip_msg = ("%s skipped as glance is not available" % cls.__name__)
- raise cls.skipException(skip_msg)
-
- @classmethod
def setup_clients(cls):
super(VolumesActionsRbacTest, cls).setup_clients()
cls.client = cls.os.volumes_client
- cls.image_client = cls.os.image_client
@classmethod
def resource_setup(cls):
super(VolumesActionsRbacTest, cls).resource_setup()
cls.volume = cls.create_volume()
- def _attach_volume(self):
- server = self.create_server(wait_until='ACTIVE')
+ def _create_server(self):
+ body, _ = compute.create_test_server(self.os, wait_until='ACTIVE')
+ self.addCleanup(test_utils.call_and_ignore_notfound_exc,
+ self.servers_client.delete_server, body['id'])
+ return body
+
+ def _attach_volume(self, server):
self.servers_client.attach_volume(
server['id'], volumeId=self.volume['id'],
device='/dev/%s' % CONF.compute.volume_device_name)
- waiters.wait_for_volume_status(self.client,
- self.volume['id'], 'in-use')
+ waiters.wait_for_volume_resource_status(
+ self.client, self.volume['id'], 'in-use')
self.addCleanup(self._detach_volume)
def _detach_volume(self):
self.client.detach_volume(self.volume['id'])
- waiters.wait_for_volume_status(self.client, self.volume['id'],
- 'available')
+ waiters.wait_for_volume_resource_status(
+ self.client, self.volume['id'], 'available')
+ @testtools.skipUnless(CONF.service_available.nova,
+ "Nova is required to create a server")
@rbac_rule_validation.action(service="cinder", rule="volume:attach")
@decorators.idempotent_id('f97b10e4-2eed-4f8b-8632-71c02cb9fe42')
def test_attach_volume_to_instance(self):
+ server = self._create_server()
self.rbac_utils.switch_role(self, switchToRbacRole=True)
# Attach the volume
- self._attach_volume()
+ self._attach_volume(server)
@rbac_rule_validation.action(service="cinder", rule="volume:detach")
@decorators.idempotent_id('5a042f6a-688b-42e6-a02e-fe5c47b89b07')
def test_detach_volume_to_instance(self):
# Attach the volume
- self._attach_volume()
+ server = self._create_server()
+ self._attach_volume(server)
self.rbac_utils.switch_role(self, switchToRbacRole=True)
# Detach the volume
self._detach_volume()
+ @testtools.skipUnless(CONF.service_available.nova,
+ "Nova is needed to create a server")
@rbac_rule_validation.action(service="cinder", rule="volume:get")
@decorators.idempotent_id('c4c3fdd5-b1b1-49c3-b977-a9f40ee9257a')
def test_get_volume_attachment(self):
@@ -87,20 +88,22 @@
# Get attachment
self.client.show_volume(self.volume['id'])
+ @testtools.skipIf(True, "Patrole bug #1672799")
@rbac_rule_validation.action(service="cinder",
rule="volume:copy_volume_to_image")
@decorators.idempotent_id('b0d0da46-903c-4445-893e-20e680d68b50')
def test_volume_upload(self):
+ self.image_client = self.os.image_client
image_name = data_utils.rand_name('image')
self.rbac_utils.switch_role(self, switchToRbacRole=True)
body = self.client.upload_volume(
self.volume['id'], image_name=image_name,
disk_format=CONF.volume.disk_format)['os-volume_upload_image']
- image_id = body['image_id']
self.addCleanup(test_utils.call_and_ignore_notfound_exc,
self.image_client.delete_image,
- image_id)
- waiters.wait_for_image_status(self.image_client, image_id, 'active')
+ body['image_id'])
+ waiters.wait_for_volume_resource_status(
+ self.client, self.volume['id'], 'available')
@rbac_rule_validation.action(service="cinder",
rule="volume:update_readonly_flag")
diff --git a/patrole_tempest_plugin/tests/api/volume/test_volume_transfers_rbac.py b/patrole_tempest_plugin/tests/api/volume/test_volume_transfers_rbac.py
index 5c86da4..358733f 100644
--- a/patrole_tempest_plugin/tests/api/volume/test_volume_transfers_rbac.py
+++ b/patrole_tempest_plugin/tests/api/volume/test_volume_transfers_rbac.py
@@ -26,7 +26,7 @@
class VolumesTransfersRbacTest(rbac_base.BaseVolumeRbacTest):
- credentials = ['alt', 'admin']
+ credentials = ['primary', 'admin', 'alt']
@classmethod
def setup_clients(cls):
@@ -46,8 +46,8 @@
# the test to fail
test_utils.call_and_ignore_notfound_exc(
self.client.delete_volume_transfer, transfer['id'])
- waiters.wait_for_volume_status(self.client, self.volume['id'],
- 'available')
+ waiters.wait_for_volume_resource_status(
+ self.client, self.volume['id'], 'available')
def _create_transfer(self):
transfer = self.client.create_volume_transfer(
diff --git a/patrole_tempest_plugin/tests/api/volume/test_volumes_backup_rbac.py b/patrole_tempest_plugin/tests/api/volume/test_volumes_backup_rbac.py
index 9902f0d..8480d01 100644
--- a/patrole_tempest_plugin/tests/api/volume/test_volumes_backup_rbac.py
+++ b/patrole_tempest_plugin/tests/api/volume/test_volumes_backup_rbac.py
@@ -16,6 +16,7 @@
from tempest.common import waiters
from tempest import config
from tempest.lib.common.utils import data_utils
+from tempest.lib.common.utils import test_utils
from tempest.lib import decorators
from patrole_tempest_plugin import rbac_rule_validation
@@ -34,7 +35,7 @@
def create_backup(self, volume_id):
backup_name = data_utils.rand_name(
- self.__class__.__name__ + '-Backup')
+ self.__class__.__name__ + '-backup')
backup = self.backups_client.create_backup(
volume_id=volume_id, name=backup_name)['backup']
self.addCleanup(self.backups_client.delete_backup, backup['id'])
@@ -47,19 +48,30 @@
super(VolumesBackupsRbacTest, cls).resource_setup()
cls.volume = cls.create_volume()
+ def _create_backup(self, volume_id):
+ backup_name = data_utils.rand_name('backup')
+ backup = self.backups_client.create_backup(
+ volume_id=volume_id, name=backup_name)['backup']
+ self.addCleanup(
+ test_utils.call_and_ignore_notfound_exc,
+ self.backups_client.delete_backup, backup['id'])
+ waiters.wait_for_volume_resource_status(
+ self.backups_client, backup['id'], 'available')
+ return backup
+
@rbac_rule_validation.action(service="cinder",
rule="backup:create")
@decorators.idempotent_id('6887ec94-0bcf-4ab7-b30f-3808a4b5a2a5')
def test_volume_backup_create(self):
self.rbac_utils.switch_role(self, switchToRbacRole=True)
- self.create_backup(volume_id=self.volume['id'])
+ self._create_backup(volume_id=self.volume['id'])
@rbac_rule_validation.action(service="cinder",
rule="backup:get")
@decorators.idempotent_id('abd92bdd-b0fb-4dc4-9cfc-de9e968f8c8a')
def test_volume_backup_get(self):
# Create a temp backup
- backup = self.create_backup(volume_id=self.volume['id'])
+ backup = self._create_backup(volume_id=self.volume['id'])
# Get a given backup
self.rbac_utils.switch_role(self, switchToRbacRole=True)
self.backups_client.show_backup(backup['id'])
@@ -76,17 +88,19 @@
@decorators.idempotent_id('9c794bf9-2446-4f41-8fe0-80b71e757f9d')
def test_volume_backup_restore(self):
# Create a temp backup
- backup = self.create_backup(volume_id=self.volume['id'])
+ backup = self._create_backup(volume_id=self.volume['id'])
# Restore backup
self.rbac_utils.switch_role(self, switchToRbacRole=True)
- self.backups_client.restore_backup(backup['id'])['restore']
+ restore = self.backups_client.restore_backup(backup['id'])['restore']
+ waiters.wait_for_volume_resource_status(
+ self.backups_client, restore['backup_id'], 'available')
@rbac_rule_validation.action(service="cinder",
rule="backup:delete")
@decorators.idempotent_id('d5d0c6a2-413d-437e-a73f-4bf2b41a20ed')
def test_volume_backup_delete(self):
# Create a temp backup
- backup = self.create_backup(volume_id=self.volume['id'])
+ backup = self._create_backup(volume_id=self.volume['id'])
self.rbac_utils.switch_role(self, switchToRbacRole=True)
# Delete backup
self.backups_client.delete_backup(backup['id'])
diff --git a/patrole_tempest_plugin/tests/api/volume/test_volumes_extend_rbac.py b/patrole_tempest_plugin/tests/api/volume/test_volumes_extend_rbac.py
index e8c620f..64493c5 100644
--- a/patrole_tempest_plugin/tests/api/volume/test_volumes_extend_rbac.py
+++ b/patrole_tempest_plugin/tests/api/volume/test_volumes_extend_rbac.py
@@ -39,8 +39,8 @@
self.rbac_utils.switch_role(self, switchToRbacRole=True)
self.volumes_client.extend_volume(self.volume['id'],
new_size=extend_size)
- waiters.wait_for_volume_status(self.volumes_client, self.volume['id'],
- 'available')
+ waiters.wait_for_volume_resource_status(
+ self.volumes_client, self.volume['id'], 'available')
class VolumesExtendV3RbacTest(VolumesExtendRbacTest):