from typing import Dict, List from ...controller import Controller from ...register import register from ...context import Context from ...utils import _ class Risotto(Controller): async def on_join(self, risotto_context): for uri in ['v1.applicationservice.create', 'v1.applicationservice.dataset.updated', 'v1.server.create', 'v1.servermodel.dataset.updated', 'v1.session.server.start', 'v1.source.create', 'v1.source.dataset.update', 'v1.source.release.create', 'v1.template.generate', 'v1.uri.role.join', 'v1.uri.role.list', 'v1.user.create', 'v1.user.delete', 'v1.user.list', 'v1.user.role.create', 'v1.config.configuration.server.get', 'v1.user.role.list']: try: await self._uri_role_join(risotto_context, role_name='administrator', uri_name=uri) except: pass for uri in ['v1.applicationservice.describe', 'v1.applicationservice.get_by_id', 'v1.server.describe', 'v1.server.list', 'v1.servermodel.list', 'v1.session.server.configure', 'v1.session.server.filter', 'v1.session.server.get', 'v1.session.server.list', 'v1.session.servermodel.configure', 'v1.session.servermodel.filter', 'v1.session.servermodel.get', 'v1.session.servermodel.list', 'v1.session.servermodel.start', 'v1.session.servermodel.stop', 'v1.session.servermodel.validate', 'v1.session.server.stop', 'v1.session.server.validate', 'v1.source.describe', 'v1.source.list', 'v1.source.release.get_by_distribution', 'v1.source.release.get_by_id', 'v1.source.release.list']: try: await self._uri_role_join(risotto_context, role_name='all', uri_name=uri) except: pass for uri in ['v1.server.describe', 'v1.config.configuration.server.get', 'v1.config.configuration.server.deploy', 'v1.session.server.start', 'v1.template.generate']: try: await self._uri_role_join(risotto_context, role_name='server_rw', uri_name=uri) except: pass @register('v1.uri.role.join') async def uri_role_join(self, risotto_context: Context, role_name: str, uri_name: str) -> Dict: return await self._uri_role_join(risotto_context, role_name, uri_name) async def _uri_role_join(self, risotto_context: Context, role_name: str, uri_name: str) -> Dict: # Verify if user exists and get ID sql = ''' SELECT URIId FROM URI WHERE URIName = $1 ''' uri_id = await risotto_context.connection.fetchval(sql, uri_name) if uri_id is None: raise Exception(_(f'unable to find message {uri_name}')) sql = ''' INSERT INTO RoleURI(RoleName, URIId) VALUES ($1,$2) ON CONFLICT DO NOTHING ''' uri_id = await risotto_context.connection.fetchrow(sql, role_name, uri_id) return {'role_name': role_name, 'uri_name': uri_name} @register('v1.uri.role.list') async def uri_role_list(self, risotto_context: Context) -> List[Dict]: sql = ''' SELECT RoleName as role_name, URI.URIName as uri_name FROM RoleURI, URI WHERE RoleURI.URIId = URI.URIId ''' return [dict(r) for r in await risotto_context.connection.fetch(sql)]