Update tempest to 30.0.0

This PS updates Tempest to 30.0.0. Due to

https://github.com/openstack/tempest/commit/55414580c24384df8bb2854b2c71249848dfbdf6

some refactoring was required around wait_for_interface_detach.

Additionally, the variables:

min_microversion
max_microversion

needed to be renamed to:

volume_min_microversion
volume_max_microversion

for volume related tests. See:

https://review.opendev.org/c/openstack/tempest/+/813676

Change-Id: Ie2183fdd2812d5d2fdfdc0815bf96e5c47a9f1e8
diff --git a/lower-constraints.txt b/lower-constraints.txt
index c0da9ce..a9fa87a 100644
--- a/lower-constraints.txt
+++ b/lower-constraints.txt
@@ -66,7 +66,7 @@
 snowballstemmer==1.2.1
 stestr==2.0.0
 stevedore==1.20.0
-tempest==17.1.0
+tempest==30.0.0
 testrepository==0.0.20
 testtools==2.3.0
 traceback2==1.4.0
diff --git a/patrole_tempest_plugin/tests/api/compute/test_server_misc_policy_actions_rbac.py b/patrole_tempest_plugin/tests/api/compute/test_server_misc_policy_actions_rbac.py
index 95048bd..9abd00e 100644
--- a/patrole_tempest_plugin/tests/api/compute/test_server_misc_policy_actions_rbac.py
+++ b/patrole_tempest_plugin/tests/api/compute/test_server_misc_policy_actions_rbac.py
@@ -617,6 +617,11 @@
                 '%s skipped as Neutron is required' % cls.__name__)
 
     @classmethod
+    def setup_clients(cls):
+        super(MiscPolicyActionsNetworkRbacTest, cls).setup_clients()
+        cls.servers_admin_client = cls.os_admin.servers_client
+
+    @classmethod
     def setup_credentials(cls):
         cls.prepare_instance_network()
         super(MiscPolicyActionsNetworkRbacTest, cls).setup_credentials()
@@ -659,16 +664,29 @@
         # be deleted
         cls.addClassResourceCleanup(_cleanup_ports, cls.network['id'])
 
+    def _delete_and_wait_for_interface_detach(
+            self, server_id, port_id):
+        req_id = self.interfaces_client.delete_interface(
+            server_id, port_id
+        ).response['x-openstack-request-id']
+        waiters.wait_for_interface_detach(
+            self.servers_admin_client, server_id, port_id, req_id)
+
+    def _delete_and_wait_for_interface_detach_ignore_timeout(
+            self, server_id, port_id):
+        try:
+            self._delete_and_wait_for_interface_detach(
+                server_id, port_id)
+        except lib_exc.TimeoutException:
+            pass
+
     def _attach_interface_to_server(self):
         network_id = self.network['id']
         interface = self.interfaces_client.create_interface(
             self.server['id'], net_id=network_id)['interfaceAttachment']
         self.addCleanup(
-            waiters.wait_for_interface_detach, self.interfaces_client,
-            self.server['id'], interface['port_id'])
-        self.addCleanup(
             test_utils.call_and_ignore_notfound_exc,
-            self.interfaces_client.delete_interface,
+            self._delete_and_wait_for_interface_detach_ignore_timeout,
             self.server['id'], interface['port_id'])
         waiters.wait_for_interface_status(
             self.interfaces_client, self.server['id'],
@@ -715,11 +733,8 @@
             interface = self.interfaces_client.create_interface(
                 self.server['id'], net_id=network_id)['interfaceAttachment']
         self.addCleanup(
-            waiters.wait_for_interface_detach, self.interfaces_client,
-            self.server['id'], interface['port_id'])
-        self.addCleanup(
             test_utils.call_and_ignore_notfound_exc,
-            self.interfaces_client.delete_interface,
+            self._delete_and_wait_for_interface_detach_ignore_timeout,
             self.server['id'], interface['port_id'])
         waiters.wait_for_interface_status(
             self.interfaces_client, self.server['id'],
@@ -737,10 +752,15 @@
         interface = self._attach_interface_to_server()
 
         with self.override_role():
-            self.interfaces_client.delete_interface(self.server['id'],
-                                                    interface['port_id'])
-        waiters.wait_for_interface_detach(
-            self.interfaces_client, self.server['id'], interface['port_id'])
+            req_id = self.interfaces_client.delete_interface(
+                self.server['id'], interface['port_id'])
+        try:
+            # interface may be not found - we need to ignore that
+            waiters.wait_for_interface_detach(
+                self.servers_admin_client, self.server['id'],
+                interface['port_id'], req_id)
+        except lib_exc.NotFound:
+            pass
 
     @decorators.idempotent_id('6886d360-0d86-4760-b1a3-882d81fbebcc')
     @utils.requires_ext(extension='os-ips', service='compute')
@@ -784,10 +804,7 @@
                 self.server['id'])['interfaceAttachment']
             network_id = interface['net_id']
             self.addCleanup(
-                waiters.wait_for_interface_detach, self.interfaces_client,
-                self.server['id'], interface['port_id'])
-            self.addCleanup(
-                self.interfaces_client.delete_interface,
+                self._delete_and_wait_for_interface_detach,
                 self.server['id'], interface['port_id'])
 
         with self.override_role():
diff --git a/patrole_tempest_plugin/tests/api/volume/test_group_snapshots_rbac.py b/patrole_tempest_plugin/tests/api/volume/test_group_snapshots_rbac.py
index f83f35b..0b265e8 100644
--- a/patrole_tempest_plugin/tests/api/volume/test_group_snapshots_rbac.py
+++ b/patrole_tempest_plugin/tests/api/volume/test_group_snapshots_rbac.py
@@ -61,8 +61,8 @@
 
 class GroupSnaphotsV314RbacTest(BaseGroupSnapshotsRbacTest):
     _api_version = 3
-    min_microversion = '3.14'
-    max_microversion = 'latest'
+    volume_min_microversion = '3.14'
+    volume_max_microversion = 'latest'
 
     @classmethod
     def skip_checks(cls):
@@ -158,8 +158,8 @@
 
 class GroupSnaphotsV319RbacTest(BaseGroupSnapshotsRbacTest):
     _api_version = 3
-    min_microversion = '3.19'
-    max_microversion = 'latest'
+    volume_min_microversion = '3.19'
+    volume_max_microversion = 'latest'
 
     @classmethod
     def skip_checks(cls):
diff --git a/patrole_tempest_plugin/tests/api/volume/test_group_type_specs.py b/patrole_tempest_plugin/tests/api/volume/test_group_type_specs.py
index 2d0ef69..3b93d09 100644
--- a/patrole_tempest_plugin/tests/api/volume/test_group_type_specs.py
+++ b/patrole_tempest_plugin/tests/api/volume/test_group_type_specs.py
@@ -38,8 +38,8 @@
 
 class GroupTypeSpecsRbacTest(rbac_base.BaseVolumeRbacTest):
     _api_version = 3
-    min_microversion = '3.11'
-    max_microversion = 'latest'
+    volume_min_microversion = '3.11'
+    volume_max_microversion = 'latest'
 
     @decorators.idempotent_id('b2859734-00ad-4a22-88ee-541698e90d12')
     @rbac_rule_validation.action(
diff --git a/patrole_tempest_plugin/tests/api/volume/test_groups_rbac.py b/patrole_tempest_plugin/tests/api/volume/test_groups_rbac.py
index 9975410..f012384 100644
--- a/patrole_tempest_plugin/tests/api/volume/test_groups_rbac.py
+++ b/patrole_tempest_plugin/tests/api/volume/test_groups_rbac.py
@@ -69,8 +69,8 @@
 
 
 class GroupsV3RbacTest(BaseGroupRbacTest):
-    min_microversion = '3.13'
-    max_microversion = 'latest'
+    volume_min_microversion = '3.13'
+    volume_max_microversion = 'latest'
 
     @decorators.idempotent_id('43235328-66ae-424f-bc7f-f709c0ca268c')
     @rbac_rule_validation.action(
@@ -152,8 +152,8 @@
 
 class GroupV320RbacTest(BaseGroupRbacTest):
     _api_version = 3
-    min_microversion = '3.20'
-    max_microversion = 'latest'
+    volume_min_microversion = '3.20'
+    volume_max_microversion = 'latest'
 
     @decorators.idempotent_id('b849c1d4-3215-4f9d-b1e6-0aeb4b2b65ac')
     @rbac_rule_validation.action(
@@ -172,8 +172,8 @@
 
 
 class GroupTypesV3RbacTest(rbac_base.BaseVolumeRbacTest):
-    min_microversion = '3.11'
-    max_microversion = 'latest'
+    volume_min_microversion = '3.11'
+    volume_max_microversion = 'latest'
 
     @decorators.idempotent_id('2820f12c-4681-4c7f-b28d-e6925637dff6')
     @rbac_rule_validation.action(
diff --git a/patrole_tempest_plugin/tests/api/volume/test_user_messages_rbac.py b/patrole_tempest_plugin/tests/api/volume/test_user_messages_rbac.py
index f0dfe09..3feb2df 100644
--- a/patrole_tempest_plugin/tests/api/volume/test_user_messages_rbac.py
+++ b/patrole_tempest_plugin/tests/api/volume/test_user_messages_rbac.py
@@ -25,8 +25,8 @@
 
 
 class MessagesV3RbacTest(rbac_base.BaseVolumeRbacTest):
-    min_microversion = '3.3'
-    max_microversion = 'latest'
+    volume_min_microversion = '3.3'
+    volume_max_microversion = 'latest'
 
     @classmethod
     def setup_clients(cls):
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 9205b58..e3311ea 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
@@ -220,8 +220,8 @@
 
 class VolumesActionsV310RbacTest(rbac_base.BaseVolumeRbacTest):
     _api_version = 3
-    min_microversion = '3.10'
-    max_microversion = 'latest'
+    volume_min_microversion = '3.10'
+    volume_max_microversion = 'latest'
 
     @classmethod
     def setup_clients(cls):
@@ -283,8 +283,8 @@
 
 class VolumesActionsV312RbacTest(rbac_base.BaseVolumeRbacTest):
     _api_version = 3
-    min_microversion = '3.12'
-    max_microversion = 'latest'
+    volume_min_microversion = '3.12'
+    volume_max_microversion = 'latest'
 
     @decorators.idempotent_id('a654833d-4811-4acd-93ef-5ac4a34c75bc')
     @rbac_rule_validation.action(service="cinder", rules=["volume:get_all"])
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 0e807e8..073b26c 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
@@ -183,8 +183,8 @@
     _api_version = 3
     # The minimum microversion for showing 'os-backup-project-attr:project_id'
     # is 3.18.
-    min_microversion = '3.18'
-    max_microversion = 'latest'
+    volume_min_microversion = '3.18'
+    volume_max_microversion = 'latest'
 
     @classmethod
     def skip_checks(cls):
@@ -226,8 +226,8 @@
 
 class VolumesBackupsV39RbacTest(rbac_base.BaseVolumeRbacTest):
     _api_version = 3
-    min_microversion = '3.9'
-    max_microversion = 'latest'
+    volume_min_microversion = '3.9'
+    volume_max_microversion = 'latest'
 
     @classmethod
     def skip_checks(cls):
diff --git a/requirements.txt b/requirements.txt
index cc13aa9..5a4858d 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -5,5 +5,5 @@
 oslo.log>=3.36.0 # Apache-2.0
 oslo.config>=5.2.0 # Apache-2.0
 oslo.policy>=1.30.0 # Apache-2.0
-tempest>=17.1.0 # Apache-2.0
+tempest>=30.0.0 # Apache-2.0
 stevedore>=1.20.0 # Apache-2.0