import asyncio
import logging
import os
from vmshepherd.drivers import Drivers
from vmshepherd.http import WebServer
from vmshepherd.utils import gen_id, prefix_logging
from vmshepherd.worker import Worker
[docs]class VmShepherd:
def __init__(self, config):
self.config = config
self.root_dir = os.path.dirname(__file__)
self.instance_id = gen_id(rnd_length=5)
self.setup_logging()
self.runtime_manager = Drivers.get(
'runtime', self.config['runtime'],
instance_id=self.instance_id
)
self.preset_manager = Drivers.get(
'presets', self.config['presets'],
runtime=self.runtime_manager,
defaults=self.config.get('defaults', {})
)
self.worker = Worker(
runtime=self.runtime_manager, presets=self.preset_manager,
interval=int(self.config.get('worker_interval', 5)),
autostart=self.config.get('autostart', True)
)
http_conf = self.config.get('http', None)
if http_conf:
self.web = WebServer(self, http_conf)
asyncio.ensure_future(self.web.start())
[docs] async def run(self, run_once=False):
if run_once:
await self.worker.run_once()
else:
await self.worker.run_forever()
[docs] def setup_logging(self):
logger = logging.getLogger()
log_level = self.config.get('log_level', 'info').upper()
logger.setLevel(log_level)
if logger.getEffectiveLevel() == logging.DEBUG:
logging.debug('DEBUG mode enabled')
prefix_logging(self.instance_id)
[docs] def reload(self, with_config=None):
self.config = with_config or self.config
self.runtime_manager.reconfigure(self.config.get('runtime'))
self.preset_manager.reconfigure(self.config.get('presets'), self.config.get('defaults'))
Drivers.flush()