diff --git a/gns3server/handlers/project_handler.py b/gns3server/handlers/project_handler.py index caf3524f..74c150f1 100644 --- a/gns3server/handlers/project_handler.py +++ b/gns3server/handlers/project_handler.py @@ -49,9 +49,27 @@ class ProjectHandler: 204: "Changes write on disk", 404: "Project instance doesn't exist" }) - def create_project(request, response): + def commit(request, response): pm = ProjectManager.instance() project = pm.get_project(request.match_info["uuid"]) project.commit() response.set_status(204) + + @classmethod + @Route.delete( + r"/project/{uuid}", + description="Delete a project from disk", + parameters={ + "uuid": "Project instance UUID", + }, + status_codes={ + 204: "Changes write on disk", + 404: "Project instance doesn't exist" + }) + def delete(request, response): + + pm = ProjectManager.instance() + project = pm.get_project(request.match_info["uuid"]) + project.delete() + response.set_status(204) diff --git a/gns3server/modules/project.py b/gns3server/modules/project.py index 00159fbf..adbb4eba 100644 --- a/gns3server/modules/project.py +++ b/gns3server/modules/project.py @@ -98,10 +98,23 @@ class Project: "location": self._location } + def close(self): + """Close the project, but keep informations on disk""" + + pass + def commit(self): """Write project changes on disk""" + while self._vms_to_destroy: vm = self._vms_to_destroy.pop() directory = self.vm_working_directory(vm) if os.path.exists(directory): shutil.rmtree(directory) + + def delete(self): + """Remove project from disk""" + + self.close() + if os.path.exists(self.path): + shutil.rmtree(self.path) diff --git a/tests/api/test_project.py b/tests/api/test_project.py index d8312cb0..87b8cdfb 100644 --- a/tests/api/test_project.py +++ b/tests/api/test_project.py @@ -51,10 +51,23 @@ def test_create_project_with_uuid(server): def test_commit_project(server, project): - response = server.post("/project/{uuid}/commit".format(uuid=project.uuid)) + response = server.post("/project/{uuid}/commit".format(uuid=project.uuid), example=True) assert response.status == 204 def test_commit_project_invalid_project_uuid(server, project): response = server.post("/project/{uuid}/commit".format(uuid=uuid.uuid4())) assert response.status == 404 + + +def test_delete_project(server): + query = {"uuid": "00010203-0405-0607-0809-0a0b0c0d0e0f"} + response = server.post("/project", query) + assert response.status == 200 + response = server.delete("/project/00010203-0405-0607-0809-0a0b0c0d0e0f") + assert response.status == 204 + + +def test_delete_project_invalid_uuid(server, project): + response = server.delete("/project/{uuid}".format(uuid=uuid.uuid4())) + assert response.status == 404 diff --git a/tests/modules/test_project.py b/tests/modules/test_project.py index fa269d28..d6aa2509 100644 --- a/tests/modules/test_project.py +++ b/tests/modules/test_project.py @@ -81,3 +81,11 @@ def test_commit(tmpdir, manager): project.commit() assert len(project._vms_to_destroy) == 0 assert os.path.exists(directory) is False + + +def test_project_delete(tmpdir): + project = Project(location=str(tmpdir)) + directory = project.path + assert os.path.exists(directory) + project.delete() + assert os.path.exists(directory) is False