Fix processor bug - cannot create an alarm after it was deleted
Change-Id: Ie9339d5b28ab76beffb31ee7aed7c6e6492eb07d
This commit is contained in:
parent
c1266cb25d
commit
22e3f1f636
@ -12,7 +12,6 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
from dateutil import parser
|
|
||||||
from oslo_log import log
|
from oslo_log import log
|
||||||
|
|
||||||
from vitrage.common.constants import EdgeProperties as EProps
|
from vitrage.common.constants import EdgeProperties as EProps
|
||||||
@ -86,27 +85,6 @@ class EntityGraph(NXGraph):
|
|||||||
type_ = vertex[VProps.TYPE]
|
type_ = vertex[VProps.TYPE]
|
||||||
return category, type_
|
return category, type_
|
||||||
|
|
||||||
def check_update_validation(self, graph_vertex, updated_vertex):
|
|
||||||
"""Checks current and updated validation
|
|
||||||
|
|
||||||
Check 2 conditions:
|
|
||||||
1. is the vertex not deleted
|
|
||||||
2. is updated timestamp bigger then current timestamp
|
|
||||||
"""
|
|
||||||
|
|
||||||
return (not self.is_vertex_deleted(graph_vertex)) and \
|
|
||||||
self.check_timestamp(graph_vertex, updated_vertex)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def check_timestamp(graph_vertex, new_vertex):
|
|
||||||
curr_timestamp = graph_vertex.get(VProps.SAMPLE_TIMESTAMP)
|
|
||||||
if not curr_timestamp:
|
|
||||||
return True
|
|
||||||
|
|
||||||
current_time = parser.parse(curr_timestamp)
|
|
||||||
new_time = parser.parse(new_vertex[VProps.SAMPLE_TIMESTAMP])
|
|
||||||
return current_time <= new_time
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def can_update_vertex(graph_vertex, new_vertex):
|
def can_update_vertex(graph_vertex, new_vertex):
|
||||||
return (not graph_vertex) or (not new_vertex[VProps.IS_PLACEHOLDER])
|
return (not graph_vertex) or (not new_vertex[VProps.IS_PLACEHOLDER])
|
||||||
|
@ -21,6 +21,7 @@ from vitrage.datasources.transformer_base import TransformerBase
|
|||||||
from vitrage.entity_graph.processor import base as processor
|
from vitrage.entity_graph.processor import base as processor
|
||||||
from vitrage.entity_graph.processor import entity_graph
|
from vitrage.entity_graph.processor import entity_graph
|
||||||
from vitrage.entity_graph.processor.notifier import DeducedAlarmNotifier
|
from vitrage.entity_graph.processor.notifier import DeducedAlarmNotifier
|
||||||
|
from vitrage.entity_graph.processor import processor_utils as PUtils
|
||||||
from vitrage.entity_graph.states.state_manager import StateManager
|
from vitrage.entity_graph.states.state_manager import StateManager
|
||||||
from vitrage.entity_graph.transformer_manager import TransformerManager
|
from vitrage.entity_graph.transformer_manager import TransformerManager
|
||||||
from vitrage.graph import Direction
|
from vitrage.graph import Direction
|
||||||
@ -90,11 +91,10 @@ class Processor(processor.ProcessorBase):
|
|||||||
|
|
||||||
LOG.debug('Update entity in entity graph:\n%s', updated_vertex)
|
LOG.debug('Update entity in entity graph:\n%s', updated_vertex)
|
||||||
|
|
||||||
graph_vertex = \
|
graph_vertex = self.entity_graph.get_vertex(updated_vertex.vertex_id)
|
||||||
self.entity_graph.get_vertex(updated_vertex.vertex_id)
|
|
||||||
|
|
||||||
if (not graph_vertex) or self.entity_graph.check_update_validation(
|
if (not graph_vertex) or \
|
||||||
graph_vertex, updated_vertex):
|
PUtils.is_newer_vertex(graph_vertex, updated_vertex):
|
||||||
self.entity_graph.update_entity_graph_vertex(graph_vertex,
|
self.entity_graph.update_entity_graph_vertex(graph_vertex,
|
||||||
updated_vertex)
|
updated_vertex)
|
||||||
self._update_neighbors(updated_vertex, neighbors)
|
self._update_neighbors(updated_vertex, neighbors)
|
||||||
@ -116,11 +116,10 @@ class Processor(processor.ProcessorBase):
|
|||||||
|
|
||||||
LOG.debug('Delete entity from entity graph:\n%s', deleted_vertex)
|
LOG.debug('Delete entity from entity graph:\n%s', deleted_vertex)
|
||||||
|
|
||||||
graph_vertex = \
|
graph_vertex = self.entity_graph.get_vertex(deleted_vertex.vertex_id)
|
||||||
self.entity_graph.get_vertex(deleted_vertex.vertex_id)
|
|
||||||
|
|
||||||
if (not graph_vertex) or self.entity_graph.check_update_validation(
|
if graph_vertex and (not PUtils.is_deleted(graph_vertex)) and \
|
||||||
graph_vertex, deleted_vertex):
|
PUtils.is_newer_vertex(graph_vertex, deleted_vertex):
|
||||||
neighbor_vertices = self.entity_graph.neighbors(
|
neighbor_vertices = self.entity_graph.neighbors(
|
||||||
deleted_vertex.vertex_id)
|
deleted_vertex.vertex_id)
|
||||||
neighbor_edges = self.entity_graph.get_edges(
|
neighbor_edges = self.entity_graph.get_edges(
|
||||||
@ -192,8 +191,7 @@ class Processor(processor.ProcessorBase):
|
|||||||
neighbors, valid_edges)
|
neighbors, valid_edges)
|
||||||
for (vertex, edge) in neighbors:
|
for (vertex, edge) in neighbors:
|
||||||
graph_vertex = self.entity_graph.get_vertex(vertex.vertex_id)
|
graph_vertex = self.entity_graph.get_vertex(vertex.vertex_id)
|
||||||
if not graph_vertex or \
|
if not graph_vertex or not PUtils.is_deleted(graph_vertex):
|
||||||
not self.entity_graph.is_vertex_deleted(graph_vertex):
|
|
||||||
if self.entity_graph.can_update_vertex(graph_vertex, vertex):
|
if self.entity_graph.can_update_vertex(graph_vertex, vertex):
|
||||||
LOG.debug("Updates vertex: %s", vertex)
|
LOG.debug("Updates vertex: %s", vertex)
|
||||||
self._calculate_aggregated_state(vertex, action)
|
self._calculate_aggregated_state(vertex, action)
|
||||||
|
39
vitrage/entity_graph/processor/processor_utils.py
Normal file
39
vitrage/entity_graph/processor/processor_utils.py
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
# Copyright 2016 - Nokia
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
from dateutil import parser
|
||||||
|
from vitrage.common.constants import EdgeProperties as EProps
|
||||||
|
from vitrage.common.constants import VertexProperties as VProps
|
||||||
|
from vitrage.graph import Edge
|
||||||
|
from vitrage.graph import Vertex
|
||||||
|
|
||||||
|
|
||||||
|
def is_newer_vertex(prev_vertex, new_vertex):
|
||||||
|
prev_timestamp = prev_vertex.get(VProps.SAMPLE_TIMESTAMP)
|
||||||
|
if not prev_timestamp:
|
||||||
|
return True
|
||||||
|
prev_time = parser.parse(prev_timestamp)
|
||||||
|
|
||||||
|
new_timestamp = new_vertex[VProps.SAMPLE_TIMESTAMP]
|
||||||
|
if not new_timestamp:
|
||||||
|
return False
|
||||||
|
new_time = parser.parse(new_timestamp)
|
||||||
|
|
||||||
|
return prev_time <= new_time
|
||||||
|
|
||||||
|
|
||||||
|
def is_deleted(item):
|
||||||
|
return item and \
|
||||||
|
(isinstance(item, Vertex) and item.get(VProps.IS_DELETED, False)) or\
|
||||||
|
(isinstance(item, Edge) and item.get(EProps.IS_DELETED, False))
|
Loading…
x
Reference in New Issue
Block a user