From 2059adb9db3c3df8648ecc10a31c3ecfbd2ebb6f Mon Sep 17 00:00:00 2001 From: Maxim Podosochnyy <podosochnyy@perx.ru> Date: Mon, 24 Jul 2023 11:42:18 +0700 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=BE=D0=B1=D1=89=D0=B8=D0=B9=20=D0=BA=D0=BE=D0=B4=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=80=D0=B0=D1=81=D1=88=D0=B8=D1=80=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/extension_service/Dockerfile | 2 +- examples/extension_service/Dockerfile.local | 2 +- .../constants/collections.py | 4 +- .../extension_service/constants/extension.py | 15 ---- examples/extension_service/server.py | 72 ++++--------------- perxis/extensions/bootstrap.py | 67 +++++++++++++++++ perxis/extensions/utils.py | 22 ++++++ setup.py | 2 +- 8 files changed, 110 insertions(+), 76 deletions(-) create mode 100644 perxis/extensions/bootstrap.py create mode 100644 perxis/extensions/utils.py diff --git a/examples/extension_service/Dockerfile b/examples/extension_service/Dockerfile index 2c8ed85..d778ea3 100644 --- a/examples/extension_service/Dockerfile +++ b/examples/extension_service/Dockerfile @@ -11,7 +11,7 @@ ARG PIP_EXTRA_INDEX_URL=${PIP_EXTRA_INDEX_URL} ENV PIP_EXTRA_INDEX_URL=$PIP_EXTRA_INDEX_URL COPY . /home/${USER}/app -RUN pip install perxis==0.0.17 +RUN pip install perxis==0.0.20 ENV PYTHONPATH="/home/perx/app" ENV PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python diff --git a/examples/extension_service/Dockerfile.local b/examples/extension_service/Dockerfile.local index d8d0d31..90d6a68 100644 --- a/examples/extension_service/Dockerfile.local +++ b/examples/extension_service/Dockerfile.local @@ -11,7 +11,7 @@ ARG PIP_EXTRA_INDEX_URL=${PIP_EXTRA_INDEX_URL} ENV PIP_EXTRA_INDEX_URL=$PIP_EXTRA_INDEX_URL COPY . /home/${USER}/app -RUN pip install perxis==0.0.17 +RUN pip install perxis==0.0.20 RUN pip install 'watchdog[watchmedo]' ENV PYTHONPATH="/home/perx/app" diff --git a/examples/extension_service/constants/collections.py b/examples/extension_service/constants/collections.py index ef5a4a0..9c9383e 100644 --- a/examples/extension_service/constants/collections.py +++ b/examples/extension_service/constants/collections.py @@ -1,3 +1,5 @@ +TEST_COLLECTION_ID = "test_collection" + schemes_mapping = { - "test_collection": "Тестовая коллекция", + TEST_COLLECTION_ID: "Тестовая коллекция", } diff --git a/examples/extension_service/constants/extension.py b/examples/extension_service/constants/extension.py index c623179..cefb5d7 100644 --- a/examples/extension_service/constants/extension.py +++ b/examples/extension_service/constants/extension.py @@ -1,21 +1,6 @@ -from perxis.extensions import manager_pb2 - - ID = "demo-extension" NAME = "Демонстрационное расширение" VERSION = "v0.0.1" DESCRIPTION = "Демонстрационное расширение" VERSION_DESCRIPTION = "Описание расширения" DEPENDENCIES = [] - - -def get_extension_descriptor(host: str) -> manager_pb2.ExtensionDescriptor: - return manager_pb2.ExtensionDescriptor( - extension=ID, - title=NAME, - description=DESCRIPTION, - version=VERSION, - version_description=VERSION_DESCRIPTION, - deps=DEPENDENCIES, - url=host - ) diff --git a/examples/extension_service/server.py b/examples/extension_service/server.py index 0ad07b7..b635965 100644 --- a/examples/extension_service/server.py +++ b/examples/extension_service/server.py @@ -1,16 +1,11 @@ -import grpc +import os import logging -from concurrent import futures -from perxis.collections import collections_pb2_grpc -from perxis.environments import environments_pb2_grpc -from perxis.roles import roles_pb2_grpc -from perxis.clients import clients_pb2_grpc -from perxis.extensions import extension_pb2_grpc, manager_pb2_grpc, manager_pb2 -from perxis.interceptors import header_adder_interceptor +from perxis.extensions import bootstrap, utils +from constants import extension from servicer import Servicer -from constants.extension import get_extension_descriptor + logging.basicConfig(level=logging.INFO) @@ -18,56 +13,19 @@ logger = logging.getLogger(__name__) def main(): - my_extension_descriptor = get_extension_descriptor(host="demo-ext-backend:50051") - - logger.info(f"Рнициализация сервиса расширения {my_extension_descriptor.extension}") - - interceptor = header_adder_interceptor( - 'x-perxis-access', 'system' + ext_manager_host = os.environ.get("EXT_MANAGER_HOST", "extension-manager:9030") + content_host = os.environ.get("CONTENT_HOST", "content:9020") + + 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 ) - with grpc.insecure_channel("extension-manager:9030") as extensions_manager_channel: - intercept_channel_extensions_manager_channel = grpc.intercept_channel(extensions_manager_channel, interceptor) - - ext_manager_stub = manager_pb2_grpc.ExtensionManagerStub(intercept_channel_extensions_manager_channel) - - registered_extensions: manager_pb2.ListExtensionsResponse = ext_manager_stub.ListExtensions(manager_pb2.ListExtensionsRequest()) - - for ext in registered_extensions.extensions: - if ext.extension == my_extension_descriptor.extension: - if ext.version != my_extension_descriptor.version: - ext_manager_stub.UnregisterExtensions( - manager_pb2.UnregisterExtensionsRequest( - extensions=[my_extension_descriptor] - ) - ) - - logger.info( - f"Рзменилась версия расширения {my_extension_descriptor.extension} ({ext.version} -> {my_extension_descriptor.version})" - ) - - ext_manager_stub.RegisterExtensions(manager_pb2.RegisterExtensionsRequest( - extensions=[my_extension_descriptor] - )) - - logger.info(f"Расширение {my_extension_descriptor.extension} зарегистрировано РІ perxis") - - with grpc.insecure_channel("content:9020") as content_channel: - intercepted_content_channel = grpc.intercept_channel(content_channel, interceptor) - - collections_stub = collections_pb2_grpc.CollectionsStub(intercepted_content_channel) - roles_stub = roles_pb2_grpc.RolesStub(intercepted_content_channel) - clients_stub = clients_pb2_grpc.ClientsStub(intercepted_content_channel) - environments_stub = environments_pb2_grpc.EnvironmentsStub(intercepted_content_channel) - server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) - extension_pb2_grpc.add_ExtensionServicer_to_server( - Servicer( - collections_stub, environments_stub, roles_stub, clients_stub - ), server - ) - server.add_insecure_port("[::]:50051") - server.start() - server.wait_for_termination() + bootstrap.bootstrap(ext_descriptor, Servicer, ext_manager_host, content_host) if __name__ == "__main__": diff --git a/perxis/extensions/bootstrap.py b/perxis/extensions/bootstrap.py new file mode 100644 index 0000000..4227c91 --- /dev/null +++ b/perxis/extensions/bootstrap.py @@ -0,0 +1,67 @@ +import grpc +import logging + +from concurrent import futures +from perxis.extensions import manager_pb2 +from perxis.collections import collections_pb2_grpc +from perxis.environments import environments_pb2_grpc +from perxis.roles import roles_pb2_grpc +from perxis.clients import clients_pb2_grpc +from perxis.extensions import extension_pb2_grpc, manager_pb2_grpc, manager_pb2 +from perxis.interceptors import header_adder_interceptor + + +def bootstrap( + ext_descriptor: manager_pb2.ExtensionDescriptor, servicer_cls: extension_pb2_grpc.ExtensionServicer, + ext_manager_host: str, content_host: str, +): + logger = logging.getLogger(__name__) + + logger.info(f"Рнициализация сервиса расширения {ext_descriptor.extension}") + + interceptor = header_adder_interceptor( + 'x-perxis-access', 'system' + ) + with grpc.insecure_channel(ext_manager_host) as extensions_manager_channel: + intercept_channel_extensions_manager_channel = grpc.intercept_channel(extensions_manager_channel, interceptor) + + ext_manager_stub = manager_pb2_grpc.ExtensionManagerStub(intercept_channel_extensions_manager_channel) + + registered_extensions: manager_pb2.ListExtensionsResponse = ext_manager_stub.ListExtensions(manager_pb2.ListExtensionsRequest()) + + for ext in registered_extensions.extensions: + if ext.extension == ext_descriptor.extension: + if ext.version != ext_descriptor.version: + ext_manager_stub.UnregisterExtensions( + manager_pb2.UnregisterExtensionsRequest( + extensions=[ext_descriptor] + ) + ) + + logger.info( + f"Рзменилась версия расширения {ext_descriptor.extension} ({ext.version} -> {ext_descriptor.version})" + ) + + ext_manager_stub.RegisterExtensions(manager_pb2.RegisterExtensionsRequest( + extensions=[ext_descriptor] + )) + + logger.info(f"Расширение {ext_descriptor.extension} зарегистрировано РІ perxis") + + with grpc.insecure_channel(content_host) as content_channel: + intercepted_content_channel = grpc.intercept_channel(content_channel, interceptor) + + collections_stub = collections_pb2_grpc.CollectionsStub(intercepted_content_channel) + roles_stub = roles_pb2_grpc.RolesStub(intercepted_content_channel) + clients_stub = clients_pb2_grpc.ClientsStub(intercepted_content_channel) + environments_stub = environments_pb2_grpc.EnvironmentsStub(intercepted_content_channel) + + server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) + extension_pb2_grpc.add_ExtensionServicer_to_server( + servicer_cls( + collections_stub, environments_stub, roles_stub, clients_stub + ), server + ) + server.add_insecure_port("[::]:50051") + server.start() + server.wait_for_termination() diff --git a/perxis/extensions/utils.py b/perxis/extensions/utils.py new file mode 100644 index 0000000..ccc5ad7 --- /dev/null +++ b/perxis/extensions/utils.py @@ -0,0 +1,22 @@ +from typing import Optional + +from perxis.extensions import manager_pb2 + + +def get_extension_descriptor( + ext_host: str, ext_id: str, ext_name: str, ext_description: str, + ext_version: str, ext_version_description: str, + ext_deps: Optional[list[str]] = None +) -> manager_pb2.ExtensionDescriptor: + if not ext_deps: + ext_deps = [] + + return manager_pb2.ExtensionDescriptor( + extension=ext_id, + title=ext_name, + description=ext_description, + version=ext_version, + version_description=ext_version_description, + deps=ext_deps, + url=ext_host + ) diff --git a/setup.py b/setup.py index 5288016..b2dfebf 100644 --- a/setup.py +++ b/setup.py @@ -14,7 +14,7 @@ def load_requirements(): setup( name='perxis', - version='0.0.19', + version='0.0.20', description='Perxis python client', long_description=long_description, long_description_content_type='text/markdown', -- GitLab