Пример #1
0
def build_app(*, use_cached=False, config_overrides=None):
    from flask import Flask

    global _cached_app  # pylint: disable=global-statement
    global _building    # pylint: disable=global-statement
    if use_cached and _cached_app is not None:
        return _cached_app

    if config_overrides is None:
        config_overrides = {}

    if _building:
        raise RuntimeError('Attempted to create an app while an app was already being initialized!')

    _building = True
    try:
        proj = get_project()
        _logger.debug('Starting app {.name}...', proj)
        _cached_app = Flask(get_project().name, static_folder=None, template_folder=None)
        _cached_app.config.update(config_overrides)
        proj.configure_app(_cached_app)
        gossip.trigger_with_tags('cob.after_configure_app', {'app': _cached_app})
        _logger.trace('URL map: {}', _cached_app.url_map)
        return _cached_app
    finally:
        _building = False
Пример #2
0
 def create(cls, system, **fields):
     """
     Creates a new object of this type
     """
     gossip.trigger_with_tags('infinidat.sdk.pre_creation_data_validation', {'fields': fields, 'system': system, 'cls': cls})
     data = cls._get_data_for_post(system, fields)
     return cls._create(system, cls.get_url_path(system), data)
Пример #3
0
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"))
Пример #4
0
    def delete(self, retain_staging_area=False, force_if_remote_error=False, force_on_target=False, force_if_no_remote_credentials=False):
        path = self.get_this_url_path()
        if retain_staging_area:
            path = path.add_query_param('retain_staging_area', 'true')
        if force_if_remote_error:
            path = path.add_query_param('force_if_remote_error', 'true')
        if force_on_target:
            path = path.add_query_param('force_on_target', 'true')
        if force_if_no_remote_credentials:
            path = path.add_query_param('force_if_no_remote_credentials', 'true')

        try:
            remote_replica = self.get_remote_replica()
        except UnknownSystem:
            remote_replica = None

        with self._get_delete_context():
            resp = self.system.api.delete(path)

        if retain_staging_area:
            local, remote = self._get_deletion_result(resp.get_result(), remote_replica)
        else:
            local = remote = None
        for snap in local, remote:
            if snap is not None:
                gossip.trigger_with_tags(
                    'infinidat.sdk.replica_snapshot_created', {'snapshot': snap}, tags=['infinibox'])
        return local, remote
Пример #5
0
def _possible_api_failure_context(tags):
    try:
        yield
    except APICommandFailed as e:
        exc_type, exc_value, exc_tb = sys.exc_info()
        gossip.trigger_with_tags('infinidat.sdk.object_operation_failure', {'exception': e}, tags=tags)
        reraise(exc_type, exc_value, exc_tb)
Пример #6
0
 def create(cls, system, binder, **fields): # pylint: disable=arguments-differ
     hook_tags = cls.get_tags_for_object_operations(system)
     gossip.trigger_with_tags('infinidat.sdk.pre_creation_data_validation',
                              {'fields': fields, 'system': system, 'cls': cls},
                              tags=hook_tags)
     data = get_data_for_object_creation(cls, system, fields)
     url = binder.get_url_path()
     return cls._create(system, url, data)
Пример #7
0
 def trigger_finish_fork(self, child):
     hook_tags = self.get_tags_for_object_operations(self.system)
     gossip.trigger_with_tags(_FINISH_FORK_HOOK, {
         'obj': self._forked_obj,
         'child': child
     },
                              tags=hook_tags)
     self._forked_obj = None
Пример #8
0
    def _notify_pre_exposure(replica):
        if replica is None or not replica.is_in_system():
            return

        gossip.trigger_with_tags(
            'infinidat.sdk.pre_replication_snapshot_expose', {
                'source': replica.get_local_entity(),
                'system': replica.system
            },
            tags=replica._get_entity_tags())  # pylint: disable=protected-access
Пример #9
0
 def create(cls, system, **fields):
     """
     Creates a new object of this type
     """
     hook_tags = cls.get_tags_for_object_operations(system)
     gossip.trigger_with_tags('infinidat.sdk.pre_creation_data_validation',
                              {'fields': fields, 'system': system, 'cls': cls},
                              tags=hook_tags)
     data = get_data_for_object_creation(cls, system, fields)
     return cls._create(system, cls.get_url_path(system), data)
Пример #10
0
    def _notify_exposure_failure(replica, exception):
        if replica is None or not replica.is_in_system():
            return

        gossip.trigger_with_tags(
            'infinidat.sdk.replication_snapshot_expose_failure', {
                'obj': replica,
                'exception': exception,
                'system': replica.system
            },
            tags=replica._get_entity_tags())  # pylint: disable=protected-access
Пример #11
0
 def trigger_after_restore(self, source):
     hook_tags = self.get_tags_for_object_operations(self.system)
     gossip.trigger_with_tags('infinidat.sdk.post_data_restore', {
         'source': source,
         'target': self
     },
                              tags=hook_tags)
     gossip.trigger_with_tags('infinidat.sdk.post_object_restore', {
         'source': source,
         'target': self
     },
                              tags=hook_tags)
Пример #12
0
    def expose_last_consistent_snapshot(self):
        resp = self.system.api.post(self.get_this_url_path().add_path('expose_last_consistent_snapshot')).get_result()
        if self.is_consistency_group():
            snapshot_id = resp['_local_reclaimed_sg_id']
        else:
            snapshot_id = resp['entity_pairs'][0]['_local_reclaimed_snapshot_id']
        if snapshot_id is None:
            return None
        returned = self._get_entity_collection().get_by_id_lazy(snapshot_id)
        gossip.trigger_with_tags(
                'infinidat.sdk.replica_snapshot_created', {'snapshot': returned}, tags=['infinibox'])

        return returned
Пример #13
0
    def _update_fields(self, update_dict):
        hook_tags = self.get_tags_for_object_operations(self.system)
        gossip.trigger_with_tags(
            'infinidat.sdk.pre_fields_update',
            {'source': self, 'fields': update_dict}, tags=hook_tags)

        for field_name, field_value in list(iteritems(update_dict)):
            try:
                field = self.fields[field_name]
            except LookupError:
                continue
            translated_value = field.binding.get_api_value_from_value(
                self.system, type(self), self, field_value)
            update_dict[field.api_name] = translated_value
            if field.api_name != field_name:
                update_dict.pop(field_name)

        gossip.trigger_with_tags('infinidat.sdk.pre_object_update', {'obj': self, 'data': update_dict},
                                 tags=hook_tags)
        try:
            res = self.system.api.put(self.get_this_url_path(), data=update_dict)
        except Exception as e:  # pylint: disable=broad-except
            with end_reraise_context():
                gossip.trigger_with_tags('infinidat.sdk.object_update_failure',
                                         {'obj': self, 'exception': e, 'system': self.system},
                                         tags=hook_tags)
        response_dict = res.get_result()
        if len(update_dict) == 1 and not isinstance(response_dict, dict):
            [key] = update_dict.keys()
            response_dict = {key: response_dict}
        self.update_field_cache({k: response_dict[k] for k in update_dict if k in response_dict})
        gossip.trigger_with_tags('infinidat.sdk.post_object_update',
                                 {'obj': self, 'data': update_dict, 'response_dict': response_dict}, tags=hook_tags)
        return res
Пример #14
0
 def trigger_restore_failure(self, source, e):
     hook_tags = self.get_tags_for_object_operations(self.system)
     gossip.trigger_with_tags('infinidat.sdk.data_restore_failure', {
         'source': source,
         'target': self,
         'exc': e
     },
                              tags=hook_tags)
     gossip.trigger_with_tags('infinidat.sdk.object_restore_failure', {
         'source': source,
         'target': self,
         'exc': e
     },
                              tags=hook_tags)
Пример #15
0
 def trigger_begin_fork(self):
     assert self._forked_obj is None
     if self._is_synced_remote_entity():
         remote_entity = self.get_remote_entity()
         if remote_entity is not None:
             self._forked_obj = self.get_remote_entity()
         else:
             _logger.debug(
                 'Could not fetch remote entity for {}. Forking local entity',
                 self)
             self._forked_obj = self
     else:
         self._forked_obj = self
     hook_tags = self.get_tags_for_object_operations(self.system)
     gossip.trigger_with_tags(_BEGIN_FORK_HOOK, {'obj': self._forked_obj},
                              tags=hook_tags)
Пример #16
0
 def _change_type(self, new_type, params=None):
     if params is None:
         params = {}
     old_type = self.get_replication_type().lower()
     new_type = new_type.lower()
     gossip.trigger_with_tags('infinidat.sdk.pre_replica_change_type', {
         'replica': self,
         'old_type': old_type,
         'new_type': new_type
     },
                              tags=['infinibox'])
     try:
         url = self.get_this_url_path().add_path('change_type_to_async') if new_type == 'async' \
               else self.get_this_url_path().add_path('change_type_to_sync')
         self.system.api.post(url, data=params)
     except Exception as e:  # pylint: disable=broad-except
         with end_reraise_context():
             gossip.trigger_with_tags(
                 'infinidat.sdk.replica_change_type_failure', {
                     'replica': self,
                     'old_type': old_type,
                     'new_type': new_type,
                     'exception': e
                 },
                 tags=['infinibox'])
     gossip.trigger_with_tags('infinidat.sdk.post_replica_change_type', {
         'replica': self,
         'old_type': old_type,
         'new_type': new_type
     },
                              tags=['infinibox'])
     self.invalidate_cache()
Пример #17
0
    def _assign_unassign_operation(self, entity, operation_name):
        hook_tags = self.get_tags_for_object_operations(self.system)
        gossip.trigger_with_tags(
            'infinidat.sdk.pre_qos_policy_{}'.format(operation_name), {
                'qos_policy': self,
                'entity': entity
            },
            tags=hook_tags)
        data = {'entity_id': entity.id}

        try:
            self.system.api.post(
                self.get_this_url_path().add_path(operation_name), data=data)
        except Exception as e:  # pylint: disable=broad-except
            with end_reraise_context():
                gossip.trigger_with_tags(
                    'infinidat.sdk.qos_policy_{}_failure'.format(
                        operation_name), {
                            'exception': e,
                            'qos_policy': self,
                            'entity': entity
                        },
                    tags=hook_tags)
        gossip.trigger_with_tags(
            'infinidat.sdk.post_qos_policy_{}'.format(operation_name), {
                'qos_policy': self,
                'entity': entity
            },
            tags=['infinibox'])
Пример #18
0
    def _update_fields(self, update_dict):
        gossip.trigger_with_tags(
            'infinidat.sdk.pre_fields_update',
            {'source': self, 'fields': update_dict}, tags=['infinibox'])

        for field_name, field_value in list(iteritems(update_dict)):
            try:
                field = self.fields[field_name]
            except LookupError:
                continue
            translated_value = field.binding.get_api_value_from_value(self.system, type(self), self, field_value)
            update_dict[field.api_name] = translated_value
            if field.api_name != field_name:
                update_dict.pop(field_name)

        hook_tags = self._get_tags_for_object_operations(self.system)
        gossip.trigger_with_tags('infinidat.sdk.pre_object_update', {'obj': self, 'data': update_dict}, tags=hook_tags)
        with _possible_api_failure_context(tags=hook_tags):
            res = self.system.api.put(self.get_this_url_path(), data=update_dict)
        response_dict = res.get_result()
        if len(update_dict) == 1 and not isinstance(response_dict, dict):
            [key] = update_dict.keys()
            response_dict = {key: response_dict}
        self.update_field_cache(response_dict)
        gossip.trigger_with_tags('infinidat.sdk.post_object_update',
                {'obj': self, 'data': update_dict, 'response_dict': response_dict}, tags=hook_tags)
        return res
Пример #19
0
def _trigger_stage_hooks(base_config, request, stage):
    for cluster, installer_type in cluster_installers(base_config, request):
        gossip.trigger_with_tags(stage, kwargs=dict(cluster=cluster, request=request), tags=[installer_type])

    for host, installer_type in host_installers(base_config, request):
        gossip.trigger_with_tags(stage, kwargs=dict(host=host, request=request), tags=[installer_type])

    gossip.trigger_with_tags(stage, kwargs=dict(base_config=base_config, request=request), tags=['base_config'])
Пример #20
0
    def expose_last_consistent_snapshot(self):
        self._notify_pre_exposure(self)

        try:
            resp = self.system.api.post(self.get_this_url_path().add_path(
                'expose_last_consistent_snapshot')).get_result()
        except Exception as e:  # pylint: disable=broad-except
            with end_reraise_context():
                self._notify_exposure_failure(self, e)

        if self.is_consistency_group():
            snapshot_id = resp['_local_reclaimed_sg_id']
        else:
            snapshot_id = resp['entity_pairs'][0][
                '_local_reclaimed_snapshot_id']
        if snapshot_id is None:
            return None
        returned = self._get_entity_collection().get_by_id_lazy(snapshot_id)
        gossip.trigger_with_tags('infinidat.sdk.replica_snapshot_created',
                                 {'snapshot': returned},
                                 tags=['infinibox'])
        self._notify_post_exposure(self, returned)
        gadget.log_operation(self, "expose last consistent snapshot")
        return returned
Пример #21
0
 def _get_delete_context(self):
     hook_tags = self.get_tags_for_object_operations(self.system)
     gossip.trigger_with_tags('infinidat.sdk.pre_object_deletion', {'obj': self}, tags=hook_tags)
     try:
         yield
     except Exception as e:       # pylint: disable=broad-except
         with end_reraise_context():
             gossip.trigger_with_tags('infinidat.sdk.object_deletion_failure',
                                      {'obj': self, 'exception': e, 'system': self.system},
                                      tags=hook_tags)
     gossip.trigger_with_tags('infinidat.sdk.post_object_deletion', {'obj': self}, tags=hook_tags)
Пример #22
0
 def restore(self, snapshot):
     """Restores this entity from a given snapshot object
     """
     snapshot_id = snapshot.id
     hook_tags = self._get_tags_for_object_operations(self.system)
     restore_url = self.get_this_url_path().add_path('restore')
     gossip.trigger_with_tags('infinidat.sdk.pre_data_restore', {'source': snapshot, 'target': self}, tags=hook_tags)
     try:
         self.system.api.post(restore_url, data=snapshot_id)
     except APICommandFailed as e:
         gossip.trigger_with_tags('infinidat.sdk.data_restore_failure', {'source': snapshot, 'target': self, 'exc': e}, tags=hook_tags)
         raise
     gossip.trigger_with_tags('infinidat.sdk.post_data_restore', {'source': snapshot, 'target': self}, tags=hook_tags)
Пример #23
0
 def create(self, *args, **kwargs):
     hook_tags = TreeQ.get_tags_for_object_operations(self.system)
     hook_data = {'fields': kwargs, 'system': self.system, 'filesystem': self._filesystem}
     gossip.trigger_with_tags('infinidat.sdk.pre_treeq_creation', hook_data, tags=hook_tags)
     try:
         treeq = TreeQ.create(self.system, self, *args, **kwargs)
     except Exception as e:  # pylint: disable=broad-except
         with end_reraise_context():
             hook_data['exception'] = e
             gossip.trigger_with_tags('infinidat.sdk.treeq_creation_failure', hook_data, tags=hook_tags)
     hook_data['treeq'] = treeq
     gossip.trigger_with_tags('infinidat.sdk.post_treeq_creation', hook_data, tags=hook_tags)
     return treeq
Пример #24
0
 def _create(cls, system, url, data, tags=None):
     hook_tags = tags or cls._get_tags_for_object_operations(system)
     gossip.trigger_with_tags('infinidat.sdk.pre_object_creation', {'data': data, 'system': system, 'cls': cls}, tags=hook_tags)
     try:
         with _possible_api_failure_context(tags=hook_tags):
             returned = system.api.post(url, data=data).get_result()
         obj = cls(system, returned)
     except Exception as e:
         gossip.trigger_with_tags('infinidat.sdk.object_creation_failure',
             {'cls': cls, 'system': system, 'data': data, 'exception': e}, tags=hook_tags)
         raise
     gossip.trigger_with_tags('infinidat.sdk.post_object_creation',
             {'obj': obj, 'data': data, 'response_dict': returned}, tags=hook_tags)
     return obj
Пример #25
0
 def _create_child(self, name):
     self.refresh('has_children')
     hook_tags = self._get_tags_for_object_operations(self.system)
     gossip.trigger_with_tags(_BEGIN_FORK_HOOK, {'obj': self}, tags=hook_tags)
     if not name:
         name = self.fields.name.generate_default().generate()
     data = {'name': name, 'parent_id': self.get_id()}
     try:
         child = self._create(self.system, self.get_url_path(self.system), data=data, tags=hook_tags)
     except Exception:
         gossip.trigger_with_tags(_CANCEL_FORK_HOOK, {'obj': self}, tags=hook_tags)
         raise
     gossip.trigger_with_tags(_FINISH_FORK_HOOK, {'obj': self, 'child': child}, tags=hook_tags)
     self._handle_possible_replication_snapshot(child)
     return child
Пример #26
0
 def _create(cls, system, url, data, tags=None):
     hook_tags = tags or cls.get_tags_for_object_operations(system)
     gossip.trigger_with_tags('infinidat.sdk.pre_object_creation', {'data': data, 'system': system, 'cls': cls},
                              tags=hook_tags)
     try:
         returned = system.api.post(url, data=data).get_result()
         obj = cls(system, returned)
     except Exception as e:  # pylint: disable=broad-except
         with end_reraise_context():
             gossip.trigger_with_tags('infinidat.sdk.object_creation_failure',
                                      {'cls': cls, 'system': system, 'data': data, 'exception': e},
                                      tags=hook_tags)
     gossip.trigger_with_tags('infinidat.sdk.post_object_creation',
                              {'obj': obj, 'data': data, 'response_dict': returned}, tags=hook_tags)
     gadget.log_entity_creation(entity=obj, params=data)
     return obj
Пример #27
0
    def _create_child(self, name=None, write_protected=None, ssd_enabled=None):
        hook_tags = self.get_tags_for_object_operations(self.system)
        gossip.trigger_with_tags('infinidat.sdk.pre_entity_child_creation', {
            'source': self,
            'system': self.system
        },
                                 tags=hook_tags)

        self.invalidate_cache('has_children')
        self.trigger_begin_fork()
        if not name:
            name = self.fields.name.generate_default().generate()
        data = {'name': name, 'parent_id': self.get_id()}
        if write_protected is not None:
            assert self.system.compat.has_writable_snapshots(), \
                'write_protected parameter is not supported for this version'
            data['write_protected'] = write_protected
        if ssd_enabled is not None:
            data['ssd_enabled'] = ssd_enabled
        try:
            child = self._create(self.system,
                                 self.get_url_path(self.system),
                                 data=data,
                                 tags=self.get_tags_for_object_operations(
                                     self.system))
        except Exception as e:  # pylint: disable=broad-except
            with end_reraise_context():
                gossip.trigger_with_tags('infinidat.sdk.entity_child_failure',
                                         {
                                             'obj': self,
                                             'exception': e,
                                             'system': self.system
                                         },
                                         tags=hook_tags)
                self.trigger_cancel_fork()
        self.trigger_finish_fork(child)
        gossip.trigger_with_tags('infinidat.sdk.post_entity_child_creation', {
            'source': self,
            'target': child,
            'system': self.system
        },
                                 tags=hook_tags)

        handle_possible_replication_snapshot(child)
        return child
Пример #28
0
 def _lock_unlock_operation(self, operation_name):
     hook_tags = self.get_tags_for_object_operations(self.system)
     gossip.trigger_with_tags(
         'infinidat.sdk.pre_pool_{}'.format(operation_name), {'pool': self},
         tags=hook_tags)
     try:
         self.system.api.post(
             self.get_this_url_path().add_path(operation_name))
     except Exception as e:  # pylint: disable=broad-except
         with end_reraise_context():
             gossip.trigger_with_tags(
                 'infinidat.sdk.pool_{}_failure'.format(operation_name), {
                     'pool': self,
                     'exception': e
                 },
                 tags=hook_tags)
     gossip.trigger_with_tags(
         'infinidat.sdk.post_pool_{}'.format(operation_name),
         {'pool': self},
         tags=hook_tags)
Пример #29
0
 def resume(self):
     """Resumes this replica
     """
     gossip.trigger_with_tags('infinidat.sdk.pre_replica_resume',
                              {'replica': self},
                              tags=['infinibox'])
     try:
         self.system.api.post(self.get_this_url_path().add_path('resume'))
     except Exception as e:  # pylint: disable=broad-except
         with end_reraise_context():
             gossip.trigger_with_tags(
                 'infinidat.sdk.replica_resume_failure', {
                     'replica': self,
                     'exception': e
                 },
                 tags=['infinibox'])
     gossip.trigger_with_tags('infinidat.sdk.post_replica_resume',
                              {'replica': self},
                              tags=['infinibox'])
     self.invalidate_cache('state')
     gadget.log_operation(self, "resume")
Пример #30
0
 def switch_role(self):
     """Switches replica role - sync replicas only
     """
     gossip.trigger_with_tags('infinidat.sdk.pre_replica_switch_role',
                              {'replica': self},
                              tags=['infinibox'])
     try:
         self.system.api.post(
             self.get_this_url_path().add_path('switch_role'))
     except Exception as e:  # pylint: disable=broad-except
         with end_reraise_context():
             gossip.trigger_with_tags(
                 'infinidat.sdk.replica_switch_role_failure', {
                     'replica': self,
                     'exception': e
                 },
                 tags=['infinibox'])
     gossip.trigger_with_tags('infinidat.sdk.post_replica_switch_role',
                              {'replica': self},
                              tags=['infinibox'])
     self.invalidate_cache()
     gadget.log_operation(self, "switch role")
Пример #31
0
    def move_pool(self, target_pool, with_capacity=False):
        """Moves this entity to a new pool, optionally along with its needed capacity
        """
        data = dict(pool_id=target_pool.get_id(), with_capacity=with_capacity)
        hook_tags = self.get_tags_for_object_operations(self.system)
        source_pool = self.get_pool()
        gossip.trigger_with_tags('infinidat.sdk.pre_pool_move', {
            'obj': self,
            'with_capacity': with_capacity,
            'system': self.system,
            'target_pool': target_pool,
            'source_pool': source_pool
        },
                                 tags=hook_tags)

        try:
            self.system.api.post(self.get_this_url_path().add_path('move'),
                                 data=data)
        except Exception as e:  # pylint: disable=broad-except
            with end_reraise_context():
                gossip.trigger_with_tags('infinidat.sdk.pool_move_failure', {
                    'obj': self,
                    'with_capacity': with_capacity,
                    'system': self.system,
                    'exception': e,
                    'target_pool': target_pool,
                    'source_pool': source_pool
                },
                                         tags=hook_tags)

        gossip.trigger_with_tags('infinidat.sdk.post_pool_move', {
            'obj': self,
            'with_capacity': with_capacity,
            'system': self.system,
            'target_pool': target_pool,
            'source_pool': source_pool
        },
                                 tags=hook_tags)
Пример #32
0
 def change_role(self, entity_pairs=OMIT):
     """Changes the role of this replica from source to target or vice-versa
     """
     data = {
         'entity_pairs': entity_pairs
     } if entity_pairs is not OMIT else None
     gossip.trigger_with_tags('infinidat.sdk.pre_replica_change_role',
                              {'replica': self},
                              tags=['infinibox'])
     try:
         self.system.api.post(
             self.get_this_url_path().add_path('change_role'), data=data)
     except Exception as e:  # pylint: disable=broad-except
         with end_reraise_context():
             gossip.trigger_with_tags(
                 'infinidat.sdk.replica_change_role_failure', {
                     'replica': self,
                     'exception': e
                 },
                 tags=['infinibox'])
     gossip.trigger_with_tags('infinidat.sdk.post_replica_change_role',
                              {'replica': self},
                              tags=['infinibox'])
     self.invalidate_cache()
Пример #33
0
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",))
Пример #34
0
 def _get_delete_context(self):
     hook_tags = self._get_tags_for_object_operations(self.system)
     gossip.trigger_with_tags('infinidat.sdk.pre_object_deletion', {'obj': self}, tags=hook_tags)
     with _possible_api_failure_context(hook_tags):
         yield
     gossip.trigger_with_tags('infinidat.sdk.post_object_deletion', {'obj': self}, tags=hook_tags)
Пример #35
0
 def trigger_begin_fork(self):
     hook_tags = self._get_tags_for_object_operations(self.system)
     gossip.trigger_with_tags(_BEGIN_FORK_HOOK, {'obj': self}, tags=hook_tags)
Пример #36
0
def grain(grain_type, name, mountpoint):
    _generate(f'grain-{grain_type}', name, {
        'name': name,
        'mountpoint': mountpoint,
    })
    gossip.trigger_with_tags('cob.after_generate.grain', tags=[grain_type], kwargs={'name': name})
Пример #37
0
    def delete(self,
               retain_staging_area=False,
               force_if_remote_error=False,
               force_on_target=False,
               force_if_no_remote_credentials=False):
        """Deletes this replica
        """
        path = self.get_this_url_path()
        if retain_staging_area:
            path = path.add_query_param('retain_staging_area', 'true')
        if force_if_remote_error:
            path = path.add_query_param('force_if_remote_error', 'true')
        if force_on_target:
            path = path.add_query_param('force_on_target', 'true')
        if force_if_no_remote_credentials:
            path = path.add_query_param('force_if_no_remote_credentials',
                                        'true')

        try:
            remote_replica = self.get_remote_replica(safe=True)
            if remote_replica is None:
                _logger.debug(
                    'Failed to get remote replica during delete operation')
        except UnknownSystem:
            remote_replica = None

        if retain_staging_area:
            self._notify_pre_exposure(self)
            self._notify_pre_exposure(remote_replica)

        gadget.log_entity_deletion(self)
        with self._get_delete_context():
            try:
                resp = self.system.api.delete(path)
                entity_pairs = None
                result = resp.get_result()
                if result:
                    entity_pairs = result.get('entity_pairs')
                gossip.trigger_with_tags('infinidat.sdk.replica_deleted', {
                    'replica': self,
                    'entity_pairs': entity_pairs
                },
                                         tags=['infinibox'])
            except Exception as e:  # pylint: disable=broad-except
                with end_reraise_context():
                    if retain_staging_area:
                        self._notify_exposure_failure(self, e)
                        self._notify_exposure_failure(remote_replica, e)

        if retain_staging_area:
            local, remote = self._get_deletion_result(resp.get_result(),
                                                      remote_replica)
        else:
            local = remote = None
        for replica, snap in (self, local), (remote_replica, remote):
            if snap is not None:
                gossip.trigger_with_tags(
                    'infinidat.sdk.replica_snapshot_created',
                    {'snapshot': snap},
                    tags=['infinibox'])

                self._notify_post_exposure(replica, snap)
        return local, remote
Пример #38
0
def test_trigger_hook(specify_tags):
    if specify_tags:
        gossip.trigger_with_tags(_HOOK_NAME, tags=_ACCEPTED_TAGS)
    else:
        gossip.trigger_with_tags(_HOOK_NAME, tags=())
Пример #39
0
 def trigger_before_restore(self, source):
     hook_tags = self._get_tags_for_object_operations(self.system)
     gossip.trigger_with_tags('infinidat.sdk.pre_data_restore', {'source': source, 'target': self}, tags=hook_tags)
Пример #40
0
def test_trigger_hook(specify_tags):
    if specify_tags:
        gossip.trigger_with_tags(_HOOK_NAME, tags=_ACCEPTED_TAGS)
    else:
        gossip.trigger_with_tags(_HOOK_NAME, tags=())
Пример #41
0
def _notify_operation_failed(system, exception, **kwargs):
    cls = kwargs.pop('cls', None) or type(kwargs.pop('obj'))
    tags = cls.get_tags_for_object_operations(system)
    gossip.trigger_with_tags('infinidat.sdk.object_operation_failure', {'exception': exception}, tags=tags)
Пример #42
0
 def trigger_finish_fork(self, child):
     hook_tags = self._get_tags_for_object_operations(self.system)
     gossip.trigger_with_tags(_FINISH_FORK_HOOK, {'obj': self, 'child': child}, tags=hook_tags)
Пример #43
0
def test_trigger_with_bad_tags(tags, is_strict):
    if not is_strict:
        return
    with pytest.raises(gossip.exceptions.UnsupportedHookTags):
        gossip.trigger_with_tags(_HOOK_NAME, tags=tags)
Пример #44
0
 def trigger_cancel_fork(self):
     hook_tags = self.get_tags_for_object_operations(self.system)
     gossip.trigger_with_tags(_CANCEL_FORK_HOOK, {'obj': self._forked_obj},
                              tags=hook_tags)
     self._forked_obj = None
Пример #45
0
 def change_role(self, entity_pairs=OMIT):
     data = {'entity_pairs': entity_pairs} if entity_pairs is not OMIT else None
     self.system.api.post(self.get_this_url_path()
                              .add_path('change_role'), data=data)
     self.refresh()
     gossip.trigger_with_tags('infinidat.sdk.replica_after_change_role', {'replica': self}, tags=['infinibox'])
Пример #46
0
 def trigger_cancel_fork(self):
     hook_tags = self._get_tags_for_object_operations(self.system)
     gossip.trigger_with_tags(_CANCEL_FORK_HOOK, {'obj': self}, tags=hook_tags)
Пример #47
0
 def _handle_possible_replication_snapshot(self, snapshot):
     fields = snapshot.get_fields(from_cache=True, raw_value=True)
     if fields.get('rmr_snapshot_guid', None) is not None:
         gossip.trigger_with_tags('infinidat.sdk.replica_snapshot_created', {'snapshot': snapshot}, tags=['infinibox'])
Пример #48
0
def test_trigger_with_bad_tags(tags, is_strict):
    if not is_strict:
        return
    with pytest.raises(gossip.exceptions.UnsupportedHookTags):
        gossip.trigger_with_tags(_HOOK_NAME, tags=tags)