diff --git a/vitrage/datasources/alarm_driver_base.py b/vitrage/datasources/alarm_driver_base.py index a239c3fd7..c5a89eba0 100644 --- a/vitrage/datasources/alarm_driver_base.py +++ b/vitrage/datasources/alarm_driver_base.py @@ -103,6 +103,9 @@ class AlarmDriverBase(DriverBase): old_alarm, timestamp = self.cache.get(alarm_key, (None, None)) if filter_(self, alarm, old_alarm): + # delete state changed alarm: alarm->OK + if not self._is_erroneous(alarm): + alarm[DSProps.EVENT_TYPE] = EventAction.DELETE_ENTITY alarms_to_update.append(alarm) self.cache[alarm_key] = alarm, now diff --git a/vitrage/datasources/alarm_transformer_base.py b/vitrage/datasources/alarm_transformer_base.py index 46410c368..15530d340 100644 --- a/vitrage/datasources/alarm_transformer_base.py +++ b/vitrage/datasources/alarm_transformer_base.py @@ -14,11 +14,9 @@ from oslo_log import log as logging -from vitrage.common.constants import ActionType from vitrage.common.constants import DatasourceProperties as DSProps from vitrage.common.constants import EntityCategory from vitrage.common.constants import EventAction -from vitrage.common.exception import VitrageTransformerError from vitrage.datasources.alarm_properties import AlarmProperties as AlarmProps from vitrage.datasources import transformer_base as tbase @@ -37,24 +35,6 @@ class AlarmTransformerBase(tbase.TransformerBase): LOG.info('An alarm cannot be a placeholder') pass - def _extract_action_type(self, entity_event): - # TODO(ifat_afek): this method should reside together with the cache, - # in the transformer code - if DSProps.EVENT_TYPE in entity_event and \ - entity_event[DSProps.EVENT_TYPE] == EventAction.DELETE_ENTITY: - return entity_event[DSProps.EVENT_TYPE] - - action_type = entity_event[DSProps.ACTION_TYPE] - if action_type in (ActionType.UPDATE, ActionType.SNAPSHOT): - return EventAction.DELETE_ENTITY if self._ok_status(entity_event) \ - else EventAction.UPDATE_ENTITY - - if ActionType.INIT_SNAPSHOT == action_type: - return EventAction.CREATE_ENTITY - - raise VitrageTransformerError('Invalid action type: (%s)' - % action_type) - def _key_values(self, *args): return (EntityCategory.ALARM,) + args diff --git a/vitrage/datasources/transformer_base.py b/vitrage/datasources/transformer_base.py index 8741f08e8..c018bf22b 100644 --- a/vitrage/datasources/transformer_base.py +++ b/vitrage/datasources/transformer_base.py @@ -119,7 +119,7 @@ class TransformerBase(object): if not self._is_end_message(entity_event): entity_vertex = self._create_entity_vertex(entity_event) neighbors = self._create_neighbors(entity_event) - action = self._extract_action_type(entity_event) + action = self._extract_event_action(entity_event) return EntityWrapper(entity_vertex, neighbors, action) else: @@ -201,8 +201,8 @@ class TransformerBase(object): """ pass - def _extract_action_type(self, entity_event): - """Extract action type. + def _extract_event_action(self, entity_event): + """Extract event action. Decides what action (from constants.EventAction) the processor need to perform according to the data received from the event. @@ -212,6 +212,10 @@ class TransformerBase(object): :rtype: str """ + if DSProps.EVENT_TYPE in entity_event and \ + entity_event[DSProps.EVENT_TYPE] in EventAction.__dict__.values(): + return entity_event[DSProps.EVENT_TYPE] + action_type = entity_event[DSProps.ACTION_TYPE] if ActionType.UPDATE == action_type: diff --git a/vitrage/evaluator/actions/evaluator_event_transformer.py b/vitrage/evaluator/actions/evaluator_event_transformer.py index 6fac02f09..a6452d721 100644 --- a/vitrage/evaluator/actions/evaluator_event_transformer.py +++ b/vitrage/evaluator/actions/evaluator_event_transformer.py @@ -131,7 +131,7 @@ class EvaluatorEventTransformer(transformer_base.TransformerBase): return [] - def _extract_action_type(self, event): + def _extract_event_action(self, event): event_type = event[EVALUATOR_EVENT_TYPE] try: diff --git a/vitrage/tests/functional/evaluator/test_scenario_evaluator.py b/vitrage/tests/functional/evaluator/test_scenario_evaluator.py index cb074c870..3c8a9ad05 100644 --- a/vitrage/tests/functional/evaluator/test_scenario_evaluator.py +++ b/vitrage/tests/functional/evaluator/test_scenario_evaluator.py @@ -16,7 +16,9 @@ from oslo_config import cfg from oslo_log import log as logging from six.moves import queue +from vitrage.common.constants import DatasourceProperties as DSProps from vitrage.common.constants import EdgeProperties as EProps +from vitrage.common.constants import EventAction from vitrage.common.constants import VertexProperties as VProps from vitrage.datasources.nova.host import NOVA_HOST_DATASOURCE from vitrage.evaluator.scenario_evaluator import ScenarioEvaluator @@ -235,6 +237,7 @@ class TestScenarioEvaluator(TestFunctionalBase): # remove WARNING nagios alarm, leaving only CRITICAL one warning_test['status'] = 'OK' + warning_test[DSProps.EVENT_TYPE] = EventAction.DELETE_ENTITY host_v = self.get_host_after_event(event_queue, warning_test, processor, _TARGET_HOST) alarms = \ @@ -246,6 +249,7 @@ class TestScenarioEvaluator(TestFunctionalBase): # next disable the alarm critical_test['status'] = 'OK' + critical_test[DSProps.EVENT_TYPE] = EventAction.DELETE_ENTITY host_v = self.get_host_after_event(event_queue, critical_test, processor, _TARGET_HOST) alarms = \ diff --git a/vitrage/tests/unit/datasources/nagios/test_nagios_transformer.py b/vitrage/tests/unit/datasources/nagios/test_nagios_transformer.py index 444407ebf..1bd4afd97 100644 --- a/vitrage/tests/unit/datasources/nagios/test_nagios_transformer.py +++ b/vitrage/tests/unit/datasources/nagios/test_nagios_transformer.py @@ -103,12 +103,14 @@ class NagiosTransformerTest(base.BaseTest): self._validate_action(alarm, wrapper) def _validate_action(self, alarm, wrapper): + if DSProps.EVENT_TYPE in alarm \ + and alarm[DSProps.EVENT_TYPE] in EventAction.__dict__.values(): + self.assertEqual(alarm[DSProps.EVENT_TYPE], wrapper.action) + return + action_type = alarm[DSProps.ACTION_TYPE] if action_type in (ActionType.SNAPSHOT, ActionType.UPDATE): - if alarm[NagiosProperties.STATUS] == 'OK': - self.assertEqual(EventAction.DELETE_ENTITY, wrapper.action) - else: - self.assertEqual(EventAction.UPDATE_ENTITY, wrapper.action) + self.assertEqual(EventAction.UPDATE_ENTITY, wrapper.action) else: self.assertEqual(EventAction.CREATE_ENTITY, wrapper.action) diff --git a/vitrage/tests/unit/datasources/nova/test_nova_host_transformer.py b/vitrage/tests/unit/datasources/nova/test_nova_host_transformer.py index 39c7996f6..956ddf135 100644 --- a/vitrage/tests/unit/datasources/nova/test_nova_host_transformer.py +++ b/vitrage/tests/unit/datasources/nova/test_nova_host_transformer.py @@ -192,8 +192,8 @@ class NovaHostTransformerTest(base.BaseTest): is_deleted = vertex[VertexProperties.IS_DELETED] self.assertFalse(is_deleted) - def test_extract_action_type(self): - LOG.debug('Test extract action type') + def test_extract_event_action(self): + LOG.debug('Test extract event action') # Test setup spec_list = mock_sync.simple_host_generators( @@ -206,7 +206,7 @@ class NovaHostTransformerTest(base.BaseTest): host_transformer = self.transformers[NOVA_HOST_DATASOURCE] # Test action - action = host_transformer._extract_action_type(hosts_events[0]) + action = host_transformer._extract_event_action(hosts_events[0]) # Test assertion self.assertEqual(EventAction.UPDATE_ENTITY, action) @@ -221,7 +221,7 @@ class NovaHostTransformerTest(base.BaseTest): host_transformer = self.transformers[NOVA_HOST_DATASOURCE] # Test action - action = host_transformer._extract_action_type(hosts_events[0]) + action = host_transformer._extract_event_action(hosts_events[0]) # Test assertions self.assertEqual(EventAction.CREATE_ENTITY, action) diff --git a/vitrage/tests/unit/datasources/zabbix/test_zabbix_transformer.py b/vitrage/tests/unit/datasources/zabbix/test_zabbix_transformer.py index 2af76c606..d008a7a61 100644 --- a/vitrage/tests/unit/datasources/zabbix/test_zabbix_transformer.py +++ b/vitrage/tests/unit/datasources/zabbix/test_zabbix_transformer.py @@ -109,12 +109,14 @@ class ZabbixTransformerTest(base.BaseTest): self._validate_action(alarm, wrapper) def _validate_action(self, alarm, wrapper): + if DSProps.EVENT_TYPE in alarm \ + and alarm[DSProps.EVENT_TYPE] in EventAction.__dict__.values(): + self.assertEqual(alarm[DSProps.EVENT_TYPE], wrapper.action) + return + action_type = alarm[DSProps.ACTION_TYPE] if action_type in (ActionType.SNAPSHOT, ActionType.UPDATE): - if alarm[ZabbixProps.VALUE] == ZabbixTriggerValue.OK: - self.assertEqual(EventAction.DELETE_ENTITY, wrapper.action) - else: - self.assertEqual(EventAction.UPDATE_ENTITY, wrapper.action) + self.assertEqual(EventAction.UPDATE_ENTITY, wrapper.action) else: self.assertEqual(EventAction.CREATE_ENTITY, wrapper.action)