Compare commits

...

2 Commits

4 changed files with 152 additions and 113 deletions

View File

@ -48,8 +48,8 @@ class CallDispatcher:
except AttributeError: except AttributeError:
err = _(f'function {module_name}.{function_name} return the unknown parameter "{key}" for the uri "{risotto_context.version}.{risotto_context.message}"') err = _(f'function {module_name}.{function_name} return the unknown parameter "{key}" for the uri "{risotto_context.version}.{risotto_context.message}"')
raise CallError(err) raise CallError(err)
except ValueError: except ValueError as err:
err = _(f'function {module_name}.{function_name} return the parameter "{key}" with an unvalid value "{value}" for the uri "{risotto_context.version}.{risotto_context.message}"') err = _(f'function {module_name}.{function_name} return the invalid parameter "{key}" for the uri "{risotto_context.version}.{risotto_context.message}": {err}')
raise CallError(err) raise CallError(err)
await config.property.read_only() await config.property.read_only()
mandatories = await config.value.mandatory() mandatories = await config.value.mandatory()
@ -89,6 +89,7 @@ class CallDispatcher:
if hasattr(old_risotto_context, 'connection'): if hasattr(old_risotto_context, 'connection'):
# do not start a new database connection # do not start a new database connection
risotto_context.connection = old_risotto_context.connection risotto_context.connection = old_risotto_context.connection
risotto_context.log_connection = old_risotto_context.log_connection
await log.start(risotto_context, await log.start(risotto_context,
kwargs, kwargs,
info_msg, info_msg,
@ -108,73 +109,84 @@ class CallDispatcher:
config_arguments, config_arguments,
function_obj, function_obj,
) )
except CallError as err: await log.success(risotto_context,
ret,
)
except Exception as err:
await log.failed(risotto_context, await log.failed(risotto_context,
str(err), str(err),
) )
raise err from err raise CallError(err) from err
else: else:
try: error = None
async with self.pool.acquire() as connection: async with self.pool.acquire() as log_connection:
await connection.set_type_codec( await log_connection.set_type_codec(
'json', 'json',
encoder=dumps, encoder=dumps,
decoder=loads, decoder=loads,
schema='pg_catalog' schema='pg_catalog'
) )
risotto_context.connection = connection async with log_connection.transaction():
async with connection.transaction(): try:
try: risotto_context.log_connection = log_connection
await log.start(risotto_context, async with self.pool.acquire() as connection:
kwargs, await connection.set_type_codec(
info_msg, 'json',
) encoder=dumps,
await self.check_message_type(risotto_context, decoder=loads,
kwargs, schema='pg_catalog'
) )
config_arguments = await self.load_kwargs_to_config(risotto_context, risotto_context.connection = connection
f'{version}.{message}', async with connection.transaction():
kwargs, try:
check_role, await log.start(risotto_context,
internal,
)
ret = await self.launch(risotto_context,
kwargs, kwargs,
config_arguments, info_msg,
function_obj,
) )
# log the success await self.check_message_type(risotto_context,
await log.success(risotto_context, kwargs,
ret, )
) config_arguments = await self.load_kwargs_to_config(risotto_context,
if not internal and isinstance(ret, dict): f'{version}.{message}',
ret['context_id'] = risotto_context.context_id kwargs,
except CallError as err: check_role,
if get_config()['global']['debug']: internal,
print_exc() )
await log.failed(risotto_context, ret = await self.launch(risotto_context,
str(err), kwargs,
) config_arguments,
raise err from err function_obj,
except CallError as err: )
raise err from err # log the success
except Exception as err: await log.success(risotto_context,
# if there is a problem with arguments, just send an error and do nothing ret,
if get_config()['global']['debug']: )
print_exc() if not internal and isinstance(ret, dict):
async with self.pool.acquire() as connection: ret['context_id'] = risotto_context.context_id
await connection.set_type_codec( except CallError as err:
'json', if get_config()['global']['debug']:
encoder=dumps, print_exc()
decoder=loads, await log.failed(risotto_context,
schema='pg_catalog' str(err),
) )
risotto_context.connection = connection raise err from err
async with connection.transaction(): except CallError as err:
error = err
except Exception as err:
# if there is a problem with arguments, just send an error and do nothing
if get_config()['global']['debug']:
print_exc()
await log.failed(risotto_context, await log.failed(risotto_context,
str(err), str(err),
) )
raise err from err error = err
if error:
if not internal:
err = CallError(str(error))
err.context_id = risotto_context.context_id
else:
err = error
raise err from error
return ret return ret

View File

@ -101,15 +101,31 @@ async def handle(request):
internal=False, internal=False,
**kwargs, **kwargs,
) )
except NotAllowedError as err:
raise HTTPNotFound(reason=str(err))
except CallError as err:
raise HTTPBadRequest(reason=str(err).replace('\n', ' '))
except Exception as err: except Exception as err:
if get_config()['global']['debug']: context_id = None
print_exc() if isinstance(err, NotAllowedError):
raise HTTPInternalServerError(reason=str(err)) error_type = HTTPNotFound
return Response(text=dumps({'response': text}), elif isinstance(err, CallError):
error_type = HTTPBadRequest
context_id = err.context_id
else:
if get_config()['global']['debug']:
print_exc()
error_type = HTTPInternalServerError
response = {'type': 'error',
'reason': str(err).replace('\n', ' '),
}
if context_id is not None:
response['context_id'] = context_id
err = dumps({'response': response,
'type': 'error',
})
raise error_type(text=err,
content_type='application/json',
)
return Response(text=dumps({'response': text,
'type': 'success',
}),
content_type='application/json', content_type='application/json',
) )

View File

@ -38,7 +38,7 @@ class Logger:
sql = insert + ') ' + values + ') RETURNING LogId' sql = insert + ') ' + values + ') RETURNING LogId'
try: try:
log_id = await risotto_context.connection.fetchval(sql, *args) log_id = await risotto_context.log_connection.fetchval(sql, *args)
if context_id is None and start: if context_id is None and start:
risotto_context.context_id = log_id risotto_context.context_id = log_id
if start: if start:
@ -60,14 +60,14 @@ class Logger:
sql += ' AND URI = $3' sql += ' AND URI = $3'
args.append(uri) args.append(uri)
ret = [] ret = []
for row in await risotto_context.connection.fetch(*args): for row in await risotto_context.log_connection.fetch(*args):
d = {} d = {}
for key, value in row.items(): for key, value in row.items():
if key == 'data': if key == 'data':
if not value: if not value:
value = {} value = {}
else: # else:
value = loads(value) # value = loads(value)
elif key in ['start_date', 'stop_date']: elif key in ['start_date', 'stop_date']:
value = str(value) value = str(value)
d[key] = value d[key] = value
@ -141,7 +141,11 @@ class Logger:
) -> None: ) -> None:
paths_msg = self._get_message_paths(risotto_context) paths_msg = self._get_message_paths(risotto_context)
if get_config()['global']['debug']: if get_config()['global']['debug']:
print(_(f'{risotto_context.username}: START:{paths_msg}: {msg}')) if risotto_context.context_id != None:
context = f'({risotto_context.context_id})'
else:
context = ''
print(_(f'{risotto_context.username}: START{context}:{paths_msg}: {msg}'))
await self.insert(msg, await self.insert(msg,
self._get_last_uri(risotto_context), self._get_last_uri(risotto_context),
paths_msg, paths_msg,
@ -157,7 +161,7 @@ class Logger:
) -> None: ) -> None:
if get_config()['global']['debug']: if get_config()['global']['debug']:
paths_msg = self._get_message_paths(risotto_context) paths_msg = self._get_message_paths(risotto_context)
print(_(f'{risotto_context.username}: SUCCESS:{paths_msg}({risotto_context.context_id})')) print(_(f'{risotto_context.username}: SUCCESS({risotto_context.context_id}):{paths_msg}'))
sql = """UPDATE RisottoLog sql = """UPDATE RisottoLog
SET StopDate = $2, SET StopDate = $2,
Level = 'SUCCESS' Level = 'SUCCESS'
@ -169,10 +173,10 @@ class Logger:
args.append(dumps(returns)) args.append(dumps(returns))
sql += """WHERE LogId = $1 sql += """WHERE LogId = $1
""" """
await risotto_context.connection.execute(sql, await risotto_context.log_connection.execute(sql,
risotto_context.start_id, risotto_context.start_id,
*args, *args,
) )
async def failed(self, async def failed(self,
risotto_context: Context, risotto_context: Context,
@ -180,18 +184,22 @@ class Logger:
) -> None: ) -> None:
if get_config()['global']['debug']: if get_config()['global']['debug']:
paths_msg = self._get_message_paths(risotto_context) paths_msg = self._get_message_paths(risotto_context)
print(_(f'{risotto_context.username}: FAILED:{paths_msg}({risotto_context.context_id}): err')) if risotto_context.context_id != None:
context = f'({risotto_context.context_id})'
else:
context = ''
print(_(f'{risotto_context.username}: FAILED({risotto_context.context_id}):{paths_msg}: err'))
sql = """UPDATE RisottoLog sql = """UPDATE RisottoLog
SET StopDate = $2, SET StopDate = $2,
Level = 'FAILED', Level = 'FAILED',
Msg = $3 Msg = $3
WHERE LogId = $1 WHERE LogId = $1
""" """
await risotto_context.connection.execute(sql, await risotto_context.log_connection.execute(sql,
risotto_context.start_id, risotto_context.start_id,
datetime.now(), datetime.now(),
err, err,
) )
async def info(self, async def info(self,
risotto_context, risotto_context,

View File

@ -297,35 +297,38 @@ class RegisterDispatcher:
truncate: bool=False, truncate: bool=False,
) -> None: ) -> None:
internal_user = get_config()['global']['internal_user'] internal_user = get_config()['global']['internal_user']
async with self.pool.acquire() as connection: async with self.pool.acquire() as log_connection:
await connection.set_type_codec( async with log_connection.transaction():
'json', async with self.pool.acquire() as connection:
encoder=dumps, await connection.set_type_codec(
decoder=loads, 'json',
schema='pg_catalog' encoder=dumps,
) decoder=loads,
if truncate: schema='pg_catalog'
async with connection.transaction(): )
await connection.execute('TRUNCATE InfraServer, InfraSite, InfraZone, Log, ProviderDeployment, ProviderFactoryCluster, ProviderFactoryClusterNode, SettingApplicationservice, SettingApplicationServiceDependency, SettingRelease, SettingServer, SettingServermodel, SettingSource, UserRole, UserRoleURI, UserURI, UserUser, InfraServermodel, ProviderZone, ProviderServer, ProviderSource, ProviderApplicationservice, ProviderServermodel') if truncate:
async with connection.transaction(): async with connection.transaction():
for submodule_name, module in self.injected_self.items(): await connection.execute('TRUNCATE InfraServer, InfraSite, InfraZone, Log, ProviderDeployment, ProviderFactoryCluster, ProviderFactoryClusterNode, SettingApplicationservice, SettingApplicationServiceDependency, SettingRelease, SettingServer, SettingServermodel, SettingSource, UserRole, UserRoleURI, UserURI, UserUser, InfraServermodel, ProviderZone, ProviderServer, ProviderSource, ProviderApplicationservice, ProviderServermodel')
risotto_context = Context() async with connection.transaction():
risotto_context.username = internal_user for submodule_name, module in self.injected_self.items():
risotto_context.paths.append(f'internal.{submodule_name}.on_join') risotto_context = Context()
risotto_context.type = None risotto_context.username = internal_user
risotto_context.connection = connection risotto_context.paths.append(f'internal.{submodule_name}.on_join')
risotto_context.module = submodule_name.split('.', 1)[0] risotto_context.type = None
info_msg = _(f'in function risotto_{submodule_name}.on_join') risotto_context.log_connection = log_connection
await log.info_msg(risotto_context, risotto_context.connection = connection
None, risotto_context.module = submodule_name.split('.', 1)[0]
info_msg) info_msg = _(f'in function risotto_{submodule_name}.on_join')
try: await log.info_msg(risotto_context,
await module.on_join(risotto_context) None,
except Exception as err: info_msg)
if get_config()['global']['debug']: try:
print_exc() await module.on_join(risotto_context)
msg = _(f'on_join returns an error in module {submodule_name}: {err}') except Exception as err:
await log.error_msg(risotto_context, {}, msg) if get_config()['global']['debug']:
print_exc()
msg = _(f'on_join returns an error in module {submodule_name}: {err}')
await log.error_msg(risotto_context, {}, msg)
async def load(self): async def load(self):
# valid function's arguments # valid function's arguments