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
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
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
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
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, )
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
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)
def test_empty_graph(): graph = TopologyGraph({}) assert not graph.origin_nodes
def __init__(self, graph_representation, conditions={}, *args, **kwargs): super().__init__(*args, **kwargs) self.connection_pool = DummyMockConnectionPool(*args, **kwargs) self.graph = TopologyGraph(graph_representation, conditions)
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
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
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()
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)