from os import mkdir from os.path import isdir, join from shutil import rmtree from typing import Dict from rougail.template import generate from tiramisu import Storage from ...config import CONFIGURATION_DIR, TMP_DIR, get_config from ...controller import Controller from ...register import register from ...dispatcher import dispatcher from ...utils import _ class Risotto(Controller): def __init__(self, test: bool) -> None: self.storage = Storage(engine='dictionary') self.cache_root_path = join(get_config().get('cache').get('root_path'), 'servermodel') @register('v1.template.generate') async def template_get(self, risotto_context, server_name: str) -> Dict: server = await self.call('v1.server.describe', risotto_context, server_name=server_name) server_id = server['server_id'] servermodel_id = server['server_servermodel_id'] config_module = dispatcher.get_service('config') server = config_module.server[server_id] export = await server['server'].value.exportation() if not export[0]: raise Exception(_(f'configuration for server "{server_name}" is empty, you should deploy it first')) config = meta = await server['server'].config.deepcopy(storage=self.storage) while True: try: children = list(await config.config.list()) except: break if children: config = children[0] else: break configurations_dir = join(CONFIGURATION_DIR, str(server_id)) if isdir(configurations_dir): rmtree(configurations_dir) mkdir(configurations_dir) tmp_dir = join(TMP_DIR, str(server_id)) if isdir(tmp_dir): rmtree(tmp_dir) mkdir(tmp_dir) templates_dir = join(self.cache_root_path, str(servermodel_id), 'templates') await generate(config, server['funcs_file'], templates_dir, tmp_dir, configurations_dir) return {'server_name': server_name, 'template_dir': configurations_dir}