import config-manager controller

This commit is contained in:
2019-11-29 16:38:33 +01:00
parent 332dc61fd4
commit 847fbfc1e1
19 changed files with 746 additions and 67 deletions

View File

@ -47,7 +47,7 @@ class RegisterDispatcher:
def get_function_args():
function_args = self.get_function_args(function)
# risotto_context is a special argument, remove it
if function_args[0] == 'risotto_context':
if function_args and function_args[0] == 'risotto_context':
function_args = function_args[1:]
return set(function_args)
@ -122,7 +122,7 @@ class RegisterDispatcher:
if not Config(self.option).option(uri).option.type() == 'message':
raise RegistrationError(_(f'{uri} is not a valid message'))
except AttributeError:
raise RegistrationError(_(f'{uri} is not a valid message'))
raise RegistrationError(_(f'the message {uri} not exists'))
# create an uris' version if needed
if version not in self.uris:
@ -139,7 +139,7 @@ class RegisterDispatcher:
# True if first argument is the risotto_context
function_args = self.get_function_args(function)
if function_args[0] == 'risotto_context':
if function_args and function_args[0] == 'risotto_context':
inject_risotto_context = True
function_args.pop(0)
else:
@ -162,17 +162,18 @@ class RegisterDispatcher:
self.uris[version][uri] = dico
else:
# if event
if notification and notification is not undefined:
raise RegistrationError(_(f'notification not supported yet'))
# valid function's arguments
self._valid_event_params(version, uri, function, module_name)
# register this function
if uri not in self.uris[version]:
self.uris[version][uri] = []
self.uris[version][uri].append({'module': module_name,
'function': function,
'arguments': function_args,
'risotto_context': inject_risotto_context})
dico = {'module': module_name,
'function': function,
'arguments': function_args,
'risotto_context': inject_risotto_context}
if notification and notification is not undefined:
dico['notification'] = notification
self.uris[version][uri].append(dico)
def set_module(self, module_name, module):
""" register and instanciate a new module
@ -269,42 +270,45 @@ class Dispatcher(RegisterDispatcher):
uri:str,
context: Context,
kwargs: Dict):
if not isinstance(returns, dict):
if isinstance(returns, dict):
returns = [returns]
if not isinstance(returns, list):
module_name = function.__module__.split('.')[-2]
function_name = function.__name__
err = _(f'function {module_name}.{function_name} has to return a dict')
err = _(f'function {module_name}.{function_name} has to return a dict or a list')
log.error_msg(version, uri, context, kwargs, 'call', err)
raise CallError(str(err))
response = self.messages[uri]['response']
if response is None:
raise Exception('hu?')
else:
config = Config(response, display_name=lambda self, dyn_name: self.impl_getname())
config.property.read_write()
try:
for key, value in returns.items():
config.option(key).value.set(value)
except AttributeError:
module_name = function.__module__.split('.')[-2]
function_name = function.__name__
err = _(f'function {module_name}.{function_name} return the unknown parameter "{key}"')
log.error_msg(version, uri, context, kwargs, 'call', err)
raise CallError(str(err))
except ValueError:
module_name = function.__module__.split('.')[-2]
function_name = function.__name__
err = _(f'function {module_name}.{function_name} return the parameter "{key}" with an unvalid value "{value}"')
log.error_msg(version, uri, context, kwargs, 'call', err)
raise CallError(str(err))
config.property.read_only()
try:
config.value.dict()
except Exception as err:
module_name = function.__module__.split('.')[-2]
function_name = function.__name__
err = _(f'function {module_name}.{function_name} return an invalid response {err}')
log.error_msg(version, uri, context, kwargs, 'call', err)
raise CallError(str(err))
for ret in returns:
config = Config(response, display_name=lambda self, dyn_name: self.impl_getname())
config.property.read_write()
try:
for key, value in ret.items():
config.option(key).value.set(value)
except AttributeError:
module_name = function.__module__.split('.')[-2]
function_name = function.__name__
err = _(f'function {module_name}.{function_name} return the unknown parameter "{key}"')
log.error_msg(version, uri, context, kwargs, 'call', err)
raise CallError(str(err))
except ValueError:
module_name = function.__module__.split('.')[-2]
function_name = function.__name__
err = _(f'function {module_name}.{function_name} return the parameter "{key}" with an unvalid value "{value}"')
log.error_msg(version, uri, context, kwargs, 'call', err)
raise CallError(str(err))
config.property.read_only()
try:
config.value.dict()
except Exception as err:
module_name = function.__module__.split('.')[-2]
function_name = function.__name__
err = _(f'function {module_name}.{function_name} return an invalid response {err}')
log.error_msg(version, uri, context, kwargs, 'call', err)
raise CallError(str(err))
async def call(self, version, uri, risotto_context, public_only=False, **kwargs):
@ -351,10 +355,15 @@ class Dispatcher(RegisterDispatcher):
# notification
if obj.get('notification'):
notif_version, notif_message = obj['notification'].split('.', 1)
await self.publish(notif_version,
notif_message,
new_context,
**returns)
if not isinstance(returns, list):
send_returns = [returns]
else:
send_returns = returns
for ret in send_returns:
await self.publish(notif_version,
notif_message,
new_context,
**ret)
return returns
async def publish(self, version, uri, risotto_context, public_only=False, **kwargs):
@ -404,6 +413,14 @@ class Dispatcher(RegisterDispatcher):
function_name = function.__name__
log.info_msg(version, uri, new_context, kwargs,'publish', info_msg)
# notification
if obj.get('notification'):
notif_version, notif_message = obj['notification'].split('.', 1)
await self.publish(notif_version,
notif_message,
new_context,
**returns)
dispatcher = Dispatcher()