Skip to content
Snippets Groups Projects
Commit 2f2045be authored by Eterevskiy Georgiy's avatar Eterevskiy Georgiy
Browse files

Merge branch 'feature/add-extensions-shared-code' into 'master'

Добавлен общий код для расширений

See merge request !41
parents ba19e1a2 2059adb9
No related branches found
No related tags found
1 merge request!41Добавлен общий код для расширений
Pipeline #32540 passed with stage
in 2 minutes and 6 seconds
...@@ -11,7 +11,7 @@ ARG PIP_EXTRA_INDEX_URL=${PIP_EXTRA_INDEX_URL} ...@@ -11,7 +11,7 @@ ARG PIP_EXTRA_INDEX_URL=${PIP_EXTRA_INDEX_URL}
ENV PIP_EXTRA_INDEX_URL=$PIP_EXTRA_INDEX_URL ENV PIP_EXTRA_INDEX_URL=$PIP_EXTRA_INDEX_URL
COPY . /home/${USER}/app COPY . /home/${USER}/app
RUN pip install perxis==0.0.17 RUN pip install perxis==0.0.20
ENV PYTHONPATH="/home/perx/app" ENV PYTHONPATH="/home/perx/app"
ENV PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python ENV PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python
......
...@@ -11,7 +11,7 @@ ARG PIP_EXTRA_INDEX_URL=${PIP_EXTRA_INDEX_URL} ...@@ -11,7 +11,7 @@ ARG PIP_EXTRA_INDEX_URL=${PIP_EXTRA_INDEX_URL}
ENV PIP_EXTRA_INDEX_URL=$PIP_EXTRA_INDEX_URL ENV PIP_EXTRA_INDEX_URL=$PIP_EXTRA_INDEX_URL
COPY . /home/${USER}/app COPY . /home/${USER}/app
RUN pip install perxis==0.0.17 RUN pip install perxis==0.0.20
RUN pip install 'watchdog[watchmedo]' RUN pip install 'watchdog[watchmedo]'
ENV PYTHONPATH="/home/perx/app" ENV PYTHONPATH="/home/perx/app"
......
TEST_COLLECTION_ID = "test_collection"
schemes_mapping = { schemes_mapping = {
"test_collection": "Тестовая коллекция", TEST_COLLECTION_ID: "Тестовая коллекция",
} }
from perxis.extensions import manager_pb2
ID = "demo-extension" ID = "demo-extension"
NAME = "Демонстрационное расширение" NAME = "Демонстрационное расширение"
VERSION = "v0.0.1" VERSION = "v0.0.1"
DESCRIPTION = "Демонстрационное расширение" DESCRIPTION = "Демонстрационное расширение"
VERSION_DESCRIPTION = "Описание расширения" VERSION_DESCRIPTION = "Описание расширения"
DEPENDENCIES = [] 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
)
import grpc import os
import logging import logging
from concurrent import futures from perxis.extensions import bootstrap, utils
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 constants import extension
from servicer import Servicer from servicer import Servicer
from constants.extension import get_extension_descriptor
logging.basicConfig(level=logging.INFO) logging.basicConfig(level=logging.INFO)
...@@ -18,56 +13,19 @@ logger = logging.getLogger(__name__) ...@@ -18,56 +13,19 @@ logger = logging.getLogger(__name__)
def main(): def main():
my_extension_descriptor = get_extension_descriptor(host="demo-ext-backend:50051") ext_manager_host = os.environ.get("EXT_MANAGER_HOST", "extension-manager:9030")
content_host = os.environ.get("CONTENT_HOST", "content:9020")
logger.info(f"Инициализация сервиса расширения {my_extension_descriptor.extension}")
ext_descriptor = utils.get_extension_descriptor(
interceptor = header_adder_interceptor( ext_host="demo-ext-backend:50051",
'x-perxis-access', 'system' 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)) bootstrap.bootstrap(ext_descriptor, Servicer, ext_manager_host, content_host)
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()
if __name__ == "__main__": if __name__ == "__main__":
......
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()
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
)
...@@ -14,7 +14,7 @@ def load_requirements(): ...@@ -14,7 +14,7 @@ def load_requirements():
setup( setup(
name='perxis', name='perxis',
version='0.0.19', version='0.0.20',
description='Perxis python client', description='Perxis python client',
long_description=long_description, long_description=long_description,
long_description_content_type='text/markdown', long_description_content_type='text/markdown',
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment