perxis.extensions.bootstrap
Модуль содержит функцию bootstrap для упрощения запуска сервисов расширений
1""" 2 Модуль содержит функцию bootstrap для упрощения запуска сервисов расширений 3""" 4 5 6import asyncio 7 8import aiocron 9import grpc 10import logging 11 12from concurrent import futures 13from perxis.collections import collections_pb2_grpc 14from perxis.collaborators import collaborators_pb2_grpc 15from perxis.invitations import invitations_pb2_grpc 16from perxis.environments import environments_pb2_grpc 17from perxis.locales import locales_pb2_grpc 18from perxis.members import members_pb2_grpc 19from perxis.organizations import organizations_pb2_grpc 20from perxis.users import users_pb2_grpc 21from perxis.references import references_pb2_grpc 22from perxis.images import images_pb2_grpc 23from perxis.files import files_pb2_grpc 24from perxis.roles import roles_pb2_grpc 25from perxis.items import items_pb2_grpc 26from perxis.spaces import spaces_pb2_grpc 27from perxis.clients import clients_pb2_grpc 28from perxis.common import operation_service_pb2_grpc 29from perxis.extensions import manager_service_pb2_grpc, manager_service_pb2, extension_service_pb2_grpc 30from perxis.interceptors import header_adder_interceptor 31 32logger = logging.getLogger(__name__) 33 34 35async def _main( 36 ext_descriptor: manager_service_pb2.ExtensionDescriptor, 37 servicer_cls: extension_service_pb2_grpc.ExtensionServiceServicer, 38 ext_manager_host: str, 39 content_host: str, 40 account_host: str, 41 files_host: str, 42 images_host: str 43): 44 interceptor = header_adder_interceptor( 45 'x-perxis-access', 'system' 46 ) 47 48 async def _register_extension(): 49 await ext_manager_stub.RegisterExtensions(manager_service_pb2.RegisterExtensionsRequest( 50 extensions=[ext_descriptor] 51 )) 52 logger.info(f"Расширение {ext_descriptor.extension} зарегистрировано в perxis") 53 54 @aiocron.crontab('* * * * *', start=False) 55 async def register_extension(): 56 await _register_extension() 57 58 account_channel = grpc.aio.insecure_channel(account_host, interceptors=[interceptor]) 59 files_channel = grpc.aio.insecure_channel(files_host, interceptors=[interceptor]) 60 images_channel = grpc.aio.insecure_channel(images_host, interceptors=[interceptor]) 61 62 async with grpc.aio.insecure_channel(ext_manager_host, interceptors=[interceptor]) as extensions_manager_channel: 63 ext_manager_stub = manager_service_pb2_grpc.ExtensionManagerServiceStub(extensions_manager_channel) 64 65 registered_extensions: manager_service_pb2.ListRegisteredExtensionsResponse = await ext_manager_stub.ListRegisteredExtensions( 66 manager_service_pb2.ListRegisteredExtensionsRequest() 67 ) 68 69 for ext in registered_extensions.extensions: 70 if ext.extension == ext_descriptor.extension: 71 if ext.version != ext_descriptor.version: 72 await ext_manager_stub.UnregisterExtensions( 73 manager_service_pb2.UnregisterExtensionsRequest( 74 extensions=[ext_descriptor] 75 ) 76 ) 77 78 await _register_extension() 79 80 logger.info( 81 f"Изменилась версия расширения {ext_descriptor.extension} ({ext.version} " 82 f"-> {ext_descriptor.version})" 83 ) 84 85 register_extension.start() 86 87 async with grpc.aio.insecure_channel(content_host, interceptors=[interceptor]) as content_channel: 88 89 collections_stub = collections_pb2_grpc.CollectionsStub(content_channel) 90 roles_stub = roles_pb2_grpc.RolesStub(content_channel) 91 clients_stub = clients_pb2_grpc.ClientsStub(content_channel) 92 environments_stub = environments_pb2_grpc.EnvironmentsStub(content_channel) 93 items_stub = items_pb2_grpc.ItemsStub(content_channel) 94 spaces_stub = spaces_pb2_grpc.SpacesStub(content_channel) 95 files_stub = files_pb2_grpc.FilesStub(files_channel) 96 images_stub = images_pb2_grpc.ImagesStub(images_channel) 97 references_stub = references_pb2_grpc.ReferencesStub(content_channel) 98 users_stub = users_pb2_grpc.UsersStub(account_channel) 99 organizations_stub = organizations_pb2_grpc.OrganizationsStub(account_channel) 100 members_stub = members_pb2_grpc.MembersStub(account_channel) 101 locales_stub = locales_pb2_grpc.LocalesStub(content_channel) 102 invitations_stub = invitations_pb2_grpc.InvitationsStub(content_channel) 103 collaborators_stub = collaborators_pb2_grpc.CollaboratorsStub(content_channel) 104 105 server = grpc.aio.server(futures.ThreadPoolExecutor(max_workers=10)) 106 107 servicer = servicer_cls( 108 ext_manager_service=ext_manager_stub, 109 collections_service=collections_stub, 110 environments_service=environments_stub, 111 roles_service=roles_stub, 112 clients_service=clients_stub, 113 items_service=items_stub, 114 spaces_service=spaces_stub, 115 files_service=files_stub, 116 images_service=images_stub, 117 references_service=references_stub, 118 users_service=users_stub, 119 organizations_service=organizations_stub, 120 members_service=members_stub, 121 locales_service=locales_stub, 122 invitations_service=invitations_stub, 123 collaborators_service=collaborators_stub, 124 channel=content_channel, 125 ) 126 127 extension_service_pb2_grpc.add_ExtensionServiceServicer_to_server(servicer, server) 128 operation_service_pb2_grpc.add_OperationServiceServicer_to_server(servicer, server) 129 130 server.add_insecure_port("[::]:50051") 131 await server.start() 132 await server.wait_for_termination() 133 134 await account_channel.close() 135 await files_channel.close() 136 await images_channel.close() 137 138 139def bootstrap( 140 ext_descriptor: manager_service_pb2.ExtensionDescriptor, 141 servicer_cls: extension_service_pb2_grpc.ExtensionServiceServicer, 142 ext_manager_host: str = "extension-manager:9030", 143 content_host: str = "content:9020", 144 account_host: str = "account:9010", 145 files_host: str = "files:8003", 146 images_host: str = "images:8005" 147): 148 """ 149 Функция для инициализации и запуска сервиса расширения. 150 151 Пример использования в расширении: 152 ``` 153 def main(): 154 ext_descriptor = utils.get_extension_descriptor( 155 ext_host="demo-ext-backend:50051", 156 ext_id=extension.ID, 157 ext_name=extension.NAME, 158 ext_version=extension.VERSION, 159 ext_description=extension.DESCRIPTION, 160 ext_version_description=extension.VERSION_DESCRIPTION 161 ) 162 163 bootstrap(ext_descriptor, Servicer, ext_manager_host, content_host) 164 ``` 165 166 Arguments: 167 ext_descriptor (manager_service_pb2.ExtensionDescriptor): Дескриптор расширения 168 servicer_cls (extension_service_pb2_grpc.ExtensionServiceServicer): класс (не экземпляр!) сервиса 169 ext_manager_host (str): адрес сервиса менеджера расширений 170 content_host (str): адрес сервиса контента 171 account_host (str): адрес сервиса аккаунтов 172 files_host (str): адрес сервиса файлов 173 images_host (str): адрес сервиса работы с изображениями 174 """ 175 logger.info(f"Инициализация сервиса расширения {ext_descriptor.extension}") 176 177 loop = asyncio.get_event_loop() 178 179 try: 180 loop.run_until_complete( 181 _main( 182 ext_descriptor=ext_descriptor, 183 servicer_cls=servicer_cls, 184 ext_manager_host=ext_manager_host, 185 content_host=content_host, 186 account_host=account_host, 187 files_host=files_host, 188 images_host=images_host, 189 ) 190 ) 191 finally: 192 loop.close() 193 loop.stop() 194 logging.info('Successfully shutdown service')
logger =
<Logger perxis.extensions.bootstrap (WARNING)>
def
bootstrap( ext_descriptor: extensions.manager_service_pb2.ExtensionDescriptor, servicer_cls: perxis.extensions.extension_service_pb2_grpc.ExtensionServiceServicer, ext_manager_host: str = 'extension-manager:9030', content_host: str = 'content:9020', account_host: str = 'account:9010', files_host: str = 'files:8003', images_host: str = 'images:8005'):
140def bootstrap( 141 ext_descriptor: manager_service_pb2.ExtensionDescriptor, 142 servicer_cls: extension_service_pb2_grpc.ExtensionServiceServicer, 143 ext_manager_host: str = "extension-manager:9030", 144 content_host: str = "content:9020", 145 account_host: str = "account:9010", 146 files_host: str = "files:8003", 147 images_host: str = "images:8005" 148): 149 """ 150 Функция для инициализации и запуска сервиса расширения. 151 152 Пример использования в расширении: 153 ``` 154 def main(): 155 ext_descriptor = utils.get_extension_descriptor( 156 ext_host="demo-ext-backend:50051", 157 ext_id=extension.ID, 158 ext_name=extension.NAME, 159 ext_version=extension.VERSION, 160 ext_description=extension.DESCRIPTION, 161 ext_version_description=extension.VERSION_DESCRIPTION 162 ) 163 164 bootstrap(ext_descriptor, Servicer, ext_manager_host, content_host) 165 ``` 166 167 Arguments: 168 ext_descriptor (manager_service_pb2.ExtensionDescriptor): Дескриптор расширения 169 servicer_cls (extension_service_pb2_grpc.ExtensionServiceServicer): класс (не экземпляр!) сервиса 170 ext_manager_host (str): адрес сервиса менеджера расширений 171 content_host (str): адрес сервиса контента 172 account_host (str): адрес сервиса аккаунтов 173 files_host (str): адрес сервиса файлов 174 images_host (str): адрес сервиса работы с изображениями 175 """ 176 logger.info(f"Инициализация сервиса расширения {ext_descriptor.extension}") 177 178 loop = asyncio.get_event_loop() 179 180 try: 181 loop.run_until_complete( 182 _main( 183 ext_descriptor=ext_descriptor, 184 servicer_cls=servicer_cls, 185 ext_manager_host=ext_manager_host, 186 content_host=content_host, 187 account_host=account_host, 188 files_host=files_host, 189 images_host=images_host, 190 ) 191 ) 192 finally: 193 loop.close() 194 loop.stop() 195 logging.info('Successfully shutdown service')
Функция для инициализации и запуска сервиса расширения.
Пример использования в расширении:
def main():
ext_descriptor = utils.get_extension_descriptor(
ext_host="demo-ext-backend:50051",
ext_id=extension.ID,
ext_name=extension.NAME,
ext_version=extension.VERSION,
ext_description=extension.DESCRIPTION,
ext_version_description=extension.VERSION_DESCRIPTION
)
bootstrap(ext_descriptor, Servicer, ext_manager_host, content_host)
Arguments:
- ext_descriptor (manager_service_pb2.ExtensionDescriptor): Дескриптор расширения
- servicer_cls (extension_service_pb2_grpc.ExtensionServiceServicer): класс (не экземпляр!) сервиса
- ext_manager_host (str): адрес сервиса менеджера расширений
- content_host (str): адрес сервиса контента
- account_host (str): адрес сервиса аккаунтов
- files_host (str): адрес сервиса файлов
- images_host (str): адрес сервиса работы с изображениями