Files
vitrage/vitrage/entity_graph/vitrage_init.py
idan kinory f381a42583 support adding and deleting templates without the need to restart vitrage.
* templates are now stored in the database.
* evaluator is reloaded whenever a template is added/removed.
* supporting all types of templates (standard, equivalence, definition)
* new cli commands:
  - vitrage template add
  - vitrage template delete

Change-Id: I58abf5e034662206bd6919493c95c450c0ecdf9c
Depends-On: I07741ed100b9eb70b303567706b659d10a34b156
Implements: blueprint crud-templates
2018-01-18 15:54:52 +00:00

113 lines
4.3 KiB
Python

# 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 oslo_log import log
import time
from vitrage.common.constants import VertexProperties as VProps
LOG = log.getLogger(__name__)
class VitrageInit(object):
STARTED = 'started'
RECEIVED_ALL_END_MESSAGES = 'received_all_end_messages'
FINISHED = 'finished'
def __init__(self, conf, graph=None, evaluator=None, template_loader=None):
self.conf = conf
self.graph = graph
self.evaluator = evaluator
self.template_loader = template_loader
self.status = self.STARTED
self.end_messages = {}
def initializing_process(self, on_end_messages_func):
try:
LOG.info('Init Started')
if not self._wait_for_all_end_messages():
LOG.warning('Initialization - max retries reached %s',
self.end_messages)
else:
LOG.info('Initialization - All end messages were received')
on_end_messages_func()
self.evaluator.start()
if self.template_loader:
self.template_loader.start()
# TODO(idan_hefetz) As vitrage is not yet persistent, there aren't
# TODO(idan_hefetz) any deduced alarms to be removed during init
# if not self._wait_for_action(self.evaluator_queue.empty):
# LOG.error('Evaluator Queue Not Empty')
# self._mark_old_deduced_alarms_as_deleted(timestamp, self.graph,
# self.evaluator_queue)
self.status = self.FINISHED
LOG.info('Init Finished')
except Exception as e:
LOG.exception('Init Failed: %s', e)
def handle_end_message(self, vertex):
self.end_messages[vertex[VProps.VITRAGE_TYPE]] = True
if len(self.end_messages) == len(self.conf.datasources.types):
self.status = self.RECEIVED_ALL_END_MESSAGES
def _wait_for_all_end_messages(self):
return self._wait_for_action(
lambda: self.status == self.RECEIVED_ALL_END_MESSAGES)
def _wait_for_action(self, function):
count_retries = 0
while True:
if count_retries >= \
self.conf.consistency.initialization_max_retries:
return False
if function():
return True
count_retries += 1
time.sleep(self.conf.consistency.initialization_interval)
# def _mark_old_deduced_alarms_as_deleted(self, timestamp,graph,out_queue):
# query = {
# 'and': [
# {'==': {VProps.VITRAGE_CATEGORY: EntityCategory.ALARM}},
# {'==': {VProps.VITRAGE_TYPE: VProps.VITRAGE_TYPE}},
# {'<': {VProps.VITRAGE_SAMPLE_TIMESTAMP: timestamp}}
# ]
# }
# old_deduced_alarms = graph.get_vertices(query_dict=query)
# self._push_events_to_queue(old_deduced_alarms,
# GraphAction.DELETE_ENTITY,
# out_queue)
#
# def _push_events_to_queue(self, vertices, action, out_queue):
# for vertex in vertices:
# event = {
# DSProps.ENTITY_TYPE: CONSISTENCY_DATASOURCE,
# DSProps.DATASOURCE_ACTION: DatasourceAction.UPDATE,
# DSProps.SAMPLE_DATE: str(utcnow()),
# DSProps.EVENT_TYPE: action,
# VProps.VITRAGE_ID: vertex[VProps.VITRAGE_ID],
# VProps.ID: vertex.get(VProps.ID, None),
# VProps.VITRAGE_TYPE: vertex[VProps.VITRAGE_TYPE],
# VProps.VITRAGE_CATEGORY: vertex[VProps.VITRAGE_CATEGORY],
# VProps.IS_REAL_VITRAGE_ID: True
# }
# out_queue.put(event)