"""
Server
======
Run the iceprod server.
"""
from __future__ import absolute_import, division, print_function
import os
import logging
from functools import partial
import importlib
import subprocess
from tornado.ioloop import IOLoop
from concurrent.futures import ThreadPoolExecutor
from iceprod.core.logger import set_log_level
from iceprod.server.config import IceProdConfig
logger = logging.getLogger('Server')
[docs]class Server(object):
"""
The actual server.
"""
def __init__(self):
self.io_loop = IOLoop.current()
self.executor = ThreadPoolExecutor(max_workers=10)
self.cfg = IceProdConfig()
self.modules = {}
self.services = {'daemon': {'restart': self.restart,
'reload': self.reload,
'stop': self.stop,
'kill': self.kill,
'get_running_modules': lambda: self.modules.keys(),
},
}
set_log_level(self.cfg['logging']['level'])
if 'blocking_threshold' in self.cfg['logging']:
self.io_loop.set_blocking_log_threshold(self.cfg['logging']['blocking_threshold'])
for mod_name in self.cfg['modules']:
if self.cfg['modules'][mod_name]:
try:
m = importlib.import_module('iceprod.server.modules.'+mod_name)
mod = getattr(m, mod_name)(cfg=self.cfg,
io_loop=self.io_loop,
executor=self.executor,
modules=self.services)
self.modules[mod_name] = mod
self.services[mod_name] = mod.service
mod.start()
except Exception:
logger.critical('cannot start module', exc_info=True)
self.kill()
raise
[docs] def run(self):
try:
self.io_loop.start()
except Exception:
logger.critical('exception not caught', exc_info=True)
self.kill()
[docs] def restart(self):
env = os.environ.copy()
extra_path = os.path.join(os.environ['I3PROD'],'bin')
env['PATH'] = extra_path+(':'+env['PATH'] if 'PATH' in env else '')
subprocess.Popen(['iceprod_server.py','restart'],
cwd=os.environ['I3PROD'], env=env)
[docs] def reload(self):
for m in self.modules.values():
m.stop()
m.start()
[docs] def stop(self):
for m in self.modules.values():
m.stop()
self.io_loop.stop()
[docs] def kill(self):
for m in self.modules.values():
m.kill()
self.io_loop.stop()