Пример #1
0
        async def _process_results_at_end_gateway(
                tasks: List[asyncio.Task],
                request_graph: TopologyGraph) -> asyncio.Future:

            partial_responses = await asyncio.gather(*tasks)
            partial_responses, metadatas = zip(*partial_responses)
            filtered_partial_responses = list(
                filter(lambda x: x is not None, partial_responses))

            response = filtered_partial_responses[0]
            request_graph.add_routes(response)

            return response
Пример #2
0
def test_topology_graph_build_linear(linear_graph_dict):
    graph = TopologyGraph(linear_graph_dict)
    assert [node.name for node in graph.origin_nodes] == ['deployment0']
    node_deployment0 = graph.origin_nodes[0]
    assert node_deployment0.name == 'deployment0'
    assert node_deployment0.number_of_parts == 1
    assert len(node_deployment0.outgoing_nodes) == 1
    assert not node_deployment0.hanging

    node_deployment1 = node_deployment0.outgoing_nodes[0]
    assert node_deployment1.name == 'deployment1'
    assert node_deployment1.number_of_parts == 1
    assert len(node_deployment1.outgoing_nodes) == 1
    assert not node_deployment1.hanging

    node_deployment2 = node_deployment1.outgoing_nodes[0]
    assert node_deployment2.name == 'deployment2'
    assert node_deployment2.number_of_parts == 1
    assert len(node_deployment2.outgoing_nodes) == 1
    assert not node_deployment2.hanging

    node_deployment3 = node_deployment2.outgoing_nodes[0]
    assert node_deployment3.name == 'deployment3'
    assert node_deployment3.number_of_parts == 1
    assert len(node_deployment3.outgoing_nodes) == 0
    assert not node_deployment3.hanging
Пример #3
0
            async def _process_results_at_end_gateway(
                    tasks: List[asyncio.Task],
                    request_graph: TopologyGraph) -> asyncio.Future:
                if self._executor_endpoint_mapping is None:
                    await asyncio.gather(gather_endpoints(request_graph))

                partial_responses = await asyncio.gather(*tasks)
                partial_responses, metadatas = zip(*partial_responses)
                filtered_partial_responses = list(
                    filter(lambda x: x is not None, partial_responses))

                response = filtered_partial_responses[0]
                request_graph.add_routes(response)

                if graph.has_filter_conditions:
                    _sort_response_docs(response)

                return response
Пример #4
0
def test_topology_graph_build_two_joins(two_joins_graph):
    graph = TopologyGraph(two_joins_graph)
    assert len(graph.origin_nodes) == 2
    origin_names = [node.name for node in graph.origin_nodes]
    assert set(origin_names) == {'p0', 'p1'}

    node_p0 = graph.origin_nodes[origin_names.index('p0')]
    assert node_p0.name == 'p0'
    assert node_p0.number_of_parts == 1
    assert len(node_p0.outgoing_nodes) == 1
    assert not node_p0.hanging

    node_p1 = graph.origin_nodes[origin_names.index('p1')]
    assert node_p1.name == 'p1'
    assert node_p1.number_of_parts == 1
    assert len(node_p1.outgoing_nodes) == 1
    assert not node_p1.hanging

    assert id(node_p0.outgoing_nodes[0]) == id(node_p1.outgoing_nodes[0])

    joiner_deployment = node_p0.outgoing_nodes[0]
    assert joiner_deployment.name == 'joiner_1'
    assert len(joiner_deployment.outgoing_nodes) == 2
    assert joiner_deployment.number_of_parts == 2
    assert not joiner_deployment.hanging

    joiner_outgoing_list = [
        node.name for node in joiner_deployment.outgoing_nodes
    ]

    node_p2 = joiner_deployment.outgoing_nodes[joiner_outgoing_list.index(
        'p2')]
    assert node_p2.name == 'p2'
    assert len(node_p2.outgoing_nodes) == 1
    assert node_p2.number_of_parts == 1
    assert not node_p2.hanging

    node_p3 = joiner_deployment.outgoing_nodes[joiner_outgoing_list.index(
        'p3')]
    assert node_p3.name == 'p3'
    assert len(node_p3.outgoing_nodes) == 1
    assert node_p3.number_of_parts == 1
    assert not node_p3.hanging

    assert id(node_p2.outgoing_nodes[0]) == id(node_p3.outgoing_nodes[0])
    node_p4 = node_p2.outgoing_nodes[0]
    assert node_p4.name == 'p4'
    assert len(node_p4.outgoing_nodes) == 0
    assert node_p4.number_of_parts == 2
    assert not node_p4.hanging
Пример #5
0
    def _set_topology_graph(self):
        # check if it should be in K8s, maybe ConnectionPoolFactory to be created
        import json

        graph_description = json.loads(self.args.graph_description)
        graph_conditions = json.loads(self.args.graph_conditions)
        deployments_disable_reduce = json.loads(self.args.deployments_disable_reduce)
        self._topology_graph = TopologyGraph(
            graph_description,
            graph_conditions,
            deployments_disable_reduce,
            timeout_send=self.timeout_send,
            retries=self.args.retries,
        )
Пример #6
0
def test_topology_graph_build_merge_in_last_deployment(
    merge_graph_dict_directly_merge_in_last_deployment,
):
    graph = TopologyGraph(merge_graph_dict_directly_merge_in_last_deployment)
    assert set([node.name for node in graph.origin_nodes]) == {'deployment0'}

    node_deployment0 = graph.origin_nodes[0]
    assert node_deployment0.number_of_parts == 1
    assert len(node_deployment0.outgoing_nodes) == 2
    assert not node_deployment0.hanging
    outgoing_deployment0_list = [node.name for node in node_deployment0.outgoing_nodes]

    node_deployment1 = node_deployment0.outgoing_nodes[
        outgoing_deployment0_list.index('deployment1')
    ]
    assert node_deployment1.number_of_parts == 1
    assert len(node_deployment1.outgoing_nodes) == 1
    assert node_deployment1.outgoing_nodes[0].name == 'merger'
    assert not node_deployment1.hanging

    node_deployment2 = node_deployment0.outgoing_nodes[
        outgoing_deployment0_list.index('deployment2')
    ]
    assert node_deployment2.number_of_parts == 1
    assert len(node_deployment2.outgoing_nodes) == 1
    assert node_deployment2.outgoing_nodes[0].name == 'merger'
    assert not node_deployment2.hanging

    assert id(node_deployment1.outgoing_nodes[0]) == id(
        node_deployment2.outgoing_nodes[0]
    )

    merger_deployment = node_deployment1.outgoing_nodes[0]
    assert merger_deployment.name == 'merger'
    assert len(merger_deployment.outgoing_nodes) == 1
    assert merger_deployment.number_of_parts == 2
    assert not merger_deployment.hanging

    deployment_last_deployment = merger_deployment.outgoing_nodes[0]
    assert deployment_last_deployment.name == 'deployment_last'
    assert len(deployment_last_deployment.outgoing_nodes) == 0
    assert deployment_last_deployment.number_of_parts == 1
    assert not deployment_last_deployment.hanging
Пример #7
0
import json

from jina.logging.logger import JinaLogger
from jina.parsers import set_gateway_parser
from jina.serve.networking import GrpcConnectionPool
from jina.serve.runtimes.gateway.graph.topology_graph import TopologyGraph
from jina.serve.runtimes.gateway.http.app import get_fastapi_app

JINA_LOGO_URL = 'https://api.jina.ai/logo/logo-product/jina-core/horizontal-layout/colored/Product%20logo_Core_vertical_colorful%402x-margin.png'
GATEWAY_SCHEMA_FILENAME = 'gateway.json'

args = set_gateway_parser().parse_args([])
logger = JinaLogger('')
gateway_app = get_fastapi_app(
    args,
    topology_graph=TopologyGraph({}),
    connection_pool=GrpcConnectionPool(logger=logger),
    logger=logger,
)
gateway_schema = gateway_app.openapi()
gateway_schema['info']['x-logo'] = {'url': JINA_LOGO_URL}
gateway_schema['servers'] = []
gateway_schema['servers'].append({
    'url': f'http://localhost:{args.port}',
    'description': 'Local Jina gateway'
})
with open(GATEWAY_SCHEMA_FILENAME, 'w') as f:
    json.dump(gateway_schema, f)
Пример #8
0
def test_empty_graph():
    graph = TopologyGraph({})
    assert not graph.origin_nodes
Пример #9
0
 def __init__(self, graph_representation, conditions={}, *args, **kwargs):
     super().__init__(*args, **kwargs)
     self.connection_pool = DummyMockConnectionPool(*args, **kwargs)
     self.graph = TopologyGraph(graph_representation, conditions)
Пример #10
0
def test_topology_graph_build_hanging_after_merge(graph_hanging_deployment_after_merge):
    graph = TopologyGraph(graph_hanging_deployment_after_merge)
    node_names_list = [node.name for node in graph.origin_nodes]
    assert set(node_names_list) == {
        'deployment0',
        'deployment4',
        'deployment6',
        'deployment8',
    }
    assert (
        len(graph.origin_nodes[node_names_list.index('deployment0')].outgoing_nodes)
        == 2
    )
    assert set(
        [
            node.name
            for node in graph.origin_nodes[
                node_names_list.index('deployment0')
            ].outgoing_nodes
        ]
    ) == {'deployment1', 'deployment2'}

    node_deployment0 = graph.origin_nodes[node_names_list.index('deployment0')]
    assert node_deployment0.name == 'deployment0'
    assert node_deployment0.number_of_parts == 1
    assert not node_deployment0.hanging
    outgoing_deployment0_list = [node.name for node in node_deployment0.outgoing_nodes]

    node_deployment1 = node_deployment0.outgoing_nodes[
        outgoing_deployment0_list.index('deployment1')
    ]
    assert node_deployment1.name == 'deployment1'
    assert node_deployment1.number_of_parts == 1
    assert len(node_deployment1.outgoing_nodes) == 0
    assert node_deployment1.hanging

    node_deployment2 = node_deployment0.outgoing_nodes[
        outgoing_deployment0_list.index('deployment2')
    ]
    assert node_deployment2.name == 'deployment2'
    assert node_deployment2.number_of_parts == 1
    assert len(node_deployment2.outgoing_nodes) == 1
    assert not node_deployment2.hanging

    node_deployment3 = node_deployment2.outgoing_nodes[0]
    assert node_deployment3.name == 'deployment3'
    assert node_deployment3.number_of_parts == 1
    assert len(node_deployment3.outgoing_nodes) == 0
    assert not node_deployment3.hanging

    node_deployment4 = graph.origin_nodes[node_names_list.index('deployment4')]
    assert node_deployment4.name == 'deployment4'
    assert node_deployment4.number_of_parts == 1
    assert len(node_deployment4.outgoing_nodes) == 1
    assert set(
        [
            node.name
            for node in graph.origin_nodes[
                node_names_list.index('deployment4')
            ].outgoing_nodes
        ]
    ) == {'deployment5'}
    assert not node_deployment4.hanging

    node_deployment5 = node_deployment4.outgoing_nodes[0]
    assert node_deployment5.name == 'deployment5'
    assert node_deployment5.number_of_parts == 1
    assert len(node_deployment5.outgoing_nodes) == 0
    assert not node_deployment5.hanging

    node_deployment6 = graph.origin_nodes[node_names_list.index('deployment6')]
    assert node_deployment6.name == 'deployment6'
    assert len(node_deployment6.outgoing_nodes) == 1
    assert node_deployment6.number_of_parts == 1
    assert node_deployment6.outgoing_nodes[0].name == 'deployment7'
    assert not node_deployment6.hanging

    node_deployment8 = graph.origin_nodes[node_names_list.index('deployment8')]
    assert node_deployment8.name == 'deployment8'
    assert len(node_deployment8.outgoing_nodes) == 1
    assert node_deployment8.number_of_parts == 1
    assert node_deployment8.outgoing_nodes[0].name == 'deployment7'
    assert not node_deployment8.hanging

    assert id(node_deployment6.outgoing_nodes[0]) == id(
        node_deployment8.outgoing_nodes[0]
    )

    node_deployment7 = node_deployment6.outgoing_nodes[0]
    assert node_deployment7.name == 'deployment7'
    assert len(node_deployment7.outgoing_nodes) == 1
    assert node_deployment7.number_of_parts == 2
    assert node_deployment7.outgoing_nodes[0].name == 'deployment9'
    assert not node_deployment7.hanging

    node_deployment9 = node_deployment7.outgoing_nodes[0]
    assert node_deployment9.name == 'deployment9'
    assert len(node_deployment9.outgoing_nodes) == 0
    assert node_deployment9.number_of_parts == 1
    assert node_deployment9.hanging
Пример #11
0
def test_topology_graph_build_complete(complete_graph_dict):
    graph = TopologyGraph(complete_graph_dict)
    assert set([node.name for node in graph.origin_nodes]) == {
        'deployment0',
        'deployment4',
        'deployment6',
    }
    node_names_list = [node.name for node in graph.origin_nodes]

    node_deployment0 = graph.origin_nodes[node_names_list.index('deployment0')]
    assert node_deployment0.number_of_parts == 1
    assert not node_deployment0.hanging
    outgoing_deployment0_list = [node.name for node in node_deployment0.outgoing_nodes]

    node_deployment1 = node_deployment0.outgoing_nodes[
        outgoing_deployment0_list.index('deployment1')
    ]
    assert node_deployment1.number_of_parts == 1
    assert not node_deployment1.hanging
    assert len(node_deployment1.outgoing_nodes) == 0

    node_deployment2 = node_deployment0.outgoing_nodes[
        outgoing_deployment0_list.index('deployment2')
    ]
    assert len(node_deployment2.outgoing_nodes) == 1
    assert node_deployment2.number_of_parts == 1
    assert not node_deployment2.hanging

    node_deployment3 = node_deployment2.outgoing_nodes[0]
    assert node_deployment3.name == 'deployment3'
    assert node_deployment3.number_of_parts == 1
    assert len(node_deployment3.outgoing_nodes) == 1
    assert node_deployment3.outgoing_nodes[0].name == 'merger'
    assert not node_deployment3.hanging

    node_deployment4 = graph.origin_nodes[node_names_list.index('deployment4')]
    assert node_deployment4.number_of_parts == 1
    assert len(node_deployment4.outgoing_nodes) == 1
    assert not node_deployment4.hanging

    node_deployment5 = node_deployment4.outgoing_nodes[0]
    assert node_deployment5.number_of_parts == 1
    assert node_deployment5.name == 'deployment5'
    assert len(node_deployment5.outgoing_nodes) == 1
    assert node_deployment5.outgoing_nodes[0].name == 'merger'
    assert not node_deployment5.hanging

    assert id(node_deployment3.outgoing_nodes[0]) == id(
        node_deployment5.outgoing_nodes[0]
    )

    merger_deployment = node_deployment3.outgoing_nodes[0]
    assert merger_deployment.name == 'merger'
    assert len(merger_deployment.outgoing_nodes) == 1
    assert merger_deployment.number_of_parts == 2
    assert not merger_deployment.hanging

    deployment_last_deployment = merger_deployment.outgoing_nodes[0]
    assert deployment_last_deployment.name == 'deployment_last'
    assert len(deployment_last_deployment.outgoing_nodes) == 0
    assert deployment_last_deployment.number_of_parts == 1
    assert not deployment_last_deployment.hanging

    node_deployment6 = graph.origin_nodes[node_names_list.index('deployment6')]
    assert node_deployment6.name == 'deployment6'
    assert node_deployment6.number_of_parts == 1
    assert len(node_deployment6.outgoing_nodes) == 0
    assert node_deployment6.hanging
Пример #12
0
def test_topology_graph_build_bifurcation(bifurcation_graph_dict, conditions):
    graph = TopologyGraph(bifurcation_graph_dict, conditions)
    node_names_list = [node.name for node in graph.origin_nodes]
    assert set(node_names_list) == {'deployment0', 'deployment4', 'deployment6'}
    assert (
        len(graph.origin_nodes[node_names_list.index('deployment0')].outgoing_nodes)
        == 2
    )
    assert set(
        [
            node.name
            for node in graph.origin_nodes[
                node_names_list.index('deployment0')
            ].outgoing_nodes
        ]
    ) == {'deployment1', 'deployment2'}

    node_deployment0 = graph.origin_nodes[node_names_list.index('deployment0')]
    assert not node_deployment0.hanging
    assert node_deployment0.name == 'deployment0'
    assert node_deployment0.number_of_parts == 1
    outgoing_deployment0_list = [node.name for node in node_deployment0.outgoing_nodes]

    node_deployment1 = node_deployment0.outgoing_nodes[
        outgoing_deployment0_list.index('deployment1')
    ]
    assert node_deployment1.name == 'deployment1'
    if conditions == {}:
        assert node_deployment1._filter_condition is None
    else:
        assert node_deployment1._filter_condition == {'tags__key': {'$eq': 5}}
    assert node_deployment1.number_of_parts == 1
    assert len(node_deployment1.outgoing_nodes) == 0
    assert node_deployment1.hanging

    node_deployment2 = node_deployment0.outgoing_nodes[
        outgoing_deployment0_list.index('deployment2')
    ]
    assert node_deployment2.name == 'deployment2'
    if conditions == {}:
        assert node_deployment2._filter_condition is None
    else:
        assert node_deployment2._filter_condition == {'tags__key': {'$eq': 4}}
    assert node_deployment2.number_of_parts == 1
    assert len(node_deployment2.outgoing_nodes) == 1
    assert not node_deployment2.hanging

    node_deployment3 = node_deployment2.outgoing_nodes[0]
    assert node_deployment3.name == 'deployment3'
    assert node_deployment3.number_of_parts == 1
    assert len(node_deployment3.outgoing_nodes) == 0
    assert not node_deployment3.hanging

    node_deployment4 = graph.origin_nodes[node_names_list.index('deployment4')]
    assert node_deployment4.name == 'deployment4'
    assert node_deployment4.number_of_parts == 1
    assert len(node_deployment4.outgoing_nodes) == 1
    assert not node_deployment4.hanging
    assert set(
        [
            node.name
            for node in graph.origin_nodes[
                node_names_list.index('deployment4')
            ].outgoing_nodes
        ]
    ) == {'deployment5'}

    node_deployment5 = node_deployment4.outgoing_nodes[0]
    assert node_deployment5.name == 'deployment5'
    assert node_deployment5.number_of_parts == 1
    assert not node_deployment5.hanging
    assert len(node_deployment5.outgoing_nodes) == 0

    node_deployment6 = graph.origin_nodes[node_names_list.index('deployment6')]
    assert node_deployment6.name == 'deployment6'
    assert len(node_deployment6.outgoing_nodes) == 0
    assert node_deployment6.number_of_parts == 1
    assert node_deployment6.hanging
    assert set([node.name for node in node_deployment6.outgoing_nodes]) == set()
Пример #13
0
    def _set_topology_graph(self):
        # check if it should be in K8s, maybe ConnectionPoolFactory to be created
        import json

        graph_description = json.loads(self.args.graph_description)
        self._topology_graph = TopologyGraph(graph_description)