diff --git a/examples/extension_service/Dockerfile b/examples/extension_service/Dockerfile index 2c8ed85c1fe89a8792e59cd2999fe8ebb2f54d0a..d778ea3ef917ca270c9d291a509345f6ad88c88b 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 d8d0d31766a83b0069c695242665804a78e52890..90d6a6839f976fe9643c0eae3f17a5f5f59e0b66 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 ef5a4a02a74a90fcafd394ec580003fc0d6c5069..9c9383e39ec52911ae058df84150bc72d42007b9 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 c623179157615892d6ca3c2aaade3cdfa9d56528..cefb5d7bb4272e6ba7c13feedea5405d82f3b211 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 0ad07b7ad31210ae861c968e7c9457a3a6870038..b6359656af22370acd89c8e0c0dae8b7d72283cf 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 0000000000000000000000000000000000000000..4227c916fa75ca0f1881a67c6e421c1eaf17cd8f --- /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 0000000000000000000000000000000000000000..ccc5ad704bf2fa30209a44d7238f478ec142e103 --- /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 52880160178b01a8f450c9eb3b84b852eabc36c3..b2dfebf3d833beae1278a17dfeeff1182139b771 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',