Ejemplo n.º 1
0
class EvaluatorWorker(GraphCloneWorkerBase):
    def __init__(self, worker_id, task_queues, workers_num):
        super(EvaluatorWorker, self).__init__(worker_id, task_queues)
        self._workers_num = workers_num
        self._evaluator = None

    name = 'EvaluatorWorker'

    def _init_instance(self):
        scenario_repo = ScenarioRepository(self.worker_id, self._workers_num)
        actions_callback = messaging.VitrageNotifier(
            publisher_id='vitrage_evaluator', topics=[EVALUATOR_TOPIC]).notify
        self._evaluator = ScenarioEvaluator(self._entity_graph,
                                            scenario_repo,
                                            actions_callback,
                                            enabled=False)
        self._evaluator.scenario_repo.log_enabled_scenarios()

    def do_task(self, task):
        super(EvaluatorWorker, self).do_task(task)
        action = task[0]
        if action == START_EVALUATION:
            # fresh init (without snapshot) requires iterating the graph
            self._evaluator.run_evaluator()
        elif action == ENABLE_EVALUATION:
            # init with a snapshot does not require iterating the graph
            self._evaluator.enabled = True
        elif action == RELOAD_TEMPLATES:
            self._reload_templates()
        elif action == TEMPLATE_ACTION:
            (action, template_names, action_mode) = task
            self._template_action(template_names, action_mode)

    def _reload_templates(self):
        LOG.info("reloading evaluator scenarios")
        scenario_repo = ScenarioRepository(self.worker_id, self._workers_num)
        self._evaluator.scenario_repo = scenario_repo
        self._evaluator.scenario_repo.log_enabled_scenarios()

    def _template_action(self, template_names, action_mode):
        # Here, we create a temporary ScenarioRepo to execute the needed
        # templates. Once _reload_templates is called, it will create a
        # non temporary ScenarioRepo, to replace this one
        scenario_repo = ScenarioRepository()
        for s in scenario_repo._all_scenarios:
            s.enabled = False
            for template_name in template_names:
                if s.id.startswith(template_name):
                    s.enabled = True
        self._evaluator.scenario_repo = scenario_repo
        self._evaluator.scenario_repo.log_enabled_scenarios()
        self._evaluator.run_evaluator(action_mode)
Ejemplo n.º 2
0
class TemplateLoaderWorker(GraphCloneWorkerBase):
    def __init__(self, worker_id, conf, task_queues, e_graph):
        super(TemplateLoaderWorker, self).__init__(worker_id, conf,
                                                   task_queues, e_graph)
        self._evaluator = None

    name = 'TemplateLoaderWorker'

    def _init_instance(self):
        actions_callback = messaging.VitrageNotifier(
            conf=self._conf,
            publisher_id='vitrage_evaluator',
            topics=[EVALUATOR_TOPIC]).notify
        self._evaluator = ScenarioEvaluator(self._conf,
                                            self._entity_graph,
                                            None,
                                            actions_callback,
                                            enabled=False)

    def do_task(self, task):
        super(TemplateLoaderWorker, self).do_task(task)
        action = task[0]
        if action == TEMPLATE_ACTION:
            (action, template_names, action_mode) = task
            self._template_action(template_names, action_mode)

    def _template_action(self, template_names, action_mode):
        self._enable_evaluator_templates(template_names)
        self._evaluator.run_evaluator(action_mode)
        self._disable_evaluator()

    def _enable_evaluator_templates(self, template_names):
        scenario_repo = ScenarioRepository(self._conf)
        for s in scenario_repo._all_scenarios:
            s.enabled = False
            for template_name in template_names:
                if s.id.startswith(template_name):
                    s.enabled = True
        self._evaluator.scenario_repo = scenario_repo
        self._evaluator.scenario_repo.log_enabled_scenarios()
        self._evaluator.enabled = True

    def _disable_evaluator(self):
        self._entity_graph.notifier._subscriptions = []  # Quick n dirty
        self._evaluator.enabled = False
Ejemplo n.º 3
0
class EvaluatorWorker(GraphCloneWorkerBase):
    def __init__(self, worker_id, conf, task_queues, e_graph, workers_num):
        super(EvaluatorWorker, self).__init__(worker_id, conf, task_queues,
                                              e_graph)
        self._workers_num = workers_num
        self._evaluator = None

    name = 'EvaluatorWorker'

    def _init_instance(self):
        scenario_repo = ScenarioRepository(self._conf, self.worker_id,
                                           self._workers_num)
        actions_callback = messaging.VitrageNotifier(
            conf=self._conf,
            publisher_id='vitrage_evaluator',
            topics=[EVALUATOR_TOPIC]).notify
        self._evaluator = ScenarioEvaluator(self._conf,
                                            self._entity_graph,
                                            scenario_repo,
                                            actions_callback,
                                            enabled=False)
        self._evaluator.scenario_repo.log_enabled_scenarios()

    def do_task(self, task):
        super(EvaluatorWorker, self).do_task(task)
        action = task[0]
        if action == START_EVALUATION:
            # fresh init (without snapshot) requires iterating the graph
            self._evaluator.run_evaluator()
        elif action == ENABLE_EVALUATION:
            # init with a snapshot does not require iterating the graph
            self._evaluator.enabled = True
        elif action == RELOAD_TEMPLATES:
            self._reload_templates()

    def _reload_templates(self):
        LOG.info("reloading evaluator scenarios")
        scenario_repo = ScenarioRepository(self._conf, self.worker_id,
                                           self._workers_num)
        self._evaluator.scenario_repo = scenario_repo
        self._evaluator.scenario_repo.log_enabled_scenarios()
Ejemplo n.º 4
0
class EvaluatorWorker(os_service.Service):
    def __init__(self,
                 conf,
                 task_queue,
                 entity_graph,
                 scenario_repo,
                 enabled=False):
        super(EvaluatorWorker, self).__init__()
        self._conf = conf
        self._task_queue = task_queue
        self._entity_graph = entity_graph
        self._scenario_repo = scenario_repo
        self._enabled = enabled
        self._evaluator = None

    def start(self):
        super(EvaluatorWorker, self).start()
        actions_callback = VitrageNotifier(conf=self._conf,
                                           publisher_id='vitrage_evaluator',
                                           topic=EVALUATOR_TOPIC).notify
        self._entity_graph.notifier._subscriptions = []  # Quick n dirty
        self._evaluator = ScenarioEvaluator(self._conf, self._entity_graph,
                                            self._scenario_repo,
                                            actions_callback, self._enabled)
        self.tg.add_thread(self._read_queue)
        LOG.info("EvaluatorWorkerService - Started!")
        self._evaluator.scenario_repo.log_enabled_scenarios()

    def _read_queue(self):
        while True:
            next_task = self._task_queue.get()
            if next_task is POISON_PILL:
                self._task_queue.task_done()
                break
            try:
                self._do_task(next_task)
            except Exception as e:
                LOG.exception("Graph may not be in sync: exception %s", e)
            self._task_queue.task_done()
            # Evaluator queue may have been updated, thus the sleep:
            time.sleep(0)

    def _do_task(self, task):
        (before, current, is_vertex, action) = task
        if not action:
            self._graph_update(before, current, is_vertex)
        elif action == START_EVALUATION:
            self._evaluator.run_evaluator()

    def _graph_update(self, before, current, is_vertex):
        if current:
            if is_vertex:
                self._entity_graph.add_vertex(current)
            else:
                self._entity_graph.add_edge(current)
        else:
            if is_vertex:
                self._entity_graph.delete_vertex(before)
            else:
                self._entity_graph.delete_edge(before)

    def stop(self, graceful=False):
        super(EvaluatorWorker, self).stop(graceful)
        self.tg.stop()
        LOG.info("EvaluatorWorkerService - Stopped!")