diff --git a/src/service/clmcservice/graphapi/tests.py b/src/service/clmcservice/graphapi/tests.py index 1615b3c0b34fd7c1f240caf6f14e1ecfe31c8d57..12c662897f0092170351dc05baf56c971faf0323 100644 --- a/src/service/clmcservice/graphapi/tests.py +++ b/src/service/clmcservice/graphapi/tests.py @@ -428,6 +428,16 @@ class TestGraphAPI(object): assert response == {"forward_latencies": forward_latencies, "reverse_latencies": reverse_latencies, "total_forward_latency": sum(forward_latencies), "total_reverse_latency": sum(reverse_latencies), "bandwidth": 104857600, "response_time": response_time, "global_tags": global_tags}, "Incorrect RTT response" + def test_delete_network_graph(self): + """ + Tests the delete network graph functionality. + """ + + request = testing.DummyRequest() + response = GraphAPI(request).delete_network_topology() + + assert response == {"deleted_switches_count": 6, "deleted_clusters_count": 6} + @staticmethod def check_exist_relationship(relationships_tuple, graph, uuid): """ diff --git a/src/service/clmcservice/graphapi/utilities.py b/src/service/clmcservice/graphapi/utilities.py index 4f4dfe3e2e15cb0184ecbd24d2af3e1e0612bda5..95ff87e3a13260073c60705a51b3e8e17937cb61 100644 --- a/src/service/clmcservice/graphapi/utilities.py +++ b/src/service/clmcservice/graphapi/utilities.py @@ -366,3 +366,34 @@ def build_network_graph(graph, switches, links, clusters): find_or_create_edge(graph, "linkedTo", cluster_node, to_node, latency=0) return new_switches_count, new_clusters_count + + +def delete_network_graph(graph): + """ + A function used to delete all nodes of type Switch and Cluster in the neo4j graph. + + :param graph: the neo4j graph + :return: the number of deleted switches and clusters + """ + + log.info("Deleting Switch nodes.".format()) + + subgraph = graph.nodes.match("Switch") + deleted_switches = 0 + for node in subgraph: + graph.delete(node) + deleted_switches += 1 + + log.info("Deleted {0} Switch nodes.".format(deleted_switches)) + + log.info("Deleting Cluster nodes.") + + subgraph = graph.nodes.match("Cluster") + deleted_clusters = 0 + for node in subgraph: + graph.delete(node) + deleted_clusters += 1 + + log.info("Deleted {0} Cluster nodes.".format(deleted_clusters)) + + return deleted_switches, deleted_clusters diff --git a/src/service/clmcservice/graphapi/views.py b/src/service/clmcservice/graphapi/views.py index dfcb38af124786eca9bffe880c34642f35704f86..c3441afba313621425ba0512886e35d55164f34d 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, validate_graph_url_params, \ - build_network_graph, build_temporal_subgraph, delete_temporal_subgraph, validate_graph_rtt_params, RTT_CYPHER_QUERY_TEMPLATE + build_network_graph, delete_network_graph, build_temporal_subgraph, delete_temporal_subgraph, validate_graph_rtt_params, RTT_CYPHER_QUERY_TEMPLATE from uuid import uuid4 from influxdb import InfluxDBClient from py2neo import Graph @@ -276,3 +276,17 @@ class GraphAPI(object): switch_count, clusters_count = build_network_graph(graph, switches, links, clusters) return {"new_switches_count": switch_count, "new_clusters_count": clusters_count} + + @view_config(route_name='graph_network_topology', request_method='DELETE') + def delete_network_topology(self): + """ + An API endpoint to delete the network topology in the neo4j graph. + + :return: A JSON response with the number of switches and clusters that were deleted. + """ + + graph = Graph(host=self.request.registry.settings['neo4j_host'], password=self.request.registry.settings['neo4j_password']) # connect to the neo4j graph db + + deleted_switches, deleted_clusters = delete_network_graph(graph) + + return {"deleted_switches_count": deleted_switches, "deleted_clusters_count": deleted_clusters}