2018-04-02 22:41:10 +00:00
|
|
|
from lib import Service, Loader, Loadable
|
|
|
|
|
|
|
|
from lib.tasks.worker import worker
|
|
|
|
|
2018-07-28 12:21:15 +00:00
|
|
|
from time import sleep
|
|
|
|
|
2018-04-02 22:41:10 +00:00
|
|
|
from rq import Queue
|
|
|
|
from redis import Redis
|
|
|
|
|
|
|
|
|
|
|
|
class Executor(Service):
|
2018-04-02 23:47:50 +00:00
|
|
|
"""Base class for executors"""
|
2018-04-02 22:41:10 +00:00
|
|
|
def __init__(self, thread, id, root):
|
|
|
|
super().__init__(thread, id, root)
|
|
|
|
self._logger.add_field('service', 'Executor')
|
|
|
|
self._logger.add_field('vname', self.__class__.__name__)
|
|
|
|
|
|
|
|
|
|
|
|
class RQExecutor(Executor):
|
2018-04-02 23:47:50 +00:00
|
|
|
"""rq (redis queue) executor - lightweight; workers placed on different nodes"""
|
2018-04-02 22:41:10 +00:00
|
|
|
def __init__(self, id, root):
|
|
|
|
super().__init__(self.__run, id, root)
|
|
|
|
|
|
|
|
def __run(self):
|
|
|
|
while self._running:
|
|
|
|
try:
|
2018-07-28 12:21:15 +00:00
|
|
|
redis_conn = Redis(host=self.lcnf.get('redis').get('host'))
|
|
|
|
q = Queue('worker', connection=redis_conn)
|
|
|
|
if q.count + 1 > self.lcnf.get('size', 100):
|
|
|
|
sleep(self.lcnf.get('delay', 2))
|
|
|
|
continue
|
|
|
|
for pn, pipeline in self.cnf.get("pipelines").items():
|
2018-04-02 22:41:10 +00:00
|
|
|
self._logger.debug("pipeline: %s", pn)
|
2018-07-28 12:21:15 +00:00
|
|
|
for step in pipeline['steps']:
|
|
|
|
self._logger.debug("step: %s", step['name'])
|
2018-04-02 22:41:10 +00:00
|
|
|
filter = {
|
|
|
|
"not_exist": [
|
2018-07-28 12:21:15 +00:00
|
|
|
pn + '_' + step['name']
|
|
|
|
],
|
|
|
|
"exist": [
|
|
|
|
[tag for tag in step.get("requires")]
|
|
|
|
]
|
2018-04-02 22:41:10 +00:00
|
|
|
}
|
|
|
|
items = []
|
2018-07-28 12:21:15 +00:00
|
|
|
multiple = step.get('multiple', False)
|
|
|
|
if multiple != False:
|
|
|
|
items = self._data.get(block=False, count=multiple, filter=filter)
|
2018-04-02 22:41:10 +00:00
|
|
|
else:
|
2018-07-28 12:21:15 +00:00
|
|
|
items = self._data.get(block=False, filter=filter)
|
|
|
|
if items:
|
|
|
|
self._logger.debug("enqueueing %s.%s with %s", step['package'], step['service'], items)
|
|
|
|
q.enqueue("%s.%s" % (step['package'], step['service']), items)
|
2018-04-02 22:41:10 +00:00
|
|
|
except Exception as e:
|
|
|
|
self._logger.error(e)
|