diff --git a/src/service/clmcservice/graphapi/conftest.py b/src/service/clmcservice/graphapi/conftest.py index 3e81cbf30734f3a778d1fca0b6d1c1fdeeb5bced..f4017e807f8211183377524b2ce795590ccdbf5c 100644 --- a/src/service/clmcservice/graphapi/conftest.py +++ b/src/service/clmcservice/graphapi/conftest.py @@ -83,7 +83,7 @@ clusters = { } ues = { - "127.0.0.1": "ue1", + "127.0.0.2": "ue2", "127.0.0.3": "ue3", "127.0.0.6": "ue6" } diff --git a/src/service/clmcservice/graphapi/tests.py b/src/service/clmcservice/graphapi/tests.py index 4b8361659b4f2100e2c04dd1cb265eb71b4ec9f7..3d83f411d9be69eee8ae9eb7d873e92e4434af14 100644 --- a/src/service/clmcservice/graphapi/tests.py +++ b/src/service/clmcservice/graphapi/tests.py @@ -107,7 +107,7 @@ class TestGraphAPI(object): from_timestamp, to_timestamp, graph_db = db_testing_data ue_nodes = set([node["name"] for node in graph_db.nodes.match("UserEquipment")]) - assert ue_nodes == set("ue" + str(i) for i in [1, 3, 6]), "UE nodes have not been created" + assert ue_nodes == set("ue" + str(i) for i in [2, 3, 6]), "UE nodes have not been created" dc_nodes = set([node["name"] for node in graph_db.nodes.match("Cluster")]) assert dc_nodes == set("DC" + str(i) for i in range(1, 7)), "Compute nodes must have been created by the db_testing_data fixture" @@ -391,10 +391,12 @@ class TestGraphAPI(object): for dc, endpoint, forward_latencies, reverse_latencies, response_time, request_size, response_size, rtt, global_tags in ( ("DC6", "nginx_1_ep2", [], [], 22.2, 35600, 6420, 22.2, {"flame_location": "DC6", "flame_sfe": "nginx_1_ep2", "flame_server": "DC6", "flame_sfc": "test_sfc", "flame_sfci": "test_sfc_premium", "flame_sfp": "nginx", "flame_sf": "nginx_1"}), ("127.0.0.6", "nginx_1_ep2", [0], [0], 22.2, 35600, 6420, 22.2, {"flame_location": "DC6", "flame_sfe": "nginx_1_ep2", "flame_server": "DC6", "flame_sfc": "test_sfc", "flame_sfci": "test_sfc_premium", "flame_sfp": "nginx", "flame_sf": "nginx_1"}), + ("ue6", "nginx_1_ep2", [0, 0], [0, 0], 22.2, 35600, 6420, 22.2, {"flame_location": "DC6", "flame_sfe": "nginx_1_ep2", "flame_server": "DC6", "flame_sfc": "test_sfc", "flame_sfci": "test_sfc_premium", "flame_sfp": "nginx", "flame_sf": "nginx_1"}), ("DC2", "nginx_1_ep2", [0, 7.5, 15, 4.5, 0], [0, 4.5, 15, 7.5, 0], 22.2, 35600, 6420, 78, {"flame_location": "DC6", "flame_sfe": "nginx_1_ep2", "flame_server": "DC6", "flame_sfc": "test_sfc", "flame_sfci": "test_sfc_premium", "flame_sfp": "nginx", "flame_sf": "nginx_1"}), ("127.0.0.2", "nginx_1_ep2", [7.5, 15, 4.5, 0], [0, 4.5, 15, 7.5], 22.2, 35600, 6420, 78, {"flame_location": "DC6", "flame_sfe": "nginx_1_ep2", "flame_server": "DC6", "flame_sfc": "test_sfc", "flame_sfci": "test_sfc_premium", "flame_sfp": "nginx", "flame_sf": "nginx_1"}), ("DC3", "nginx_1_ep1", [0, 12.5, 0], [0, 12.5, 0], 18.2, 2260, 9660, 38, {"flame_location": "DC4", "flame_sfe": "nginx_1_ep1", "flame_server": "DC4", "flame_sfc": "test_sfc", "flame_sfci": "test_sfc_premium", "flame_sfp": "nginx", "flame_sf": "nginx_1"}), - ("127.0.0.3", "nginx_1_ep1", [12.5, 0], [0, 12.5], 18.2, 2260, 9660, 38, {"flame_location": "DC4", "flame_sfe": "nginx_1_ep1", "flame_server": "DC4", "flame_sfc": "test_sfc", "flame_sfci": "test_sfc_premium", "flame_sfp": "nginx", "flame_sf": "nginx_1"}) + ("127.0.0.3", "nginx_1_ep1", [12.5, 0], [0, 12.5], 18.2, 2260, 9660, 38, {"flame_location": "DC4", "flame_sfe": "nginx_1_ep1", "flame_server": "DC4", "flame_sfc": "test_sfc", "flame_sfci": "test_sfc_premium", "flame_sfp": "nginx", "flame_sf": "nginx_1"}), + ("ue3", "nginx_1_ep1", [0, 12.5, 0], [0, 12.5, 0], 18.2, 2260, 9660, 38, {"flame_location": "DC4", "flame_sfe": "nginx_1_ep1", "flame_server": "DC4", "flame_sfc": "test_sfc", "flame_sfci": "test_sfc_premium", "flame_sfp": "nginx", "flame_sf": "nginx_1"}) ): request = testing.DummyRequest() request.matchdict["graph_id"] = request_id @@ -437,8 +439,10 @@ class TestGraphAPI(object): ("127.0.0.5", "minio_2_ep1", [0], [0], 7, 2998, 3610, 7, {"flame_location": "DC5", "flame_sfe": "minio_2_ep1", "flame_server": "DC5", "flame_sfc": "test_sfc", "flame_sfci": "test_sfc_non_premium", "flame_sfp": "minio", "flame_sf": "minio_2"}), ("DC3", "apache_1_ep1", [0, 9, 15, 0], [0, 15, 9, 0], 17.6, 1480, 7860, 64, {"flame_location": "DC5", "flame_sfe": "apache_1_ep1", "flame_server": "DC5", "flame_sfc": "test_sfc", "flame_sfci": "test_sfc_non_premium", "flame_sfp": "apache", "flame_sf": "apache_1"}), ("127.0.0.3", "apache_1_ep1", [9, 15, 0], [0, 15, 9], 17.6, 1480, 7860, 64, {"flame_location": "DC5", "flame_sfe": "apache_1_ep1", "flame_server": "DC5", "flame_sfc": "test_sfc", "flame_sfci": "test_sfc_non_premium", "flame_sfp": "apache", "flame_sf": "apache_1"}), + ("ue3", "apache_1_ep1", [0, 9, 15, 0], [0, 15, 9, 0], 17.6, 1480, 7860, 64, {"flame_location": "DC5", "flame_sfe": "apache_1_ep1", "flame_server": "DC5", "flame_sfc": "test_sfc", "flame_sfci": "test_sfc_non_premium", "flame_sfp": "apache", "flame_sf": "apache_1"}), ("DC2", "minio_2_ep1", [0, 7.5, 15, 0], [0, 15, 7.5, 0], 7, 2998, 3610, 53, {"flame_location": "DC5", "flame_sfe": "minio_2_ep1", "flame_server": "DC5", "flame_sfc": "test_sfc", "flame_sfci": "test_sfc_non_premium", "flame_sfp": "minio", "flame_sf": "minio_2"}), - ("127.0.0.2", "minio_2_ep1", [7.5, 15, 0], [0, 15, 7.5], 7, 2998, 3610, 53, {"flame_location": "DC5", "flame_sfe": "minio_2_ep1", "flame_server": "DC5", "flame_sfc": "test_sfc", "flame_sfci": "test_sfc_non_premium", "flame_sfp": "minio", "flame_sf": "minio_2"}) + ("127.0.0.2", "minio_2_ep1", [7.5, 15, 0], [0, 15, 7.5], 7, 2998, 3610, 53, {"flame_location": "DC5", "flame_sfe": "minio_2_ep1", "flame_server": "DC5", "flame_sfc": "test_sfc", "flame_sfci": "test_sfc_non_premium", "flame_sfp": "minio", "flame_sf": "minio_2"}), + ("ue2", "minio_2_ep1", [0, 7.5, 15, 0], [0, 15, 7.5, 0], 7, 2998, 3610, 53, {"flame_location": "DC5", "flame_sfe": "minio_2_ep1", "flame_server": "DC5", "flame_sfc": "test_sfc", "flame_sfci": "test_sfc_non_premium", "flame_sfp": "minio", "flame_sf": "minio_2"}) ): request = testing.DummyRequest() request.matchdict["graph_id"] = request_id diff --git a/src/service/clmcservice/graphapi/utilities.py b/src/service/clmcservice/graphapi/utilities.py index 48e3b649e2b263bcb1fbe968485b3da516561d81..a23b80b9629bf53c21731e889b90b20b60ddaa88 100644 --- a/src/service/clmcservice/graphapi/utilities.py +++ b/src/service/clmcservice/graphapi/utilities.py @@ -76,7 +76,7 @@ def validate_json_queries_body(body): try: body = loads(body) - except: + except Exception: raise AssertionError("Configuration must be a JSON object.") assert GRAPH_BUILD_QUERY_PARAMS == set(body.keys()), "Invalid JSON query document." @@ -405,3 +405,22 @@ def delete_network_graph(graph): log.info("Deleted {0} UserEquipment nodes.".format(deleted_clusters)) return deleted_switches, deleted_clusters, deleted_ues + + +def find_node_with_possible_types(name, possible_types, graph): + """ + Finds a node that matches one of the given possible types based on the given name. + + :param name: the name of the node + :param possible_types: a list of strings defining the possible types for a node. + :param graph: the neo4j graph reference + + :return: the node object and its type, or None and None if no match is found + """ + + for type_ in possible_types: + node = graph.nodes.match(type_, name=name).first() + if node is not None: + return node, type_ + + return None, None diff --git a/src/service/clmcservice/graphapi/views.py b/src/service/clmcservice/graphapi/views.py index 5bb004ceb6980b85b0768ec552c52e2179ebe324..8cde0757540a9f04a07cdbdbbd9c1273eaa0978b 100644 --- a/src/service/clmcservice/graphapi/views.py +++ b/src/service/clmcservice/graphapi/views.py @@ -24,7 +24,7 @@ from clmcservice.graphapi.utilities import validate_json_queries_body, RTT_CYPHER_QUERY_TEMPLATE, \ - build_network_graph, delete_network_graph, build_temporal_subgraph, delete_temporal_subgraph, validate_graph_rtt_params + build_network_graph, delete_network_graph, build_temporal_subgraph, delete_temporal_subgraph, validate_graph_rtt_params, find_node_with_possible_types from influxdb import InfluxDBClient from py2neo import Graph from pyramid.httpexceptions import HTTPBadRequest, HTTPNotFound, HTTPServiceUnavailable, HTTPNotImplemented @@ -133,19 +133,10 @@ class GraphAPI(object): if reference_node is None: raise HTTPNotFound("No subgraph found associated with the request ID {0}".format(graph_id)) - # match a switch or cluster node as a path start point and capture the type of the node - startpoint_node = all_nodes.match("Switch", name=startpoint_node_label).first() + # match a switch, cluster or ue node as a path start point and capture the type of the node + startpoint_node, startpoint_node_type = find_node_with_possible_types(startpoint_node_label, ("Switch", "Cluster", "UserEquipment"), graph) if startpoint_node is None: - startpoint_node = all_nodes.match("Cluster", name=startpoint_node_label).first() - if startpoint_node is None: - # no match with Swtich/Cluster node - raise HTTPNotFound("Starting point node {0} doesn't exist.".format(startpoint_node_label)) - else: - # a match with a Cluster node - startpoint_node_type = "Cluster" - else: - # a match with a Switch node - startpoint_node_type = "Switch" + raise HTTPNotFound("Starting point node {0} doesn't exist.".format(startpoint_node_label)) endpoint_node = all_nodes.match("Endpoint", name=endpoint_node_label, uuid=graph_id).first() if endpoint_node is None: