예제 #1
0
class BaseTest(TestCase):

    def setUp(self):
        self.logger = logging.getLogger('alerts')

        self.alerts_storage = Middleware.get_middleware_by_uri(
            'storage-periodical-testalarm://'
        )
        self.config_storage = Middleware.get_middleware_by_uri(
            'storage-default-testconfig://'
        )
        self.config_storage.put_element(
            element={
                '_id': 'test_config',
                'crecord_type': 'statusmanagement',
                'bagot_time': 3600,
                'bagot_freq': 10,
                'stealthy_time': 300,
                'restore_event': True,
                'auto_snooze': False,
                'snooze_default_time': 300,
            },
            _id='test_config'
        )
        self.filter_storage = Middleware.get_middleware_by_uri(
            'storage-default-testalarmfilter://'
        )

        self.context_graph_storage = Middleware.get_middleware_by_uri(
            'storage-default-testentities://'
        )
        self.cg_manager = ContextGraph(self.logger)
        self.cg_manager.ent_storage = self.context_graph_storage
        self.watcher_manager = Watcher()

        conf = Configuration.load(Alerts.CONF_PATH, Ini)
        filter_ = {'crecord_type': 'statusmanagement'}
        self.config_data = EtherealData(
            collection=MongoCollection(self.config_storage._backend),
            filter_=filter_)

        self.event_publisher = Mock(spec=StatEventPublisher)


        mongo = MongoStore.get_default()
        collection = mongo.get_collection("default_testpbehavior")
        pb_collection = MongoCollection(collection)

        logger = Logger.get('test_pb', None, output_cls=OutputNull)

        config = Configuration.load(PBehaviorManager.CONF_PATH, Ini)

        self.pbm = PBehaviorManager(config=config,
                                    logger=logger,
                                    pb_collection=pb_collection)

        self.manager = Alerts(config=conf,
                              logger=self.logger,
                              alerts_storage=self.alerts_storage,
                              config_data=self.config_data,
                              filter_storage=self.filter_storage,
                              context_graph=self.cg_manager,
                              watcher=self.watcher_manager,
                              event_publisher=self.event_publisher,
                              pbehavior=self.pbm)

    def tearDown(self):
        """Teardown"""
        self.alerts_storage.remove_elements()
        self.config_storage.remove_elements()
        self.filter_storage.remove_elements()
        self.context_graph_storage.remove_elements()

    def gen_fake_alarm(self, update={}, moment=None):
        """
        Generate a fake alarm/value.
        """
        if moment is None:
            moment = int(time.mktime(datetime.now().timetuple()))

        alarm_id = '/fake/alarm/id'
        alarm = self.manager.make_alarm(
            alarm_id,
            {
                'connector': 'fake-connector',
                'connector_name': 'fake-connector-name',
                'component': 'c',
                'output': 'out',
                'timestamp': moment
            }
        )

        value = alarm[self.manager.alerts_storage.VALUE]
        value[AlarmField.state.value] = {
            't': moment,
            'val': Check.MINOR
        }
        value[AlarmField.steps.value] = [
            {
                '_t': 'stateinc',
                't': moment,
                'a': 'fake-author',
                'm': 'fake-message',
                'val': Check.MINOR
            }
        ]

        dictio = merge_two_dicts(alarm, update)

        return dictio, value

    def gen_alarm_filter(self, update={}, storage=None):
        """
        Generate a standard alarm filter.
        """
        base = {
            AlarmFilter.LIMIT: 180.0,
            AlarmFilter.FILTER: '',
            AlarmFilter.CONDITION: {},
            AlarmFilter.TASKS: ['alerts.systemaction.state_increase'],
        }

        dictio = merge_two_dicts(base, update)

        return AlarmFilter(dictio, logger=self.logger, storage=storage)
예제 #2
0
class ComputeState(BaseTest):
    def setUp(self):
        super(ComputeState, self).setUp()
        pbehavior_storage = Middleware.get_middleware_by_uri(
            'storage-default-testpbehavior://')
        filter_storage = Middleware.get_middleware_by_uri(
            'storage-default-testalarmfilter://')
        config_storage = Middleware.get_middleware_by_uri(
            'storage-default-testconfig://')
        config_storage.put_element(element={
            '_id': 'test_config',
            'crecord_type': 'statusmanagement',
            'bagot_time': 3600,
            'bagot_freq': 10,
            'stealthy_time': 300,
            'restore_event': True,
            'auto_snooze': False,
            'snooze_default_time': 300,
        },
                                   _id='test_config')
        logger = Logger.get('test_pb', None, output_cls=OutputNull)

        config = Configuration.load(PBehaviorManager.CONF_PATH, Ini)

        self.pbm = PBehaviorManager(config=config,
                                    logger=logger,
                                    pb_storage=pbehavior_storage)
        self.pbm.context = self.context_graph_manager
        self.manager.pbehavior_manager = self.pbm

        conf = Configuration.load(Alerts.CONF_PATH, Ini)
        filter_ = {'crecord_type': 'statusmanagement'}
        config_data = EtherealData(collection=config_storage._backend,
                                   filter_=filter_)

        event_publisher = Mock(spec=StatEventPublisher)

        self.alert_manager = Alerts(config=conf,
                                    logger=logger,
                                    alerts_storage=self.alerts_storage,
                                    config_data=config_data,
                                    filter_storage=filter_storage,
                                    context_graph=self.context_graph_manager,
                                    watcher=self.manager,
                                    event_publisher=event_publisher)

        # Creating entity
        self.type_ = 'resource'
        self.name = 'morticia'
        entity = ContextGraph.create_entity_dict(id=self.name,
                                                 etype=self.type_,
                                                 name=self.name)
        self.context_graph_manager.create_entity(entity)

        # Creating coresponding alarm
        event = {
            'connector': self.type_,
            'connector_name': 'connector_name',
            'component': self.name,
            'output': 'tadaTaDA tic tic',
            'timestamp': 0
        }
        alarm = self.alert_manager.make_alarm(self.name, event)
        self.state = 2
        alarm = self.alert_manager.update_state(alarm, self.state, event)
        new_value = alarm[self.alert_manager.alerts_storage.VALUE]
        self.alert_manager.update_current_alarm(alarm, new_value)

    def tearDown(self):
        super(ComputeState, self).tearDown()
        self.pbm.pb_storage.remove_elements()

    def test_compute_state_issue427(self):
        # Aka: state desyncro
        watcher_id = 'addams'
        watcher = {
            '_id': watcher_id,
            'mfilter': '{"name": {"$in": ["morticia"]}}',
            'display_name': 'family'
        }
        self.assertTrue(self.manager.create_watcher(watcher))

        res = self.manager.get_watcher(watcher_id)
        self.assertEqual(res['state'], self.state)

        # Creating pbehavior on it
        now = datetime.utcnow()
        self.pbm.create(name='addam',
                        filter=loads('{"name": "morticia"}'),
                        author='addams',
                        tstart=timegm(now.timetuple()),
                        tstop=timegm((now + timedelta(seconds=2)).timetuple()),
                        rrule=None,
                        enabled=True)
        self.pbm.compute_pbehaviors_filters()

        res = self.manager.get_watcher(watcher_id)
        self.assertEqual(res['state'], self.state)

        self.manager.compute_watchers()

        res = self.manager.get_watcher(watcher_id)
        self.assertEqual(res['state'], 0)

        sleep(3)
        self.pbm.compute_pbehaviors_filters()
        self.manager.compute_watchers()

        res = self.manager.get_watcher(watcher_id)
        self.assertEqual(res['state'], self.state)
예제 #3
0
class ComputeState(BaseTest):

    def setUp(self):
        super(ComputeState, self).setUp()
        pbehavior_storage = Middleware.get_middleware_by_uri(
            'storage-default-testpbehavior://'
        )
        filter_storage = Middleware.get_middleware_by_uri(
            'storage-default-testalarmfilter://'
        )
        config_storage = Middleware.get_middleware_by_uri(
            'storage-default-testconfig://'
        )
        config_storage.put_element(
            element={
                '_id': 'test_config',
                'crecord_type': 'statusmanagement',
                'bagot_time': 3600,
                'bagot_freq': 10,
                'stealthy_time': 300,
                'restore_event': True,
                'auto_snooze': False,
                'snooze_default_time': 300,
            },
            _id='test_config'
        )
        logger = Logger.get('test_pb', None, output_cls=OutputNull)

        config = Configuration.load(PBehaviorManager.CONF_PATH, Ini)

        self.pbm = PBehaviorManager(config=config,
                                    logger=logger,
                                    pb_storage=pbehavior_storage)
        self.pbm.context = self.context_graph_manager
        self.manager.pbehavior_manager = self.pbm

        conf = Configuration.load(Alerts.CONF_PATH, Ini)
        filter_ = {'crecord_type': 'statusmanagement'}
        config_data = EtherealData(collection=config_storage._backend,
                                   filter_=filter_)

        event_publisher = Mock(spec=StatEventPublisher)

        self.alert_manager = Alerts(config=conf,
                                    logger=logger,
                                    alerts_storage=self.alerts_storage,
                                    config_data=config_data,
                                    filter_storage=filter_storage,
                                    context_graph=self.context_graph_manager,
                                    watcher=self.manager,
                                    event_publisher=event_publisher)

        # Creating entity
        self.type_ = 'resource'
        self.name = 'morticia'
        entity = ContextGraph.create_entity_dict(
            id=self.name,
            etype=self.type_,
            name=self.name
        )
        self.context_graph_manager.create_entity(entity)

        # Creating coresponding alarm
        event = {
            'connector': self.type_,
            'connector_name': 'connector_name',
            'component': self.name,
            'output': 'tadaTaDA tic tic',
            'timestamp': 0
        }
        alarm = self.alert_manager.make_alarm(self.name, event)
        self.state = 2
        alarm = self.alert_manager.update_state(alarm, self.state, event)
        new_value = alarm[self.alert_manager.alerts_storage.VALUE]
        self.alert_manager.update_current_alarm(alarm, new_value)

    def tearDown(self):
        super(ComputeState, self).tearDown()
        self.pbm.pb_storage.remove_elements()

    def test_compute_state_issue427(self):
        # Aka: state desyncro
        watcher_id = 'addams'
        watcher = {
            '_id': watcher_id,
            'mfilter': '{"name": {"$in": ["morticia"]}}',
            'display_name': 'family'
        }
        self.assertTrue(self.manager.create_watcher(watcher))

        res = self.manager.get_watcher(watcher_id)
        self.assertEqual(res['state'], self.state)

        # Creating pbehavior on it
        now = datetime.utcnow()
        self.pbm.create(
            name='addam',
            filter=loads('{"name": "morticia"}'),
            author='addams',
            tstart=timegm(now.timetuple()),
            tstop=timegm((now + timedelta(seconds=2)).timetuple()),
            rrule=None,
            enabled=True
        )
        self.pbm.compute_pbehaviors_filters()

        res = self.manager.get_watcher(watcher_id)
        self.assertEqual(res['state'], self.state)

        self.manager.compute_watchers()

        res = self.manager.get_watcher(watcher_id)
        self.assertEqual(res['state'], 0)

        sleep(3)
        self.pbm.compute_pbehaviors_filters()
        self.manager.compute_watchers()

        res = self.manager.get_watcher(watcher_id)
        self.assertEqual(res['state'], self.state)