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