From 85b3b61c6cc3c3d5f1ddeeb69d9a3a731b026bd8 Mon Sep 17 00:00:00 2001 From: Valeriy Ponomaryov Date: Fri, 10 Feb 2017 14:51:31 +0200 Subject: [PATCH] [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 --- .../tests/api/admin/test_migration.py | 552 ++++++++++-------- 1 file changed, 297 insertions(+), 255 deletions(-) diff --git a/manila_tempest_tests/tests/api/admin/test_migration.py b/manila_tempest_tests/tests/api/admin/test_migration.py index 5e29fb8c56..bdc62481a2 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 @@ from manila_tempest_tests import utils 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 @@ class MigrationNFSTest(base.BaseSharesAdminTest): 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 @@ class MigrationNFSTest(base.BaseSharesAdminTest): 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 @@ class MigrationNFSTest(base.BaseSharesAdminTest): # 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)