diff --git a/elstat/adapters.py b/elstat/adapters.py new file mode 100644 index 0000000..303f3d2 --- /dev/null +++ b/elstat/adapters.py @@ -0,0 +1,9 @@ +class PingAdapter: + async def query(worker, adp_args: dict): + return None + + +class ElixireAdapter: + async def query(worker, adp_args: dict): + return + diff --git a/elstat/consts.py b/elstat/consts.py new file mode 100644 index 0000000..5a30671 --- /dev/null +++ b/elstat/consts.py @@ -0,0 +1,7 @@ +from .adapters import ElixireAdapter, PingAdapter + + +ADAPTERS = { + 'elixire': ElixireAdapter, + 'ping': PingAdapter, +} diff --git a/elstat/manager.py b/elstat/manager.py new file mode 100644 index 0000000..a7376a5 --- /dev/null +++ b/elstat/manager.py @@ -0,0 +1,22 @@ +from .worker import ServiceWorker + + +class ServiceManager: + def __init__(self, app): + self.app = app + self.cfg = app.cfg + self.conn = app.conn + self.loop = app.loop + + self.workers = {} + self.state = {} + + self._start() + + def _start(self): + for name, service in self.cfg.SERVICES.items(): + # spawn a service worker + serv_worker = ServiceWorker(self, name, service) + self.workers[name] = serv_worker + + self.state[name] = False diff --git a/elstat/worker.py b/elstat/worker.py new file mode 100644 index 0000000..6283a7c --- /dev/null +++ b/elstat/worker.py @@ -0,0 +1,32 @@ +import asyncio +import logging + +from .consts import ADAPTERS + + +class ServiceWorker: + def __init__(self, manager, name, service): + self.name = name + self.manager = manager + self.service = service + self.adapter = ADAPTERS[service['adapter']] + self.log = logging.getLogger(f'elstat.service.{name}') + + self._start() + + async def work(self): + res = await self.adapter.query(self, self.service['adapter_args']) + return res + + async def _work_loop(self): + try: + while True: + self.log.info(f'polling {self.name}') + await self.work() + await asyncio.sleep(self.service['poll']) + except Exception: + self.log.exception('fail on poll') + + def _start(self): + self.log.info(f'starting work loop for {self.name}') + self.manager.loop.create_task(self._work_loop()) diff --git a/run.py b/run.py index b87ee1a..1bf8bf7 100644 --- a/run.py +++ b/run.py @@ -7,6 +7,7 @@ from sanic_cors import CORS from sanic.exceptions import NotFound, FileNotFound import config +from elstat import manager logging.basicConfig(level=logging.INFO) app = Sanic() @@ -18,6 +19,7 @@ CORS(app, automatic_options=True) async def _app_start(refapp, loop): refapp.session = aiohttp.ClientSession(loop=loop) refapp.conn = sqlite3.connect('elstat.db') + refapp.serv = manager.ServiceManager(app) @app.listener('after_server_stop')