From ce0d7158957e0c1c75ff46de7c3bfe7ed23d5375 Mon Sep 17 00:00:00 2001 From: Julien Duponchelle Date: Tue, 17 May 2016 13:11:43 +0200 Subject: [PATCH] Fix Deleted node are still return by the API Fix #529 --- gns3server/controller/project.py | 6 ++++++ .../handlers/api/controller/node_handler.py | 3 +-- tests/controller/test_project.py | 20 +++++++++++++++++++ 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/gns3server/controller/project.py b/gns3server/controller/project.py index 48eeb4210..bbb5384be 100644 --- a/gns3server/controller/project.py +++ b/gns3server/controller/project.py @@ -140,6 +140,12 @@ class Project: return node return self._nodes[node_id] + @asyncio.coroutine + def delete_node(self, node_id): + node = self.get_node(node_id) + del self._nodes[node.id] + yield from node.delete() + def get_node(self, node_id): """ Return the node or raise a 404 if the node is unknown diff --git a/gns3server/handlers/api/controller/node_handler.py b/gns3server/handlers/api/controller/node_handler.py index 9f1cdbf93..c5ab6a8bf 100644 --- a/gns3server/handlers/api/controller/node_handler.py +++ b/gns3server/handlers/api/controller/node_handler.py @@ -260,6 +260,5 @@ class NodeHandler: description="Delete a node instance") def delete(request, response): project = Controller.instance().get_project(request.match_info["project_id"]) - node = project.get_node(request.match_info["node_id"]) - yield from node.destroy() + yield from project.delete_node(request.match_info["node_id"]) response.set_status(204) diff --git a/tests/controller/test_project.py b/tests/controller/test_project.py index 90ac792fc..083c898b1 100644 --- a/tests/controller/test_project.py +++ b/tests/controller/test_project.py @@ -89,6 +89,7 @@ def test_add_node_local(async_run): compute.post = AsyncioMagicMock(return_value=response) node = async_run(project.add_node(compute, None, name="test", node_type="vpcs", properties={"startup_config": "test.cfg"})) + assert node.id in project._nodes compute.post.assert_any_call('/projects', data={ "name": project._name, @@ -131,6 +132,25 @@ def test_add_node_non_local(async_run): assert compute in project._project_created_on_compute +def test_delete_node(async_run): + """ + For a local server we send the project path + """ + compute = MagicMock() + project = Project() + + response = MagicMock() + response.json = {"console": 2048} + compute.post = AsyncioMagicMock(return_value=response) + + node = async_run(project.add_node(compute, None, name="test", node_type="vpcs", properties={"startup_config": "test.cfg"})) + assert node.id in project._nodes + async_run(project.delete_node(node.id)) + assert node.id not in project._nodes + + compute.delete.assert_any_call('/projects/{}/vpcs/nodes/{}'.format(project.id, node.id)) + + def test_getVM(async_run): compute = MagicMock() project = Project()