""" Module to manage all the workflow of the service. From http request to http response """ from django.conf import settings from tools import const from tools.exceptions import SystemException from monitorT.task import Task from monitorT.task import KillingThread from .http_loaders import json_in, json_out class Service: """ Main class to service management Attributes ---------- conf: dict Service configuration, {'task': .., 'function': ..., 'http_rm': ..., 'http_p': ..., 'parser': ...} """ __slots__ = ['conf'] required_fields = ['function'] optional_fields = {'task': Task, 'http_p': json_in, 'http_rm': json_out, 'parser': const.PARSER_DEFAULT} SERVICE_EXCEPTION = type('ServiceException', (SystemException, ), {}) def __init__(self, conf): """ Parameters ---------- conf: dict Service configuration, {'task': .., 'function': ..., 'http_rm': ..., 'http_p': ..., 'parser': ...} """ self.conf = conf def check(self): """ Check required values and fill with the defaults values the optional fields Returns ------- success: True fails: SystemException """ not_in = [item for item in self.required_fields if item not in self.conf.keys()] if not_in: return self.SERVICE_EXCEPTION('{} field not in conf' .format(','.join(not_in))) for optional in self.optional_fields: if optional not in self.conf.keys() or not self.conf[optional]: settings.LOG('Optional field ({}) not found, setting default'.format(optional), settings.LOG.WARNING_KEY) self.conf[optional] = self.optional_fields[optional] return True def run(self, request, **kwargs): """ Run workflow of service Parameters ---------- request: HttpRequest Returns ------- success: HttpResponse """ data = self.conf['http_p'](request) kwargs.update(data) data = kwargs if 'user' not in data.keys(): data['user'] = None task_obj = settings.MASTER_TASK_LIST.add_task(data['user'], self.conf['function'], data, self.conf['task'], self.conf['parser']) thread = KillingThread(target=task_obj.run, name=task_obj.task_id) thread.start() if task_obj.CONTROL: result = {'task_id': task_obj.task_id} return json_out(result) thread.join() result = task_obj.result settings.MASTER_TASK_LIST.remove_task(task_obj.task_id) return self.conf['http_rm'](result)