def _make_group_strict(ctx): if ctx.registered_undefined_hook or (ctx.registered_defined_hook and not ctx.defined_hook): raises_context = pytest.raises(UndefinedHook) else: raises_context = _noop() with raises_context: gossip.get_or_create_group("group").set_strict() ctx.made_strict = True
def _make_group_strict(ctx): raises_context = _noop() if ctx.registered_hook: if not ctx.defined_hook: raises_context = pytest.raises(UndefinedHook) elif not ctx.is_tags_valid_for_strict_group: raises_context = pytest.raises(UnsupportedHookTags) with raises_context: gossip.get_or_create_group("group").set_strict() ctx.made_strict = True
def test_undefined_hooks_have_no_side_effects(): assert gossip.get_all_registrations() == [] gossip.get_or_create_group('group').set_strict() for _ in range(5): # pylint: disable=redefined-builtin with pytest.raises(UndefinedHook): @gossip.register('group.hook') def handler(): # pylint: disable=unused-variable pass assert gossip.get_all_registrations() == []
def test_make_group_not_strict(): group = gossip.get_or_create_group('group') subgroup = gossip.get_or_create_group('group.sub') assert not group.is_strict() assert not subgroup.is_strict() group.set_strict() assert group.is_strict() assert subgroup.is_strict() group.set_strict(False) assert not group.is_strict() assert not subgroup.is_strict()
def test_exception_on_register(blueprint): gossip.get_or_create_group('group').set_strict() @blueprint.register('group.a') def func(): # pylint: disable=unused-variable pass @blueprint.register('x') def func(): # pylint: disable=function-redefined pass with pytest.raises(UndefinedHook): blueprint.install() assert len(gossip.get_all_registrations()) == 0
def test_strict_hook_without_argument_defs_doesnt_validate(request): group = gossip.get_or_create_group('somegroup') group.set_strict() request.addfinalizer(group.undefine) hook = gossip.define('somegroup.somehook') request.addfinalizer(hook.undefine) hook.trigger(kwargs={'bla': 2, 'some': 'string', 'and_an': object()})
def test_get_or_create_group(): group_name = "group_name" with pytest.raises(GroupNotFound): gossip.get_group(group_name) group = gossip.get_or_create_group(group_name) assert isinstance(group, gossip.groups.Group) assert group is gossip.get_group(group_name)
def validating_hook(request): group = gossip.get_or_create_group('some_strict_group') group.set_strict() request.addfinalizer(group.undefine) hook = gossip.define('some_strict_group.some_hook', arg_names={'x': None, 'y': int, 'z': (str, float)}) request.addfinalizer(hook.undefine) return hook
def test_register_custom_hooks_strict_group(): initially_installed = list(plugins.manager.get_installed_plugins()) hook_name = "some_group.some_hook" gossip.get_or_create_group("some_group").set_strict() class MyPlugin(PluginInterface): def get_name(self): return "plugin" @plugins.registers_on(hook_name) def unknown(self): pass with pytest.raises(IncompatiblePlugin): plugins.manager.install(MyPlugin(), activate=True) assert list(plugins.manager.get_installed_plugins()) == initially_installed
def test_set_strict_with_subgroups_and_tags(hook_name): def handler(): pass main_group_name = hook_name.partition(".")[0] gossip.register(handler, hook_name) with pytest.raises(UndefinedHook): gossip.get_or_create_group(main_group_name).set_strict() hook = gossip.define(hook_name, tags=("some_tag", "other_tag")) illegal_tags_hook = gossip.define(".".join([hook.group.full_name, "hook_with_illegal_tags"])) gossip.register(handler, illegal_tags_hook.full_name, tags=("fake_tag")) with pytest.raises(UnsupportedHookTags): gossip.get_or_create_group(main_group_name).set_strict() illegal_tags_hook.unregister_all() gossip.get_or_create_group(main_group_name).set_strict() with pytest.raises(UnsupportedHookTags): @gossip.register(hook_name, tags=("fake_tag",)) def handler2(): # pylint: disable=unused-variable pass with pytest.raises(UnsupportedHookTags): gossip.trigger_with_tags(hook_name, tags=("fake_tag",)) gossip.trigger_with_tags(hook_name, tags=("some_tag", "other_tag"))
def validating_hook(request): group = gossip.get_or_create_group('some_strict_group') group.set_strict() request.addfinalizer(group.undefine) hook = gossip.define('some_strict_group.some_hook', arg_names={ 'x': None, 'y': int, 'z': (str, float) }) request.addfinalizer(hook.undefine) return hook
def _install_hooks(): import gossip # Define systems objects operation hooks obj_type_name = set(tag for sys in (InfiniBox, IZBox) for obj_cls in sys.OBJECT_TYPES for tag in obj_cls._get_tags_for_object_operations(sys)) for hook_name_template in (_SDK_HOOK('pre_object_{0}'), _SDK_HOOK('post_object_{0}')): for operation in ('creation', 'deletion', 'update'): full_hook_name = hook_name_template.format(operation) gossip.define(full_hook_name, tags=obj_type_name) gossip.define(_SDK_HOOK('object_operation_failure'), tags=obj_type_name) gossip.define(_SDK_HOOK('object_creation_failure'), tags=obj_type_name) gossip.define(_SDK_HOOK("begin_fork"), tags=['infinibox', 'volume', 'filesystem']) gossip.define(_SDK_HOOK("cancel_fork"), tags=['infinibox', 'volume', 'filesystem']) gossip.define(_SDK_HOOK("finish_fork"), tags=['infinibox', 'volume', 'filesystem']) gossip.define(_SDK_HOOK('pre_data_restore'), tags=['infinibox', 'volume', 'filesystem']) gossip.define(_SDK_HOOK('post_data_restore'), tags=['infinibox', 'volume', 'filesystem']) gossip.define(_SDK_HOOK('data_restore_failure'), tags=['infinibox', 'volume', 'filesystem']) gossip.define(_SDK_HOOK('pre_creation_data_validation'), tags=['infinibox', 'volume', 'filesystem']) gossip.define(_SDK_HOOK('pre_fields_update'), tags=['infinibox']) gossip.define(_SDK_HOOK('pre_cons_group_add_member'), tags=['infinibox']) gossip.define(_SDK_HOOK('post_cons_group_add_member'), tags=['infinibox']) gossip.define(_SDK_HOOK('replica_snapshot_created'), tags=['infinibox']) gossip.define(_SDK_HOOK('replica_after_change_role'), tags=['infinibox']) gossip.define(_SDK_HOOK('before_api_request')) gossip.define(_SDK_HOOK('after_api_request')) gossip.define(_SDK_HOOK('after_login')) gossip.get_or_create_group('infinidat.sdk').set_strict()
def _install_hooks(): import gossip # Define systems objects operation hooks. TreeQ is explicitly added separately, as, being a special type of object, # it is not in OBJECT_TYPES. obj_type_names = set( tag for sys in (InfiniBox, ) for obj_cls in sys.OBJECT_TYPES + [TreeQ] for tag in obj_cls.get_tags_for_object_operations(sys)) for hook_name_template in (_SDK_HOOK('pre_object_{}'), _SDK_HOOK('post_object_{}'), _SDK_HOOK('object_{}_failure')): for operation in ('creation', 'deletion', 'update'): full_hook_name = hook_name_template.format(operation) gossip.define(full_hook_name, tags=obj_type_names) gossip.define(_SDK_HOOK('object_operation_failure'), tags=obj_type_names) gossip.define(_SDK_HOOK('pre_treeq_creation'), tags=['infinibox', 'treeq']) gossip.define(_SDK_HOOK('post_treeq_creation'), tags=['infinibox', 'treeq']) gossip.define(_SDK_HOOK('treeq_creation_failure'), tags=['infinibox', 'treeq']) gossip.define(_SDK_HOOK("begin_fork"), tags=['infinibox', 'volume', 'filesystem']) gossip.define(_SDK_HOOK("cancel_fork"), tags=['infinibox', 'volume', 'filesystem']) gossip.define(_SDK_HOOK("finish_fork"), tags=['infinibox', 'volume', 'filesystem']) gossip.define(_SDK_HOOK('pre_data_restore'), tags=['infinibox', 'volume', 'filesystem']) gossip.define(_SDK_HOOK('post_data_restore'), tags=['infinibox', 'volume', 'filesystem']) gossip.define(_SDK_HOOK('data_restore_failure'), tags=['infinibox', 'volume', 'filesystem']) gossip.define(_SDK_HOOK('pre_object_restore'), tags=['infinibox', 'volume', 'filesystem']) gossip.define(_SDK_HOOK('post_object_restore'), tags=['infinibox', 'volume', 'filesystem']) gossip.define(_SDK_HOOK('object_restore_failure'), tags=['infinibox', 'volume', 'filesystem']) gossip.define(_SDK_HOOK('pre_pool_move'), tags=['infinibox', 'volume', 'filesystem', 'cons_group']) gossip.define(_SDK_HOOK('post_pool_move'), tags=['infinibox', 'volume', 'filesystem', 'cons_group']) gossip.define(_SDK_HOOK('pool_move_failure'), tags=['infinibox', 'volume', 'filesystem', 'cons_group']) gossip.define(_SDK_HOOK('pre_cons_group_deletion'), tags=['infinibox', 'cons_group']) gossip.define(_SDK_HOOK('post_cons_group_deletion'), tags=['infinibox', 'cons_group']) gossip.define(_SDK_HOOK('cons_group_deletion_failure'), tags=['infinibox', 'cons_group']) gossip.define(_SDK_HOOK('pre_entity_child_creation'), tags=['infinibox', 'volume', 'filesystem', 'cons_group']) gossip.define(_SDK_HOOK('post_entity_child_creation'), tags=['infinibox', 'volume', 'filesystem', 'cons_group']) gossip.define(_SDK_HOOK('entity_child_creation_failure'), tags=['infinibox', 'volume', 'filesystem', 'cons_group']) gossip.define(_SDK_HOOK('pre_creation_data_validation'), tags=obj_type_names) gossip.define(_SDK_HOOK('pre_fields_update'), tags=obj_type_names) gossip.define(_SDK_HOOK('pre_cons_group_add_member'), tags=['infinibox']) gossip.define(_SDK_HOOK('post_cons_group_add_member'), tags=['infinibox']) gossip.define(_SDK_HOOK('cons_group_add_member_failure'), tags=['infinibox']) gossip.define(_SDK_HOOK('pre_cons_group_remove_member'), tags=['infinibox']) gossip.define(_SDK_HOOK('post_cons_group_remove_member'), tags=['infinibox']) gossip.define(_SDK_HOOK('cons_group_remove_member_failure'), tags=['infinibox']) gossip.define(_SDK_HOOK('replica_snapshot_created'), tags=['infinibox']) gossip.define(_SDK_HOOK('replica_deleted'), tags=['infinibox']) gossip.define(_SDK_HOOK('pre_replication_snapshot_expose'), tags=['volume', 'filesystem', 'cons_group']) gossip.define(_SDK_HOOK('post_replication_snapshot_expose'), tags=['volume', 'filesystem', 'cons_group']) gossip.define(_SDK_HOOK('replication_snapshot_expose_failure'), tags=['volume', 'filesystem', 'cons_group']) gossip.define(_SDK_HOOK('pre_replica_suspend'), tags=['infinibox']) gossip.define(_SDK_HOOK('post_replica_suspend'), tags=['infinibox']) gossip.define(_SDK_HOOK('replica_suspend_failure'), tags=['infinibox']) gossip.define(_SDK_HOOK('pre_replica_resume'), tags=['infinibox']) gossip.define(_SDK_HOOK('post_replica_resume'), tags=['infinibox']) gossip.define(_SDK_HOOK('replica_resume_failure'), tags=['infinibox']) gossip.define(_SDK_HOOK('pre_replica_change_type'), tags=['infinibox']) gossip.define(_SDK_HOOK('post_replica_change_type'), tags=['infinibox']) gossip.define(_SDK_HOOK('replica_change_type_failure'), tags=['infinibox']) gossip.define(_SDK_HOOK('pre_replica_switch_role'), tags=['infinibox']) gossip.define(_SDK_HOOK('post_replica_switch_role'), tags=['infinibox']) gossip.define(_SDK_HOOK('replica_switch_role_failure'), tags=['infinibox']) gossip.define(_SDK_HOOK('pre_replica_change_role'), tags=['infinibox']) gossip.define(_SDK_HOOK('post_replica_change_role'), tags=['infinibox']) gossip.define(_SDK_HOOK('replica_change_role_failure'), tags=['infinibox']) gossip.define(_SDK_HOOK('pre_refresh_snapshot'), tags=['infinibox', 'volume', 'filesystem', 'cons_group']) gossip.define(_SDK_HOOK('post_refresh_snapshot'), tags=['infinibox', 'volume', 'filesystem', 'cons_group']) gossip.define(_SDK_HOOK('refresh_snapshot_failure'), tags=['infinibox', 'volume', 'filesystem', 'cons_group']) gossip.define(_SDK_HOOK('pre_pool_lock'), tags=['infinibox', 'pool']) gossip.define(_SDK_HOOK('post_pool_lock'), tags=['infinibox', 'pool']) gossip.define(_SDK_HOOK('pool_lock_failure'), tags=['infinibox', 'pool']) gossip.define(_SDK_HOOK('pre_pool_unlock'), tags=['infinibox', 'pool']) gossip.define(_SDK_HOOK('post_pool_unlock'), tags=['infinibox', 'pool']) gossip.define(_SDK_HOOK('pool_unlock_failure'), tags=['infinibox', 'pool']) gossip.define(_SDK_HOOK('pre_qos_policy_assign'), tags=['infinibox', 'qos_policy']) gossip.define(_SDK_HOOK('post_qos_policy_assign'), tags=['infinibox', 'qos_policy']) gossip.define(_SDK_HOOK('qos_policy_assign_failure'), tags=['infinibox', 'qos_policy']) gossip.define(_SDK_HOOK('pre_qos_policy_unassign'), tags=['infinibox', 'qos_policy']) gossip.define(_SDK_HOOK('post_qos_policy_unassign'), tags=['infinibox', 'qos_policy']) gossip.define(_SDK_HOOK('qos_policy_unassign_failure'), tags=['infinibox', 'qos_policy']) gossip.define(_SDK_HOOK('before_api_request')) gossip.define(_SDK_HOOK('after_api_request')) gossip.define(_SDK_HOOK('after_login')) gossip.get_or_create_group('infinidat.sdk').set_strict()
def _get_or_create_group(is_strict): g = gossip.get_or_create_group(_HOOK_NAME.split('.')[0]) if is_strict: g.set_strict()
def test_trigger_hook_with_unsupported_tags(): gossip.define('group.some_hook', tags=("some_tag",)) gossip.trigger('group.some_hook', tags=("fake_tag",)) gossip.get_or_create_group('group').set_strict() with pytest.raises(UnsupportedHookTags): gossip.trigger_with_tags('group.some_hook', tags=("fake_tag",))