[Tempest] Split up share migration tests to separate classes
All tempest tests that are located in single class always run
serially. And one of our classes that performs lots of different
share migration tests takes about 20 minutes. So, split them up
to separate classes to speed up test run.
Change-Id: I117484f56ef8de9b01db4818be0069e98b6c78fc
Closes-Bug: #1663574
diff --git a/manila_tempest_tests/tests/api/admin/test_migration.py b/manila_tempest_tests/tests/api/admin/test_migration.py
index 5e29fb8..bdc6248 100644
--- a/manila_tempest_tests/tests/api/admin/test_migration.py
+++ b/manila_tempest_tests/tests/api/admin/test_migration.py
@@ -27,9 +27,8 @@
CONF = config.CONF
-@ddt.ddt
-class MigrationNFSTest(base.BaseSharesAdminTest):
- """Tests Share Migration for NFS shares.
+class MigrationBase(base.BaseSharesAdminTest):
+ """Base test class for Share Migration.
Tests share migration in multi-backend environment.
@@ -53,11 +52,11 @@
configuration flag to be tested.
"""
- protocol = "nfs"
+ protocol = None
@classmethod
def resource_setup(cls):
- super(MigrationNFSTest, cls).resource_setup()
+ super(MigrationBase, cls).resource_setup()
if cls.protocol not in CONF.share.enable_protocols:
message = "%s tests are disabled." % cls.protocol
raise cls.skipException(message)
@@ -81,256 +80,6 @@
extra_specs=utils.get_configured_extra_specs(
variation='opposite_driver_modes'))
- @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
- @base.skip_if_microversion_lt("2.29")
- @ddt.data(True, False)
- def test_migration_cancel(self, force_host_assisted):
-
- self._check_migration_enabled(force_host_assisted)
-
- share = self.create_share(self.protocol)
- share = self.shares_v2_client.get_share(share['id'])
-
- share, dest_pool = self._setup_migration(share)
-
- task_state = (constants.TASK_STATE_DATA_COPYING_COMPLETED
- if force_host_assisted
- else constants.TASK_STATE_MIGRATION_DRIVER_PHASE1_DONE)
-
- share = self.migrate_share(
- share['id'], dest_pool, wait_for_status=task_state,
- force_host_assisted_migration=force_host_assisted)
-
- self._validate_migration_successful(
- dest_pool, share, task_state, complete=False)
-
- progress = self.shares_v2_client.migration_get_progress(share['id'])
-
- self.assertEqual(task_state, progress['task_state'])
- self.assertEqual(100, progress['total_progress'])
-
- share = self.migration_cancel(share['id'], dest_pool)
-
- progress = self.shares_v2_client.migration_get_progress(share['id'])
-
- self.assertEqual(
- constants.TASK_STATE_MIGRATION_CANCELLED, progress['task_state'])
- self.assertEqual(100, progress['total_progress'])
-
- self._validate_migration_successful(
- dest_pool, share, constants.TASK_STATE_MIGRATION_CANCELLED,
- complete=False)
-
- @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
- @base.skip_if_microversion_lt("2.29")
- @ddt.data(True, False)
- def test_migration_opposite_driver_modes(self, force_host_assisted):
-
- self._check_migration_enabled(force_host_assisted)
-
- share = self.create_share(self.protocol)
- share = self.shares_v2_client.get_share(share['id'])
-
- share, dest_pool = self._setup_migration(share, opposite=True)
-
- # If currently configured is DHSS=False,
- # then we need it for DHSS=True
- if not CONF.share.multitenancy_enabled:
-
- new_share_network_id = self.provide_share_network(
- self.shares_v2_client, self.os_admin.networks_client,
- isolated_creds_client=None, ignore_multitenancy_config=True)
-
- # If currently configured is DHSS=True,
- # then we must pass None for DHSS=False
- else:
- new_share_network_id = None
-
- old_share_network_id = share['share_network_id']
- old_share_type_id = share['share_type']
- new_share_type_id = self.new_type_opposite['share_type']['id']
-
- task_state = (constants.TASK_STATE_DATA_COPYING_COMPLETED
- if force_host_assisted
- else constants.TASK_STATE_MIGRATION_DRIVER_PHASE1_DONE)
-
- share = self.migrate_share(
- share['id'], dest_pool,
- force_host_assisted_migration=force_host_assisted,
- wait_for_status=task_state, new_share_type_id=new_share_type_id,
- new_share_network_id=new_share_network_id)
-
- self._validate_migration_successful(
- dest_pool, share, task_state, complete=False,
- share_network_id=old_share_network_id,
- share_type_id=old_share_type_id)
-
- progress = self.shares_v2_client.migration_get_progress(share['id'])
-
- self.assertEqual(task_state, progress['task_state'])
- self.assertEqual(100, progress['total_progress'])
-
- share = self.migration_complete(share['id'], dest_pool)
-
- progress = self.shares_v2_client.migration_get_progress(share['id'])
-
- self.assertEqual(
- constants.TASK_STATE_MIGRATION_SUCCESS, progress['task_state'])
- self.assertEqual(100, progress['total_progress'])
-
- self._validate_migration_successful(
- dest_pool, share, constants.TASK_STATE_MIGRATION_SUCCESS,
- complete=True, share_network_id=new_share_network_id,
- share_type_id=new_share_type_id)
-
- @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
- @base.skip_if_microversion_lt("2.29")
- @ddt.data(True, False)
- def test_migration_2phase(self, force_host_assisted):
-
- self._check_migration_enabled(force_host_assisted)
-
- share = self.create_share(self.protocol)
- share = self.shares_v2_client.get_share(share['id'])
-
- share, dest_pool = self._setup_migration(share)
-
- old_share_network_id = share['share_network_id']
- old_share_type_id = share['share_type']
- task_state, new_share_network_id, new_share_type_id = (
- self._get_migration_data(share, force_host_assisted))
-
- share = self.migrate_share(
- share['id'], dest_pool,
- force_host_assisted_migration=force_host_assisted,
- wait_for_status=task_state, new_share_type_id=new_share_type_id,
- new_share_network_id=new_share_network_id)
-
- self._validate_migration_successful(
- dest_pool, share, task_state, complete=False,
- share_network_id=old_share_network_id,
- share_type_id=old_share_type_id)
-
- progress = self.shares_v2_client.migration_get_progress(share['id'])
-
- self.assertEqual(task_state, progress['task_state'])
- self.assertEqual(100, progress['total_progress'])
-
- share = self.migration_complete(share['id'], dest_pool)
-
- progress = self.shares_v2_client.migration_get_progress(share['id'])
-
- self.assertEqual(
- constants.TASK_STATE_MIGRATION_SUCCESS, progress['task_state'])
- self.assertEqual(100, progress['total_progress'])
-
- self._validate_migration_successful(
- dest_pool, share, constants.TASK_STATE_MIGRATION_SUCCESS,
- complete=True, share_network_id=new_share_network_id,
- share_type_id=new_share_type_id)
- self._cleanup_share(share)
-
- @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
- @base.skip_if_microversion_lt("2.29")
- @testtools.skipUnless(CONF.share.run_extend_tests,
- 'Extend share tests are disabled.')
- @ddt.data(True, False)
- def test_extend_on_migrated_share(self, force_host_assisted):
- self._test_resize_post_migration(force_host_assisted, resize='extend')
-
- @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
- @base.skip_if_microversion_lt("2.29")
- @testtools.skipUnless(CONF.share.run_shrink_tests,
- 'Shrink share tests are disabled.')
- @ddt.data(True, False)
- def test_shrink_on_migrated_share(self, force_host_assisted):
- self._test_resize_post_migration(force_host_assisted, resize='shrink')
-
- @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
- @base.skip_if_microversion_lt("2.29")
- @testtools.skipUnless(CONF.share.run_snapshot_tests,
- 'Snapshot tests are disabled.')
- @testtools.skipUnless(CONF.share.run_driver_assisted_migration_tests,
- 'Driver-assisted migration tests are disabled.')
- @testtools.skipUnless(
- CONF.share.run_migration_with_preserve_snapshots_tests,
- 'Migration with preserve snapshots tests are disabled.')
- def test_migrating_share_with_snapshot(self):
- ss_type, __ = self._create_share_type_for_snapshot_capability()
-
- share = self.create_share(self.protocol, cleanup_in_class=False)
- share = self.shares_v2_client.get_share(share['id'])
-
- share, dest_pool = self._setup_migration(share)
- snapshot1 = self.create_snapshot_wait_for_active(
- share['id'], cleanup_in_class=False)
- snapshot2 = self.create_snapshot_wait_for_active(
- share['id'], cleanup_in_class=False)
-
- task_state, new_share_network_id, __ = self._get_migration_data(share)
-
- share = self.migrate_share(
- share['id'], dest_pool,
- wait_for_status=task_state,
- new_share_type_id=ss_type['share_type']['id'],
- new_share_network_id=new_share_network_id, preserve_snapshots=True)
-
- share = self.migration_complete(share['id'], dest_pool)
-
- self._validate_snapshot(share, snapshot1, snapshot2)
-
- @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
- @base.skip_if_microversion_lt("2.29")
- @testtools.skipUnless(CONF.share.run_snapshot_tests,
- 'Snapshot tests are disabled.')
- @testtools.skipUnless(CONF.share.run_driver_assisted_migration_tests,
- 'Driver-assisted migration tests are disabled.')
- @testtools.skipUnless(
- CONF.share.run_migration_with_preserve_snapshots_tests,
- 'Migration with preserve snapshots tests are disabled.')
- def test_migration_cancel_share_with_snapshot(self):
- share = self.create_share(self.protocol)
- share = self.shares_v2_client.get_share(share['id'])
-
- share, dest_pool = self._setup_migration(share)
- snapshot1 = self.create_snapshot_wait_for_active(share['id'])
- snapshot2 = self.create_snapshot_wait_for_active(share['id'])
-
- task_state, new_share_network_id, new_share_type_id = (
- self._get_migration_data(share))
-
- share = self.migrate_share(
- share['id'], dest_pool,
- wait_for_status=task_state, new_share_type_id=new_share_type_id,
- new_share_network_id=new_share_network_id, preserve_snapshots=True)
-
- share = self.migration_cancel(share['id'], dest_pool)
- self._validate_snapshot(share, snapshot1, snapshot2)
-
- @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
- @base.skip_if_microversion_lt("2.29")
- @testtools.skipUnless(CONF.share.run_snapshot_tests,
- 'Snapshot tests are disabled.')
- @ddt.data(True, False)
- def test_migrate_share_to_snapshot_capability_share_type(
- self, force_host_assisted):
- # Verify that share with no snapshot support type can be migrated
- # to new share type which supports the snapshot
- self._validate_share_migration_with_different_snapshot_capability_type(
- force_host_assisted, True)
-
- @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
- @base.skip_if_microversion_lt("2.29")
- @testtools.skipUnless(CONF.share.run_snapshot_tests,
- 'Snapshot tests are disabled.')
- @ddt.data(True, False)
- def test_migrate_share_to_no_snapshot_capability_share_type(
- self, force_host_assisted):
- # Verify that share with snapshot support type can be migrated
- # to new share type which doesn't support the snapshot
- self._validate_share_migration_with_different_snapshot_capability_type(
- force_host_assisted, False)
-
def _setup_migration(self, share, opposite=False):
if opposite:
@@ -590,3 +339,296 @@
# NOTE(Yogi1): Share needs to be cleaned up explicitly at the end of
# test otherwise, newly created share_network will not get cleaned up.
self.method_resources.insert(0, resource)
+
+
+@ddt.ddt
+class MigrationCancelNFSTest(MigrationBase):
+ protocol = "nfs"
+
+ @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
+ @base.skip_if_microversion_lt("2.29")
+ @ddt.data(True, False)
+ def test_migration_cancel(self, force_host_assisted):
+ self._check_migration_enabled(force_host_assisted)
+
+ share = self.create_share(self.protocol)
+ share = self.shares_v2_client.get_share(share['id'])
+ share, dest_pool = self._setup_migration(share)
+ task_state = (constants.TASK_STATE_DATA_COPYING_COMPLETED
+ if force_host_assisted
+ else constants.TASK_STATE_MIGRATION_DRIVER_PHASE1_DONE)
+
+ share = self.migrate_share(
+ share['id'], dest_pool, wait_for_status=task_state,
+ force_host_assisted_migration=force_host_assisted)
+
+ self._validate_migration_successful(
+ dest_pool, share, task_state, complete=False)
+
+ progress = self.shares_v2_client.migration_get_progress(share['id'])
+
+ self.assertEqual(task_state, progress['task_state'])
+ self.assertEqual(100, progress['total_progress'])
+
+ share = self.migration_cancel(share['id'], dest_pool)
+ progress = self.shares_v2_client.migration_get_progress(share['id'])
+
+ self.assertEqual(
+ constants.TASK_STATE_MIGRATION_CANCELLED, progress['task_state'])
+ self.assertEqual(100, progress['total_progress'])
+
+ self._validate_migration_successful(
+ dest_pool, share, constants.TASK_STATE_MIGRATION_CANCELLED,
+ complete=False)
+
+ @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
+ @base.skip_if_microversion_lt("2.29")
+ @testtools.skipUnless(
+ CONF.share.run_snapshot_tests, 'Snapshot tests are disabled.')
+ @testtools.skipUnless(
+ CONF.share.run_driver_assisted_migration_tests,
+ 'Driver-assisted migration tests are disabled.')
+ @testtools.skipUnless(
+ CONF.share.run_migration_with_preserve_snapshots_tests,
+ 'Migration with preserve snapshots tests are disabled.')
+ def test_migration_cancel_share_with_snapshot(self):
+ share = self.create_share(self.protocol)
+ share = self.shares_v2_client.get_share(share['id'])
+
+ share, dest_pool = self._setup_migration(share)
+ snapshot1 = self.create_snapshot_wait_for_active(share['id'])
+ snapshot2 = self.create_snapshot_wait_for_active(share['id'])
+
+ task_state, new_share_network_id, new_share_type_id = (
+ self._get_migration_data(share))
+
+ share = self.migrate_share(
+ share['id'], dest_pool,
+ wait_for_status=task_state, new_share_type_id=new_share_type_id,
+ new_share_network_id=new_share_network_id, preserve_snapshots=True)
+
+ share = self.migration_cancel(share['id'], dest_pool)
+ self._validate_snapshot(share, snapshot1, snapshot2)
+
+
+@ddt.ddt
+class MigrationOppositeDriverModesNFSTest(MigrationBase):
+ protocol = "nfs"
+
+ @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
+ @base.skip_if_microversion_lt("2.29")
+ @ddt.data(True, False)
+ def test_migration_opposite_driver_modes(self, force_host_assisted):
+ self._check_migration_enabled(force_host_assisted)
+
+ share = self.create_share(self.protocol)
+ share = self.shares_v2_client.get_share(share['id'])
+ share, dest_pool = self._setup_migration(share, opposite=True)
+
+ if not CONF.share.multitenancy_enabled:
+ # If currently configured is DHSS=False,
+ # then we need it for DHSS=True
+ new_share_network_id = self.provide_share_network(
+ self.shares_v2_client,
+ self.os_admin.networks_client,
+ isolated_creds_client=None,
+ ignore_multitenancy_config=True,
+ )
+ else:
+ # If currently configured is DHSS=True,
+ # then we must pass None for DHSS=False
+ new_share_network_id = None
+
+ old_share_network_id = share['share_network_id']
+ old_share_type_id = share['share_type']
+ new_share_type_id = self.new_type_opposite['share_type']['id']
+
+ task_state = (constants.TASK_STATE_DATA_COPYING_COMPLETED
+ if force_host_assisted
+ else constants.TASK_STATE_MIGRATION_DRIVER_PHASE1_DONE)
+
+ share = self.migrate_share(
+ share['id'], dest_pool,
+ force_host_assisted_migration=force_host_assisted,
+ wait_for_status=task_state, new_share_type_id=new_share_type_id,
+ new_share_network_id=new_share_network_id)
+
+ self._validate_migration_successful(
+ dest_pool, share, task_state, complete=False,
+ share_network_id=old_share_network_id,
+ share_type_id=old_share_type_id)
+
+ progress = self.shares_v2_client.migration_get_progress(share['id'])
+
+ self.assertEqual(task_state, progress['task_state'])
+ self.assertEqual(100, progress['total_progress'])
+
+ share = self.migration_complete(share['id'], dest_pool)
+
+ progress = self.shares_v2_client.migration_get_progress(share['id'])
+
+ self.assertEqual(
+ constants.TASK_STATE_MIGRATION_SUCCESS, progress['task_state'])
+ self.assertEqual(100, progress['total_progress'])
+
+ self._validate_migration_successful(
+ dest_pool, share, constants.TASK_STATE_MIGRATION_SUCCESS,
+ complete=True, share_network_id=new_share_network_id,
+ share_type_id=new_share_type_id)
+
+
+@ddt.ddt
+class MigrationTwoPhaseNFSTest(MigrationBase):
+ protocol = "nfs"
+
+ @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
+ @base.skip_if_microversion_lt("2.29")
+ @ddt.data(True, False)
+ def test_migration_2phase(self, force_host_assisted):
+ self._check_migration_enabled(force_host_assisted)
+
+ share = self.create_share(self.protocol)
+ share = self.shares_v2_client.get_share(share['id'])
+ share, dest_pool = self._setup_migration(share)
+
+ old_share_network_id = share['share_network_id']
+ old_share_type_id = share['share_type']
+ task_state, new_share_network_id, new_share_type_id = (
+ self._get_migration_data(share, force_host_assisted))
+
+ share = self.migrate_share(
+ share['id'], dest_pool,
+ force_host_assisted_migration=force_host_assisted,
+ wait_for_status=task_state, new_share_type_id=new_share_type_id,
+ new_share_network_id=new_share_network_id)
+
+ self._validate_migration_successful(
+ dest_pool, share, task_state, complete=False,
+ share_network_id=old_share_network_id,
+ share_type_id=old_share_type_id)
+
+ progress = self.shares_v2_client.migration_get_progress(share['id'])
+
+ self.assertEqual(task_state, progress['task_state'])
+ self.assertEqual(100, progress['total_progress'])
+
+ share = self.migration_complete(share['id'], dest_pool)
+
+ progress = self.shares_v2_client.migration_get_progress(share['id'])
+
+ self.assertEqual(
+ constants.TASK_STATE_MIGRATION_SUCCESS, progress['task_state'])
+ self.assertEqual(100, progress['total_progress'])
+
+ self._validate_migration_successful(
+ dest_pool, share, constants.TASK_STATE_MIGRATION_SUCCESS,
+ complete=True, share_network_id=new_share_network_id,
+ share_type_id=new_share_type_id)
+ self._cleanup_share(share)
+
+
+@ddt.ddt
+class MigrationWithShareExtendingNFSTest(MigrationBase):
+ protocol = "nfs"
+
+ @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
+ @base.skip_if_microversion_lt("2.29")
+ @testtools.skipUnless(
+ CONF.share.run_extend_tests, 'Extend share tests are disabled.')
+ @ddt.data(True, False)
+ def test_extend_on_migrated_share(self, force_host_assisted):
+ self._test_resize_post_migration(force_host_assisted, resize='extend')
+
+
+@ddt.ddt
+class MigrationWithShareShrinkingNFSTest(MigrationBase):
+ protocol = "nfs"
+
+ @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
+ @base.skip_if_microversion_lt("2.29")
+ @testtools.skipUnless(
+ CONF.share.run_shrink_tests, 'Shrink share tests are disabled.')
+ @ddt.data(True, False)
+ def test_shrink_on_migrated_share(self, force_host_assisted):
+ self._test_resize_post_migration(force_host_assisted, resize='shrink')
+
+
+@ddt.ddt
+class MigrationOfShareWithSnapshotNFSTest(MigrationBase):
+ protocol = "nfs"
+
+ @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
+ @base.skip_if_microversion_lt("2.29")
+ @testtools.skipUnless(
+ CONF.share.run_snapshot_tests, 'Snapshot tests are disabled.')
+ @testtools.skipUnless(
+ CONF.share.run_driver_assisted_migration_tests,
+ 'Driver-assisted migration tests are disabled.')
+ @testtools.skipUnless(
+ CONF.share.run_migration_with_preserve_snapshots_tests,
+ 'Migration with preserve snapshots tests are disabled.')
+ def test_migrating_share_with_snapshot(self):
+ ss_type, __ = self._create_share_type_for_snapshot_capability()
+
+ share = self.create_share(self.protocol, cleanup_in_class=False)
+ share = self.shares_v2_client.get_share(share['id'])
+
+ share, dest_pool = self._setup_migration(share)
+ snapshot1 = self.create_snapshot_wait_for_active(
+ share['id'], cleanup_in_class=False)
+ snapshot2 = self.create_snapshot_wait_for_active(
+ share['id'], cleanup_in_class=False)
+
+ task_state, new_share_network_id, __ = self._get_migration_data(share)
+
+ share = self.migrate_share(
+ share['id'], dest_pool,
+ wait_for_status=task_state,
+ new_share_type_id=ss_type['share_type']['id'],
+ new_share_network_id=new_share_network_id, preserve_snapshots=True)
+
+ share = self.migration_complete(share['id'], dest_pool)
+
+ self._validate_snapshot(share, snapshot1, snapshot2)
+
+
+@ddt.ddt
+class MigrationWithDifferentSnapshotSupportNFSTest(MigrationBase):
+ protocol = "nfs"
+
+ @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
+ @base.skip_if_microversion_lt("2.29")
+ @testtools.skipUnless(CONF.share.run_snapshot_tests,
+ 'Snapshot tests are disabled.')
+ @ddt.data(True, False)
+ def test_migrate_share_to_snapshot_capability_share_type(
+ self, force_host_assisted):
+ # Verify that share with no snapshot support type can be migrated
+ # to new share type which supports the snapshot
+ self._validate_share_migration_with_different_snapshot_capability_type(
+ force_host_assisted, True)
+
+ @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
+ @base.skip_if_microversion_lt("2.29")
+ @testtools.skipUnless(CONF.share.run_snapshot_tests,
+ 'Snapshot tests are disabled.')
+ @ddt.data(True, False)
+ def test_migrate_share_to_no_snapshot_capability_share_type(
+ self, force_host_assisted):
+ # Verify that share with snapshot support type can be migrated
+ # to new share type which doesn't support the snapshot
+ self._validate_share_migration_with_different_snapshot_capability_type(
+ force_host_assisted, False)
+
+
+# NOTE(u_glide): this function is required to exclude MigrationBase from
+# executed test cases.
+# See: https://docs.python.org/2/library/unittest.html#load-tests-protocol
+# for details.
+def load_tests(loader, tests, _):
+ result = []
+ for test_case in tests:
+ if not test_case._tests or type(test_case._tests[0]) is MigrationBase:
+ continue
+ result.append(test_case)
+ return loader.suiteClass(result)