diff --git a/trove/tests/scenario/groups/module_group.py b/trove/tests/scenario/groups/module_group.py index f5ea7ce40e..921d2fd160 100644 --- a/trove/tests/scenario/groups/module_group.py +++ b/trove/tests/scenario/groups/module_group.py @@ -23,7 +23,11 @@ from trove.tests.scenario.runners import test_runners GROUP = "scenario.module_group" GROUP_MODULE_CREATE = "scenario.module_create_group" -GROUP_MODULE_INSTANCE = "scenario.module_instance_group" +GROUP_MODULE_INST = "scenario.module_inst_group" +GROUP_MODULE_INST_CREATE = "scenario.module_inst_create_group" +GROUP_MODULE_INST_CREATE_WAIT = "scenario.module_inst_create_wait_group" +GROUP_MODULE_INST_DELETE = "scenario.module_inst_delete_group" +GROUP_MODULE_INST_DELETE_WAIT = "scenario.module_inst_delete_wait_group" GROUP_MODULE_DELETE = "scenario.module_delete_group" @@ -41,283 +45,247 @@ class ModuleGroup(TestGroup): super(ModuleGroup, self).__init__( ModuleRunnerFactory.instance()) - @test(groups=[GROUP, GROUP_MODULE_CREATE]) + @test def module_delete_existing(self): """Delete all previous test modules.""" self.test_runner.run_module_delete_existing() - @test(groups=[GROUP, GROUP_MODULE_CREATE]) + @test def module_create_bad_type(self): """Ensure create module with invalid type fails.""" self.test_runner.run_module_create_bad_type() - @test(groups=[GROUP, GROUP_MODULE_CREATE]) + @test def module_create_non_admin_auto(self): """Ensure create auto_apply module for non-admin fails.""" self.test_runner.run_module_create_non_admin_auto() - @test(groups=[GROUP, GROUP_MODULE_CREATE]) + @test def module_create_non_admin_all_tenant(self): """Ensure create all tenant module for non-admin fails.""" self.test_runner.run_module_create_non_admin_all_tenant() - @test(groups=[GROUP, GROUP_MODULE_CREATE]) + @test def module_create_non_admin_hidden(self): """Ensure create hidden module for non-admin fails.""" self.test_runner.run_module_create_non_admin_hidden() - @test(groups=[GROUP, GROUP_MODULE_CREATE]) + @test def module_create_bad_datastore(self): """Ensure create module with invalid datastore fails.""" self.test_runner.run_module_create_bad_datastore() - @test(groups=[GROUP, GROUP_MODULE_CREATE]) + @test def module_create_bad_datastore_version(self): """Ensure create module with invalid datastore_version fails.""" self.test_runner.run_module_create_bad_datastore_version() - @test(groups=[GROUP, GROUP_MODULE_CREATE]) + @test def module_create_missing_datastore(self): """Ensure create module with missing datastore fails.""" self.test_runner.run_module_create_missing_datastore() - @test(groups=[GROUP, GROUP_MODULE_CREATE], - runs_after=[module_delete_existing]) + @test(runs_after=[module_delete_existing]) def module_create(self): """Check that create module works.""" self.test_runner.run_module_create() - @test(groups=[GROUP, GROUP_MODULE_CREATE], - depends_on=[module_create]) + @test(depends_on=[module_create]) def module_create_dupe(self): """Ensure create with duplicate info fails.""" self.test_runner.run_module_create_dupe() - @test(groups=[GROUP, GROUP_MODULE_CREATE], - runs_after=[module_create]) + @test(runs_after=[module_create]) def module_create_bin(self): """Check that create module with binary contents works.""" self.test_runner.run_module_create_bin() - @test(groups=[GROUP, GROUP_MODULE_CREATE], - runs_after=[module_create_bin]) + @test(runs_after=[module_create_bin]) def module_create_bin2(self): """Check that create module with other binary contents works.""" self.test_runner.run_module_create_bin2() - @test(groups=[GROUP, GROUP_MODULE_CREATE], - depends_on=[module_create]) + @test(depends_on=[module_create]) def module_show(self): """Check that show module works.""" self.test_runner.run_module_show() - @test(groups=[GROUP, GROUP_MODULE_CREATE], - depends_on=[module_create]) + @test(depends_on=[module_create]) def module_show_unauth_user(self): """Ensure that show module for unauth user fails.""" self.test_runner.run_module_show_unauth_user() - @test(groups=[GROUP, GROUP_MODULE_CREATE], - depends_on=[module_create, module_create_bin, module_create_bin2]) + @test(depends_on=[module_create, module_create_bin, module_create_bin2]) def module_list(self): """Check that list modules works.""" self.test_runner.run_module_list() - @test(groups=[GROUP, GROUP_MODULE_CREATE], - depends_on=[module_create, module_create_bin, module_create_bin2]) + @test(depends_on=[module_create, module_create_bin, module_create_bin2]) def module_list_unauth_user(self): """Ensure that list module for unauth user fails.""" self.test_runner.run_module_list_unauth_user() - @test(groups=[GROUP, GROUP_MODULE_CREATE], - depends_on=[module_create, module_create_bin, module_create_bin2], + @test(depends_on=[module_create, module_create_bin, module_create_bin2], runs_after=[module_list]) def module_create_admin_all(self): """Check that create module works with all admin options.""" self.test_runner.run_module_create_admin_all() - @test(groups=[GROUP, GROUP_MODULE_CREATE], - depends_on=[module_create, module_create_bin, module_create_bin2], + @test(depends_on=[module_create, module_create_bin, module_create_bin2], runs_after=[module_create_admin_all]) def module_create_admin_hidden(self): """Check that create module works with hidden option.""" self.test_runner.run_module_create_admin_hidden() - @test(groups=[GROUP, GROUP_MODULE_CREATE], - depends_on=[module_create, module_create_bin, module_create_bin2], + @test(depends_on=[module_create, module_create_bin, module_create_bin2], runs_after=[module_create_admin_hidden]) def module_create_admin_auto(self): """Check that create module works with auto option.""" self.test_runner.run_module_create_admin_auto() - @test(groups=[GROUP, GROUP_MODULE_CREATE], - depends_on=[module_create, module_create_bin, module_create_bin2], + @test(depends_on=[module_create, module_create_bin, module_create_bin2], runs_after=[module_create_admin_auto]) def module_create_admin_live_update(self): """Check that create module works with live-update option.""" self.test_runner.run_module_create_admin_live_update() - @test(groups=[GROUP, GROUP_MODULE_CREATE], - depends_on=[module_create, module_create_bin, module_create_bin2], + @test(depends_on=[module_create, module_create_bin, module_create_bin2], runs_after=[module_create_admin_live_update]) def module_create_datastore(self): """Check that create module with datastore works.""" self.test_runner.run_module_create_datastore() - @test(groups=[GROUP, GROUP_MODULE_CREATE], - depends_on=[module_create, module_create_bin, module_create_bin2], + @test(depends_on=[module_create, module_create_bin, module_create_bin2], runs_after=[module_create_datastore]) def module_create_ds_version(self): """Check that create module with ds version works.""" self.test_runner.run_module_create_ds_version() - @test(groups=[GROUP, GROUP_MODULE_CREATE], - depends_on=[module_create, module_create_bin, module_create_bin2], + @test(depends_on=[module_create, module_create_bin, module_create_bin2], runs_after=[module_create_ds_version]) def module_create_all_tenant(self): """Check that create 'all' tenants with datastore module works.""" self.test_runner.run_module_create_all_tenant() - @test(groups=[GROUP, GROUP_MODULE_CREATE], - depends_on=[module_create, module_create_bin, module_create_bin2], + @test(depends_on=[module_create, module_create_bin, module_create_bin2], runs_after=[module_create_all_tenant, module_list_unauth_user]) def module_create_different_tenant(self): """Check that create with same name on different tenant works.""" self.test_runner.run_module_create_different_tenant() - @test(groups=[GROUP, GROUP_MODULE_CREATE], - depends_on=[module_create_all_tenant], + @test(depends_on=[module_create_all_tenant], runs_after=[module_create_different_tenant]) def module_list_again(self): """Check that list modules skips invisible modules.""" self.test_runner.run_module_list_again() - @test(groups=[GROUP, GROUP_MODULE_CREATE], - depends_on=[module_create_ds_version], + @test(depends_on=[module_create_ds_version], runs_after=[module_list_again]) def module_list_ds(self): """Check that list modules by datastore works.""" self.test_runner.run_module_list_ds() - @test(groups=[GROUP, GROUP_MODULE_CREATE], - depends_on=[module_create_ds_version], + @test(depends_on=[module_create_ds_version], runs_after=[module_list_ds]) def module_list_ds_all(self): """Check that list modules by all datastores works.""" self.test_runner.run_module_list_ds_all() - @test(groups=[GROUP, GROUP_MODULE_CREATE], - depends_on=[module_create_admin_hidden]) + @test(depends_on=[module_create_admin_hidden]) def module_show_invisible(self): """Ensure that show invisible module for non-admin fails.""" self.test_runner.run_module_show_invisible() - @test(groups=[GROUP, GROUP_MODULE_CREATE], - depends_on=[module_create_all_tenant], + @test(depends_on=[module_create_all_tenant], runs_after=[module_create_different_tenant]) def module_list_admin(self): """Check that list modules for admin works.""" self.test_runner.run_module_list_admin() - @test(groups=[GROUP, GROUP_MODULE_CREATE], - depends_on=[module_create], + @test(depends_on=[module_create], runs_after=[module_show]) def module_update(self): """Check that update module works.""" self.test_runner.run_module_update() - @test(groups=[GROUP, GROUP_MODULE_CREATE], - depends_on=[module_update]) + @test(depends_on=[module_update]) def module_update_same_contents(self): """Check that update module with same contents works.""" self.test_runner.run_module_update_same_contents() - @test(groups=[GROUP, GROUP_MODULE_CREATE], - depends_on=[module_update], + @test(depends_on=[module_update], runs_after=[module_update_same_contents]) def module_update_auto_toggle(self): """Check that update module works for auto apply toggle.""" self.test_runner.run_module_update_auto_toggle() - @test(groups=[GROUP, GROUP_MODULE_CREATE], - depends_on=[module_update], + @test(depends_on=[module_update], runs_after=[module_update_auto_toggle]) def module_update_all_tenant_toggle(self): """Check that update module works for all tenant toggle.""" self.test_runner.run_module_update_all_tenant_toggle() - @test(groups=[GROUP, GROUP_MODULE_CREATE], - depends_on=[module_update], + @test(depends_on=[module_update], runs_after=[module_update_all_tenant_toggle]) def module_update_invisible_toggle(self): """Check that update module works for invisible toggle.""" self.test_runner.run_module_update_invisible_toggle() - @test(groups=[GROUP, GROUP_MODULE_CREATE], - depends_on=[module_update], + @test(depends_on=[module_update], runs_after=[module_update_invisible_toggle]) def module_update_unauth(self): """Ensure update module for unauth user fails.""" self.test_runner.run_module_update_unauth() - @test(groups=[GROUP, GROUP_MODULE_CREATE], - depends_on=[module_update], + @test(depends_on=[module_update], runs_after=[module_update_invisible_toggle]) def module_update_non_admin_auto(self): """Ensure update module to auto_apply for non-admin fails.""" self.test_runner.run_module_update_non_admin_auto() - @test(groups=[GROUP, GROUP_MODULE_CREATE], - depends_on=[module_update], + @test(depends_on=[module_update], runs_after=[module_update_invisible_toggle]) def module_update_non_admin_auto_off(self): """Ensure update module to auto_apply off for non-admin fails.""" self.test_runner.run_module_update_non_admin_auto_off() - @test(groups=[GROUP, GROUP_MODULE_CREATE], - depends_on=[module_update], + @test(depends_on=[module_update], runs_after=[module_update_invisible_toggle]) def module_update_non_admin_auto_any(self): """Ensure any update module to auto_apply for non-admin fails.""" self.test_runner.run_module_update_non_admin_auto_any() - @test(groups=[GROUP, GROUP_MODULE_CREATE], - depends_on=[module_update], + @test(depends_on=[module_update], runs_after=[module_update_invisible_toggle]) def module_update_non_admin_all_tenant(self): """Ensure update module to all tenant for non-admin fails.""" self.test_runner.run_module_update_non_admin_all_tenant() - @test(groups=[GROUP, GROUP_MODULE_CREATE], - depends_on=[module_update], + @test(depends_on=[module_update], runs_after=[module_update_invisible_toggle]) def module_update_non_admin_all_tenant_off(self): """Ensure update module to all tenant off for non-admin fails.""" self.test_runner.run_module_update_non_admin_all_tenant_off() - @test(groups=[GROUP, GROUP_MODULE_CREATE], - depends_on=[module_update], + @test(depends_on=[module_update], runs_after=[module_update_invisible_toggle]) def module_update_non_admin_all_tenant_any(self): """Ensure any update module to all tenant for non-admin fails.""" self.test_runner.run_module_update_non_admin_all_tenant_any() - @test(groups=[GROUP, GROUP_MODULE_CREATE], - depends_on=[module_update], + @test(depends_on=[module_update], runs_after=[module_update_invisible_toggle]) def module_update_non_admin_invisible(self): """Ensure update module to invisible for non-admin fails.""" self.test_runner.run_module_update_non_admin_invisible() - @test(groups=[GROUP, GROUP_MODULE_CREATE], - depends_on=[module_update], + @test(depends_on=[module_update], runs_after=[module_update_invisible_toggle]) def module_update_non_admin_invisible_off(self): """Ensure update module to invisible off for non-admin fails.""" self.test_runner.run_module_update_non_admin_invisible_off() - @test(groups=[GROUP, GROUP_MODULE_CREATE], - depends_on=[module_update], + @test(depends_on=[module_update], runs_after=[module_update_invisible_toggle]) def module_update_non_admin_invisible_any(self): """Ensure any update module to invisible for non-admin fails.""" @@ -326,153 +294,167 @@ class ModuleGroup(TestGroup): @test(depends_on_groups=[instance_create_group.GROUP, GROUP_MODULE_CREATE], - groups=[GROUP, GROUP_MODULE_INSTANCE]) -class ModuleInstanceGroup(TestGroup): - """Test Instance Module functionality.""" + groups=[GROUP, GROUP_MODULE_INST, GROUP_MODULE_INST_CREATE]) +class ModuleInstanceCreateGroup(TestGroup): + """Test Instance Module Create functionality.""" def __init__(self): - super(ModuleInstanceGroup, self).__init__( + super(ModuleInstanceCreateGroup, self).__init__( ModuleRunnerFactory.instance()) - @test(groups=[GROUP, GROUP_MODULE_INSTANCE]) + @test def module_list_instance_empty(self): """Check that the instance has no modules associated.""" self.test_runner.run_module_list_instance_empty() - @test(groups=[GROUP, GROUP_MODULE_INSTANCE], - runs_after=[module_list_instance_empty]) + @test(runs_after=[module_list_instance_empty]) def module_instances_empty(self): """Check that the module hasn't been applied to any instances.""" self.test_runner.run_module_instances_empty() - @test(groups=[GROUP, GROUP_MODULE_INSTANCE], - runs_after=[module_instances_empty]) + @test(runs_after=[module_instances_empty]) def module_query_empty(self): """Check that the instance has no modules applied.""" self.test_runner.run_module_query_empty() - @test(groups=[GROUP, GROUP_MODULE_INSTANCE], - runs_after=[module_query_empty]) + @test(runs_after=[module_query_empty]) def module_apply(self): """Check that module-apply works.""" self.test_runner.run_module_apply() - @test(groups=[GROUP, GROUP_MODULE_INSTANCE], - depends_on=[module_apply]) + @test(depends_on=[module_apply]) def module_list_instance_after_apply(self): """Check that the instance has one module associated.""" self.test_runner.run_module_list_instance_after_apply() - @test(groups=[GROUP, GROUP_MODULE_INSTANCE], - depends_on=[module_apply]) + @test(depends_on=[module_apply]) def module_query_after_apply(self): """Check that module-query works.""" self.test_runner.run_module_query_after_apply() - @test(groups=[GROUP, GROUP_MODULE_INSTANCE], - depends_on=[module_apply], + @test(depends_on=[module_apply], runs_after=[module_query_after_apply]) def create_inst_with_mods(self): """Check that creating an instance with modules works.""" self.test_runner.run_create_inst_with_mods() - @test(groups=[GROUP, GROUP_MODULE_INSTANCE], - depends_on=[module_apply]) + @test(depends_on=[module_apply]) def module_delete_applied(self): """Ensure that deleting an applied module fails.""" self.test_runner.run_module_delete_applied() - @test(groups=[GROUP, GROUP_MODULE_INSTANCE], - depends_on=[module_apply], + @test(depends_on=[module_apply], runs_after=[module_list_instance_after_apply, module_query_after_apply]) def module_remove(self): """Check that module-remove works.""" self.test_runner.run_module_remove() - @test(groups=[GROUP, GROUP_MODULE_INSTANCE], - depends_on=[module_remove]) + @test(depends_on=[module_remove]) def module_query_empty_after(self): """Check that the instance has no modules applied after remove.""" self.test_runner.run_module_query_empty() - @test(groups=[GROUP, GROUP_MODULE_INSTANCE], - depends_on=[module_remove], + @test(depends_on=[module_remove], runs_after=[module_query_empty_after]) def module_apply_again(self): """Check that module-apply works a second time.""" self.test_runner.run_module_apply() - @test(groups=[GROUP, GROUP_MODULE_INSTANCE], - depends_on=[module_apply], - runs_after=[module_query_empty_after]) + @test(depends_on=[module_apply], + runs_after=[module_apply_again]) def module_query_after_apply_again(self): """Check that module-query works after second apply.""" self.test_runner.run_module_query_after_apply() - @test(groups=[GROUP, GROUP_MODULE_INSTANCE], - depends_on=[module_apply_again], + @test(depends_on=[module_apply_again], runs_after=[module_query_after_apply_again]) def module_remove_again(self): """Check that module-remove works again.""" self.test_runner.run_module_remove() - @test(groups=[GROUP, GROUP_MODULE_INSTANCE], - depends_on=[module_remove_again]) + @test(depends_on=[module_remove_again]) def module_query_empty_after_again(self): """Check that the instance has no modules applied after remove.""" self.test_runner.run_module_query_empty() - @test(groups=[GROUP, GROUP_MODULE_INSTANCE], - depends_on=[create_inst_with_mods], - runs_after=[module_query_empty_after_again]) + +@test(depends_on_groups=[GROUP_MODULE_INST_CREATE], + groups=[GROUP, GROUP_MODULE_INST, GROUP_MODULE_INST_CREATE_WAIT]) +class ModuleInstanceCreateWaitGroup(TestGroup): + """Test that Instance Module Create Completes.""" + + def __init__(self): + super(ModuleInstanceCreateWaitGroup, self).__init__( + ModuleRunnerFactory.instance()) + + @test def wait_for_inst_with_mods(self): """Wait for create instance with modules to finish.""" self.test_runner.run_wait_for_inst_with_mods() - @test(groups=[GROUP, GROUP_MODULE_INSTANCE], - depends_on=[wait_for_inst_with_mods]) + @test(depends_on=[wait_for_inst_with_mods]) def module_query_after_inst_create(self): """Check that module-query works on new instance.""" self.test_runner.run_module_query_after_inst_create() - @test(groups=[GROUP, GROUP_MODULE_INSTANCE], - depends_on=[wait_for_inst_with_mods], + @test(depends_on=[wait_for_inst_with_mods], runs_after=[module_query_after_inst_create]) def module_retrieve_after_inst_create(self): """Check that module-retrieve works on new instance.""" self.test_runner.run_module_retrieve_after_inst_create() - @test(groups=[GROUP, GROUP_MODULE_INSTANCE], - depends_on=[wait_for_inst_with_mods], + @test(depends_on=[wait_for_inst_with_mods], runs_after=[module_retrieve_after_inst_create]) def module_query_after_inst_create_admin(self): """Check that module-query works for admin.""" self.test_runner.run_module_query_after_inst_create_admin() - @test(groups=[GROUP, GROUP_MODULE_INSTANCE], - depends_on=[wait_for_inst_with_mods], + @test(depends_on=[wait_for_inst_with_mods], runs_after=[module_query_after_inst_create_admin]) def module_retrieve_after_inst_create_admin(self): """Check that module-retrieve works for admin.""" self.test_runner.run_module_retrieve_after_inst_create_admin() - @test(groups=[GROUP, GROUP_MODULE_INSTANCE], - depends_on=[wait_for_inst_with_mods], + @test(depends_on=[wait_for_inst_with_mods], runs_after=[module_retrieve_after_inst_create_admin]) def module_delete_auto_applied(self): """Ensure that module-delete on auto-applied module fails.""" self.test_runner.run_module_delete_auto_applied() - @test(groups=[GROUP, GROUP_MODULE_INSTANCE], - depends_on=[wait_for_inst_with_mods], - runs_after=[module_delete_auto_applied]) + +@test(depends_on_groups=[GROUP_MODULE_INST_CREATE_WAIT], + groups=[GROUP, GROUP_MODULE_INST, GROUP_MODULE_INST_DELETE]) +class ModuleInstanceDeleteGroup(TestGroup): + """Test Instance Module Delete functionality.""" + + def __init__(self): + super(ModuleInstanceDeleteGroup, self).__init__( + ModuleRunnerFactory.instance()) + + @test def delete_inst_with_mods(self): """Check that instance with module can be deleted.""" self.test_runner.run_delete_inst_with_mods() +@test(depends_on_groups=[GROUP_MODULE_INST_DELETE], + groups=[GROUP, GROUP_MODULE_INST, GROUP_MODULE_INST_DELETE_WAIT]) +class ModuleInstanceDeleteWaitGroup(TestGroup): + """Test that Instance Module Delete Completes.""" + + def __init__(self): + super(ModuleInstanceDeleteWaitGroup, self).__init__( + ModuleRunnerFactory.instance()) + + @test + def wait_for_delete_inst_with_mods(self): + """Wait until the instance with module is gone.""" + self.test_runner.run_wait_for_delete_inst_with_mods() + + @test(depends_on_groups=[GROUP_MODULE_CREATE], + runs_after_groups=[GROUP_MODULE_INST_DELETE_WAIT], groups=[GROUP, GROUP_MODULE_DELETE]) class ModuleDeleteGroup(TestGroup): """Test Module Delete functionality.""" diff --git a/trove/tests/scenario/runners/module_runners.py b/trove/tests/scenario/runners/module_runners.py index 5b54216984..e117427cee 100644 --- a/trove/tests/scenario/runners/module_runners.py +++ b/trove/tests/scenario/runners/module_runners.py @@ -32,7 +32,7 @@ class ModuleRunner(TestRunner): self.TIMEOUT_MODULE_APPLY = 60 * 10 super(ModuleRunner, self).__init__( - sleep_time=10, timeout=self.TIMEOUT_MODULE_APPLY) + timeout=self.TIMEOUT_MODULE_APPLY) self.MODULE_CONTENTS_PATTERN = 'Message=%s\n' self.MODULE_MESSAGE_PATTERN = 'Hello World from: %s' @@ -958,17 +958,16 @@ class ModuleRunner(TestRunner): expected_exception, expected_http_code, self.auth_client.modules.delete, module.id) - def run_delete_inst_with_mods(self, expected_last_state=['SHUTDOWN'], - expected_http_code=202): - self.assert_delete_instance( - self.mod_inst_id, - expected_last_state, expected_http_code) + def run_delete_inst_with_mods(self, expected_http_code=202): + self.assert_delete_instance(self.mod_inst_id, expected_http_code) - def assert_delete_instance( - self, instance_id, expected_last_state, expected_http_code): + def assert_delete_instance(self, instance_id, expected_http_code): self.auth_client.instances.delete(instance_id) self.assert_client_code(expected_http_code) - self.assert_all_gone(instance_id, expected_last_state) + + def run_wait_for_delete_inst_with_mods( + self, expected_last_state=['SHUTDOWN']): + self.assert_all_gone(self.mod_inst_id, expected_last_state) # ModuleDeleteGroup methods def run_module_delete_non_existent(