__init__.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import logging
  2. import asyncio
  3. import os
  4. import aiopg
  5. import psycopg2.extras
  6. import aiohttp.web
  7. import api_hour
  8. from . import endpoints
  9. LOG = logging.getLogger(__name__)
  10. class Container(api_hour.Container):
  11. def __init__(self, *args, **kwargs):
  12. super().__init__(*args, **kwargs)
  13. # Servers
  14. self.servers['http'] = aiohttp.web.Application(loop=kwargs['loop'])
  15. self.servers['http'].ah_container = self # keep a reference to Container
  16. # routes
  17. self.servers['http'].router.add_route('GET', '/json', endpoints.world.json)
  18. self.servers['http'].router.add_route('GET', '/db', endpoints.world.db)
  19. self.servers['http'].router.add_route('GET', '/queries', endpoints.world.queries)
  20. self.servers['http'].router.add_route('GET', '/updates', endpoints.world.updates)
  21. self.servers['http'].router.add_route('GET', '/plaintext', endpoints.world.plaintext)
  22. def make_servers(self):
  23. return [self.servers['http'].make_handler(logger=self.worker.log,
  24. debug=self.worker.cfg.debug,
  25. keep_alive=self.worker.cfg.keepalive,
  26. access_log=self.worker.log.access_log,
  27. access_log_format=self.worker.cfg.access_log_format)]
  28. @asyncio.coroutine
  29. def start(self):
  30. yield from super().start()
  31. LOG.info('Starting engines...')
  32. self.engines['pg'] = self.loop.create_task(aiopg.create_pool(host=os.environ.get('DBHOST', '127.0.0.1'),
  33. sslmode='disable',
  34. port=int(self.config['engines']['pg']['port']),
  35. dbname=self.config['engines']['pg']['dbname'],
  36. user=self.config['engines']['pg']['user'],
  37. password=self.config['engines']['pg']['password'],
  38. cursor_factory=psycopg2.extras.RealDictCursor,
  39. minsize=int(self.config['engines']['pg']['minsize']),
  40. maxsize=int(self.config['engines']['pg']['maxsize'])))
  41. yield from asyncio.wait([self.engines['pg']], return_when=asyncio.ALL_COMPLETED)
  42. LOG.info('All engines ready !')
  43. @asyncio.coroutine
  44. def stop(self):
  45. LOG.info('Stopping engines...')
  46. if 'pg' in self.engines:
  47. if self.engines['pg'].done():
  48. self.engines['pg'].result().terminate()
  49. yield from self.engines['pg'].result().wait_closed()
  50. else:
  51. yield from self.engines['pg'].cancel()
  52. LOG.info('All engines stopped !')
  53. yield from super().stop()