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): адрес сервиса работы с изображениями