Пример #1
0
class AgentManager:
    def __init__(self):
        self.inspector_manager = setup_inspector()
        self.pipe_manager = setup_pipe()
        self.publisher_manager = setup_publisher()
        self.sched = BlockingScheduler()

    def setup_tasks(self):
        """
        tasks:{
          TYPE: {
            INTERVAL: [
              (item,inspector),
            ...]
            }...}
        """
        tasks = {"poll": {}, "cron": {}}
        for pipe_k in self.pipe_manager:
            inspector = self.inspector_manager.get(pipe_k)
            for item in self.pipe_manager[pipe_k]:
                type = item["task"]["type"]
                # v -->interval、timepoint
                if type == "poll":
                    v = item["task"]["interval"]
                else:
                    v = item["task"]["timepoint"]
                if not tasks[type].has_key(v):
                    tasks[type][v] = []
                task = (item, inspector)
                tasks[type][v].append(task)
        return tasks

    def start(self):
        for type, ctasks in six.iteritems(self.setup_tasks()):
            # v -->interval、timepoint
            if type == 'poll':
                for v, tasks in six.iteritems(ctasks):
                    for task in tasks:
                        self.sched.add_job(self.run_task,
                                           trigger='interval',
                                           seconds=int(v),
                                           args=[task])
                        LOG.info("Add a task. (%s)" % str(task))
            elif type == 'cron':
                for v, tasks in six.iteritems(ctasks):
                    hour, minutes, seconds = v.split(':')
                    for task in tasks:
                        self.sched.add_cron_job(self.run_task,
                                                days='*', hours=int(hour),
                                                minutes=int(minutes),
                                                seconds=int(seconds),
                                                args=[task])
                        LOG.info("Add a task. (%s)" % str(task))
            else:
                LOG.warning("The type is error! (%s)" % type)
        self.sched.start()

    def run_task(self, task):
        args, inspector = task
        publisher = args["publisher"]
        publishers = publisher["publishers"]
        receivers = publisher["users"]
        alarm, content = inspector.get_module(args).run()
        if alarm:
            LOG.info("The task alarm. (%s:%s)" %
                     (inspector, str(args)))
            for publisher in publishers:
                self.publisher_manager[publisher]. \
                    get_module(receivers, content).send()
        else:
            LOG.info("The task does not alarm. (%s:%s)" %
                     (inspector, str(args)))
            return