Exemple #1
0
def state_decrease(manager, alarm, state, event):
    """
    Called when the system detects a state decrease on an alarm.
    """

    step = {
        '_t': 'statedec',
        't': event['timestamp'],
        'a': event.get("author", DEFAULT_AUTHOR),
        'm': event['output'],
        'val': state
    }

    if alarm[AlarmField.state.value] is None or not is_keeped_state(alarm):
        alarm[AlarmField.state.value] = step

    alarm[AlarmField.steps.value].append(step)
    status = compute_status(manager, alarm)

    return alarm, status
Exemple #2
0
def state_decrease(manager, alarm, state, event):
    """
    Called when the system detects a state decrease on an alarm.
    """

    step = {
        '_t': 'statedec',
        't': event['timestamp'],
        'a': event.get("author", DEFAULT_AUTHOR),
        'm': event['output'],
        'val': state
    }

    if alarm[AlarmField.state.value] is None or not is_keeped_state(alarm):
        alarm[AlarmField.state.value] = step

    alarm[AlarmField.steps.value].append(step)
    status = compute_status(manager, alarm)

    return alarm, status
Exemple #3
0
def state_decrease(manager, alarm, state, event):
    """
    Called when the system detects a state decrease on an alarm.
    """

    step = {
        '_t': 'statedec',
        't': event['timestamp'],
        'a': '{0}.{1}'.format(event['connector'], event['connector_name']),
        'm': event['output'],
        'val': state
    }

    if alarm[AlarmField.state.value] is None or not is_keeped_state(alarm):
        alarm[AlarmField.state.value] = step

    alarm[AlarmField.steps.value].append(step)
    status = compute_status(manager, alarm)

    return alarm, status
Exemple #4
0
    def test_change_state(self):
        event = {
            'timestamp': 0,
            'state': 2
        }

        task = get_task('alerts.useraction.changestate')
        alarm = task(
            self.manager,
            self.alarm,
            'testauthor',
            'test message',
            event
        )

        self.assertTrue(alarm[AlarmField.state.value] is not None)
        self.assertEqual(alarm[AlarmField.state.value]['t'], 0)
        self.assertEqual(alarm[AlarmField.state.value]['a'], 'testauthor')
        self.assertEqual(alarm[AlarmField.state.value]['m'], 'test message')
        self.assertEqual(alarm[AlarmField.state.value]['val'], 2)
        self.assertTrue(
            alarm[AlarmField.state.value] is get_previous_step(alarm, States.changestate.value)
        )
        self.assertTrue(is_keeped_state(alarm))
Exemple #5
0
    def test_archive_state_changed(self):
        alarm_id = 'ut-comp'

        # Testing state creation
        event0 = {
            'source_type': 'component',
            'connector': 'test',
            'connector_name': 'test0',
            'component': 'ut-comp',
            'timestamp': 0,
            'output': 'test message',
            'event_type': 'check',
            'state': Check.MINOR,
        }
        self.manager.archive(event0)

        alarm = self.manager.get_current_alarm(alarm_id)

        expected_state = {
            'a': DEFAULT_AUTHOR,
            '_t': "stateinc",
            'm': 'test message',
            't': 0,
            'role': None,
            'val': 1,
        }

        self.assertEqual(len(alarm['value'][AlarmField.steps.value]), 2)
        self.assertEqual(alarm['value'][AlarmField.steps.value][0],
                         expected_state)
        self.assertEqual(alarm['value'][AlarmField.state.value],
                         expected_state)

        self.event_publisher.publish_statcounterinc_event.assert_called_once_with(
            alarm['value'][AlarmField.last_update_date.value],
            StatCounters.alarms_created, {}, alarm['value'], None)
        self.event_publisher.publish_statcounterinc_event.reset_mock()

        # Testing state increase
        event1 = {
            'source_type': 'component',
            'connector': 'test',
            'connector_name': 'test0',
            'component': 'ut-comp',
            'timestamp': 0,
            'output': 'test message',
            'event_type': 'check',
            'state': Check.MAJOR,
        }
        self.manager.archive(event1)

        alarm = self.manager.get_current_alarm(alarm_id)

        expected_state = {
            'a': DEFAULT_AUTHOR,
            '_t': 'stateinc',
            'm': 'test message',
            't': 0,
            'role': None,
            'val': 2,
        }

        self.assertEqual(len(alarm['value'][AlarmField.steps.value]), 3)
        self.assertEqual(alarm['value'][AlarmField.steps.value][2],
                         expected_state)
        self.assertEqual(alarm['value'][AlarmField.state.value],
                         expected_state)

        # Testing keeped state
        event1 = {
            'source_type': 'component',
            'connector': 'test',
            'connector_name': 'test0',
            'component': 'ut-comp',
            'timestamp': 0,
            'output': 'test message',
            'event_type': States.changestate.value,
            'state': Check.MINOR,
        }
        self.manager.archive(event1)

        alarm = self.manager.get_current_alarm(alarm_id)

        self.assertEqual(len(alarm['value'][AlarmField.steps.value]), 4)
        self.assertEqual(alarm['value'][AlarmField.state.value]['val'], 1)
        self.assertTrue(is_keeped_state(alarm['value']))

        event1 = {
            'source_type': 'component',
            'connector': 'test',
            'connector_name': 'test0',
            'component': 'ut-comp',
            'timestamp': 0,
            'output': 'test message',
            'event_type': 'check',
            'state': Check.CRITICAL,
        }
        self.manager.archive(event1)

        alarm = self.manager.get_current_alarm(alarm_id)

        self.assertEqual(len(alarm['value'][AlarmField.steps.value]), 4)
        self.assertEqual(alarm['value'][AlarmField.state.value]['val'], 1)
        self.assertTrue(is_keeped_state(alarm['value']))

        # Disengaging keepstate
        event1 = {
            'source_type': 'component',
            'connector': 'test',
            'connector_name': 'test0',
            'component': 'ut-comp',
            'timestamp': 0,
            'output': 'test message',
            'event_type': 'check',
            'state': Check.OK,
        }
        self.manager.archive(event1)

        alarm = self.manager.get_current_alarm(alarm_id)

        self.assertEqual(len(alarm['value'][AlarmField.steps.value]), 6)
        self.assertEqual(alarm['value'][AlarmField.state.value]['val'], 0)
        self.assertFalse(is_keeped_state(alarm['value']))

        self.event_publisher.publish_statcounterinc_event.assert_not_called()

        event1 = {
            'source_type': 'component',
            'connector': 'test',
            'connector_name': 'test0',
            'component': 'ut-comp',
            'timestamp': 0,
            'output':
            'Stop of pbehavior. Name: {}. Type:{}'.format("pb1", "pbt1"),
            'event_type': 'pbhleave',
            'state': 0,
        }
        self.manager.archive(event1)

        alarm = self.manager.get_current_alarm(alarm_id)

        self.assertEqual(len(alarm['value'][AlarmField.steps.value]), 7)
        self.assertEqual(alarm['value'][AlarmField.steps.value][6]['_t'],
                         "pbhleave")
        self.assertFalse(is_keeped_state(alarm['value']))
        self.event_publisher.publish_statcounterinc_event.assert_not_called()
Exemple #6
0
    def test_archive_state_changed(self):
        alarm_id = 'ut-comp'

        # Testing state creation
        event0 = {
            'source_type': 'component',
            'connector': 'test',
            'connector_name': 'test0',
            'component': 'ut-comp',
            'timestamp': 0,
            'output': 'test message',
            'event_type': 'check',
            'state': Check.MINOR,
        }
        self.manager.archive(event0)

        alarm = self.manager.get_current_alarm(alarm_id)

        expected_state = {
            'a': DEFAULT_AUTHOR,
            '_t': "stateinc",
            'm': 'test message',
            't': 0,
            'val': 1,
        }

        self.assertEqual(len(alarm['value'][AlarmField.steps.value]), 2)
        self.assertEqual(alarm['value'][AlarmField.steps.value][0], expected_state)
        self.assertEqual(alarm['value'][AlarmField.state.value], expected_state)

        self.event_publisher.publish_statcounterinc_event.assert_called_once_with(
            alarm['value'][AlarmField.last_update_date.value],
            StatCounters.alarms_created,
            {},
            alarm['value'],
            None)
        self.event_publisher.publish_statcounterinc_event.reset_mock()

        # Testing state increase
        event1 = {
            'source_type': 'component',
            'connector': 'test',
            'connector_name': 'test0',
            'component': 'ut-comp',
            'timestamp': 0,
            'output': 'test message',
            'event_type': 'check',
            'state': Check.MAJOR,
        }
        self.manager.archive(event1)

        alarm = self.manager.get_current_alarm(alarm_id)

        expected_state = {
            'a': DEFAULT_AUTHOR,
            '_t': 'stateinc',
            'm': 'test message',
            't': 0,
            'val': 2,
        }

        self.assertEqual(len(alarm['value'][AlarmField.steps.value]), 3)
        self.assertEqual(alarm['value'][AlarmField.steps.value][2], expected_state)
        self.assertEqual(alarm['value'][AlarmField.state.value], expected_state)

        # Testing keeped state
        event1 = {
            'source_type': 'component',
            'connector': 'test',
            'connector_name': 'test0',
            'component': 'ut-comp',
            'timestamp': 0,
            'output': 'test message',
            'event_type': States.changestate.value,
            'state': Check.MINOR,
        }
        self.manager.archive(event1)

        alarm = self.manager.get_current_alarm(alarm_id)

        self.assertEqual(len(alarm['value'][AlarmField.steps.value]), 4)
        self.assertEqual(alarm['value'][AlarmField.state.value]['val'], 1)
        self.assertTrue(is_keeped_state(alarm['value']))

        event1 = {
            'source_type': 'component',
            'connector': 'test',
            'connector_name': 'test0',
            'component': 'ut-comp',
            'timestamp': 0,
            'output': 'test message',
            'event_type': 'check',
            'state': Check.CRITICAL,
        }
        self.manager.archive(event1)

        alarm = self.manager.get_current_alarm(alarm_id)

        self.assertEqual(len(alarm['value'][AlarmField.steps.value]), 4)
        self.assertEqual(alarm['value'][AlarmField.state.value]['val'], 1)
        self.assertTrue(is_keeped_state(alarm['value']))

        # Disengaging keepstate
        event1 = {
            'source_type': 'component',
            'connector': 'test',
            'connector_name': 'test0',
            'component': 'ut-comp',
            'timestamp': 0,
            'output': 'test message',
            'event_type': 'check',
            'state': Check.OK,
        }
        self.manager.archive(event1)

        alarm = self.manager.get_current_alarm(alarm_id)

        self.assertEqual(len(alarm['value'][AlarmField.steps.value]), 6)
        self.assertEqual(alarm['value'][AlarmField.state.value]['val'], 0)
        self.assertFalse(is_keeped_state(alarm['value']))

        self.event_publisher.publish_statcounterinc_event.assert_not_called()
Exemple #7
0
    def change_of_state(self, alarm, old_state, state, event):
        """
        Change state when ``update_state()`` detected a state change.

        :param dict alarm: Associated alarm to state change event
        :param int old_state: Previous state
        :param int state: New state
        :param dict event: Associated event
        :return: alarm with changed state
        :rtype: dict
        """

        storage_value = self.alerts_storage.VALUE
        # Check for a forced state on this alarm
        if is_keeped_state(alarm['value']):
            if state == Check.OK:
                # Disengaging 'keepstate' flag
                alarm[storage_value][AlarmField.state.value]['_t'] = None
            else:
                self.logger.info('Entity {} not allowed to change state: '
                                 'ignoring'.format(alarm['data_id']))
                return alarm

        # Escalation
        if state > old_state:
            task = get_task('alerts.systemaction.state_increase',
                            cacheonly=True)

        elif state < old_state:
            task = get_task('alerts.systemaction.state_decrease',
                            cacheonly=True)

        # Executing task
        now = int(time())
        value = alarm.get(self.alerts_storage.VALUE)
        new_value, status = task(self, value, state, event)
        new_value[AlarmField.last_update_date.value] = now

        entity_id = alarm[self.alerts_storage.DATA_ID]
        try:
            entity = self.context_manager.get_entities_by_id(entity_id)[0]
        except IndexError:
            entity = {}

        # Send statistics event
        last_state_change = entity.get(Entity.LAST_STATE_CHANGE)
        if last_state_change:
            self.event_publisher.publish_statstateinterval_event(
                now, StatStateIntervals.time_in_state, now - last_state_change,
                old_state, entity, new_value)

        if state == AlarmState.CRITICAL:
            self.event_publisher.publish_statcounterinc_event(
                now, StatCounters.downtimes, entity, new_value,
                event.get(self.AUTHOR))

        # Update entity's last_state_change
        if entity:
            entity[Entity.LAST_STATE_CHANGE] = now
            self.context_manager.update_entity_body(entity)

        alarm[storage_value] = new_value

        return self.update_status(alarm, status, event)
Exemple #8
0
    def test_isnot_keeped_state(self):
        self.alarm[AlarmField.state.value] = {}
        self.alarm[AlarmField.state.value]['_t'] = None

        self.assertFalse(is_keeped_state(self.alarm))
Exemple #9
0
    def test_is_keeped_state(self):
        self.alarm[AlarmField.state.value] = {}
        self.alarm[AlarmField.state.value]['_t'] = States.changestate.value

        self.assertTrue(is_keeped_state(self.alarm))
Exemple #10
0
    def test_archive_state_changed(self):
        alarm_id = 'ut-comp'

        # Testing state creation
        event0 = {
            'source_type': 'component',
            'connector': 'test',
            'connector_name': 'test0',
            'component': 'ut-comp',
            'timestamp': 0,
            'output': 'test message',
            'event_type': 'check',
            'state': Check.MINOR,
        }
        self.manager.archive(event0)

        alarm = self.manager.get_current_alarm(alarm_id)

        expected_state = {
            'a': 'test.test0',
            '_t': 'stateinc',
            'm': 'test message',
            't': 0,
            'val': 1,
        }

        self.assertEqual(len(alarm['value'][AlarmField.steps.value]), 2)
        self.assertEqual(alarm['value'][AlarmField.steps.value][0],
                         expected_state)
        self.assertEqual(alarm['value'][AlarmField.state.value],
                         expected_state)

        self.event_publisher.publish_statcounterinc_event.assert_any_call(
            alarm['value'][AlarmField.last_update_date.value],
            StatCounters.alarms_created, {}, alarm['value'])
        self.event_publisher.publish_statcounterinc_event.assert_any_call(
            alarm['value'][AlarmField.last_update_date.value],
            StatCounters.alarms_impacting, {}, alarm['value'])
        self.assertEqual(
            self.event_publisher.publish_statcounterinc_event.call_count, 2)
        self.event_publisher.publish_statcounterinc_event.reset_mock()

        # Testing state increase
        event1 = {
            'source_type': 'component',
            'connector': 'test',
            'connector_name': 'test0',
            'component': 'ut-comp',
            'timestamp': 0,
            'output': 'test message',
            'event_type': 'check',
            'state': Check.MAJOR,
        }
        self.manager.archive(event1)

        alarm = self.manager.get_current_alarm(alarm_id)

        expected_state = {
            'a': 'test.test0',
            '_t': 'stateinc',
            'm': 'test message',
            't': 0,
            'val': 2,
        }

        self.assertEqual(len(alarm['value'][AlarmField.steps.value]), 3)
        self.assertEqual(alarm['value'][AlarmField.steps.value][2],
                         expected_state)
        self.assertEqual(alarm['value'][AlarmField.state.value],
                         expected_state)

        # Testing keeped state
        event1 = {
            'source_type': 'component',
            'connector': 'test',
            'connector_name': 'test0',
            'component': 'ut-comp',
            'timestamp': 0,
            'output': 'test message',
            'event_type': States.changestate.value,
            'state': Check.MINOR,
        }
        self.manager.archive(event1)

        alarm = self.manager.get_current_alarm(alarm_id)

        self.assertEqual(len(alarm['value'][AlarmField.steps.value]), 4)
        self.assertEqual(alarm['value'][AlarmField.state.value]['val'], 1)
        self.assertTrue(is_keeped_state(alarm['value']))

        event1 = {
            'source_type': 'component',
            'connector': 'test',
            'connector_name': 'test0',
            'component': 'ut-comp',
            'timestamp': 0,
            'output': 'test message',
            'event_type': 'check',
            'state': Check.CRITICAL,
        }
        self.manager.archive(event1)

        alarm = self.manager.get_current_alarm(alarm_id)

        self.assertEqual(len(alarm['value'][AlarmField.steps.value]), 4)
        self.assertEqual(alarm['value'][AlarmField.state.value]['val'], 1)
        self.assertTrue(is_keeped_state(alarm['value']))

        # Disengaging keepstate
        event1 = {
            'source_type': 'component',
            'connector': 'test',
            'connector_name': 'test0',
            'component': 'ut-comp',
            'timestamp': 0,
            'output': 'test message',
            'event_type': 'check',
            'state': Check.OK,
        }
        self.manager.archive(event1)

        alarm = self.manager.get_current_alarm(alarm_id)

        self.assertEqual(len(alarm['value'][AlarmField.steps.value]), 6)
        self.assertEqual(alarm['value'][AlarmField.state.value]['val'], 0)
        self.assertFalse(is_keeped_state(alarm['value']))

        self.event_publisher.publish_statcounterinc_event.assert_not_called()
Exemple #11
0
    def change_of_state(self, alarm, old_state, state, event):
        """
        Change state when ``update_state()`` detected a state change.

        :param dict alarm: Associated alarm to state change event
        :param int old_state: Previous state
        :param int state: New state
        :param dict event: Associated event
        :return: alarm with changed state
        :rtype: dict
        """

        storage_value = self.alerts_storage.VALUE
        # Check for a forced state on this alarm
        if is_keeped_state(alarm['value']):
            if state == Check.OK:
                # Disengaging 'keepstate' flag
                alarm[storage_value][AlarmField.state.value]['_t'] = None
            else:
                self.logger.info('Entity {} not allowed to change state: '
                                 'ignoring'.format(alarm['data_id']))
                return alarm

        # Escalation
        if state > old_state:
            task = get_task(
                'alerts.systemaction.state_increase', cacheonly=True
            )

        elif state < old_state:
            task = get_task(
                'alerts.systemaction.state_decrease', cacheonly=True
            )

        # Executing task
        now = int(time())
        value = alarm.get(self.alerts_storage.VALUE)
        new_value, status = task(self, value, state, event)
        new_value[AlarmField.last_update_date.value] = now

        entity_id = alarm[self.alerts_storage.DATA_ID]
        try:
            entity = self.context_manager.get_entities_by_id(entity_id)[0]
        except IndexError:
            entity = {}

        # Send statistics event
        last_state_change = entity.get(Entity.LAST_STATE_CHANGE)
        if last_state_change:
            self.event_publisher.publish_statstateinterval_event(
                now,
                StatStateIntervals.time_in_state,
                now - last_state_change,
                old_state,
                entity,
                new_value)

        if state == AlarmState.CRITICAL:
            self.event_publisher.publish_statcounterinc_event(
                now,
                StatCounters.downtimes,
                entity,
                new_value,
                event.get(self.AUTHOR))

        # Update entity's last_state_change
        if entity:
            entity[Entity.LAST_STATE_CHANGE] = now
            self.context_manager.update_entity_body(entity)

        alarm[storage_value] = new_value

        return self.update_status(alarm, status, event)