1
0
mirror of https://github.com/GNS3/gns3-server synced 2024-11-28 11:18:11 +00:00

Drop the commit system

Ref https://github.com/GNS3/gns3-gui/issues/1243
This commit is contained in:
Julien Duponchelle 2016-06-14 10:16:33 +02:00
parent 52f852bc6d
commit 3255be0ae2
No known key found for this signature in database
GPG Key ID: CE8B29639E07F5E8
9 changed files with 2 additions and 150 deletions

View File

@ -288,16 +288,6 @@ class BaseManager:
pass pass
@asyncio.coroutine
def project_committed(self, project):
"""
Called when a project is committed.
:param project: Project instance
"""
pass
@asyncio.coroutine @asyncio.coroutine
def delete_node(self, node_id): def delete_node(self, node_id):
""" """
@ -309,7 +299,7 @@ class BaseManager:
node = yield from self.close_node(node_id) node = yield from self.close_node(node_id)
node.project.emit("node.deleted", node) node.project.emit("node.deleted", node)
node.project.mark_node_for_destruction(node) yield from node.project.remove_node(node)
if node.id in self._nodes: if node.id in self._nodes:
del self._nodes[node.id] del self._nodes[node.id]
return node return node

View File

@ -239,23 +239,6 @@ class Dynamips(BaseManager):
if device.project.id == project.id: if device.project.id == project.id:
yield from device.hypervisor.set_working_dir(project.module_working_directory(self.module_name.lower())) yield from device.hypervisor.set_working_dir(project.module_working_directory(self.module_name.lower()))
@asyncio.coroutine
def project_committed(self, project):
"""
Called when a project has been committed.
:param project: Project instance
"""
# save the configs when the project is committed
for node in self._nodes.copy().values():
if node.project.id == project.id:
try:
yield from node.save_configs()
except DynamipsError as e:
log.warning(e)
continue
@property @property
def dynamips_path(self): def dynamips_path(self):
""" """

View File

@ -56,7 +56,6 @@ class Project:
self._id = project_id self._id = project_id
self._nodes = set() self._nodes = set()
self._nodes_to_destroy = set()
self._used_tcp_ports = set() self._used_tcp_ports = set()
self._used_udp_ports = set() self._used_udp_ports = set()
@ -231,14 +230,6 @@ class Project:
raise aiohttp.web.HTTPInternalServerError(text="Could not create the capture working directory: {}".format(e)) raise aiohttp.web.HTTPInternalServerError(text="Could not create the capture working directory: {}".format(e))
return workdir return workdir
def mark_node_for_destruction(self, node):
"""
:param node: An instance of Node
"""
self.remove_node(node)
self._nodes_to_destroy.add(node)
def add_node(self, node): def add_node(self, node):
""" """
Adds a node to the project. Adds a node to the project.
@ -258,6 +249,7 @@ class Project:
""" """
if node in self._nodes: if node in self._nodes:
yield from node.delete()
self._nodes.remove(node) self._nodes.remove(node)
@asyncio.coroutine @asyncio.coroutine
@ -319,19 +311,6 @@ class Project:
for port in self._used_udp_ports.copy(): for port in self._used_udp_ports.copy():
port_manager.release_udp_port(port, self) port_manager.release_udp_port(port, self)
@asyncio.coroutine
def commit(self):
"""
Writes project changes on disk
"""
while self._nodes_to_destroy:
node = self._nodes_to_destroy.pop()
yield from node.delete()
self.remove_node(node)
for module in self.compute():
yield from module.instance().project_committed(self)
@asyncio.coroutine @asyncio.coroutine
def delete(self): def delete(self):
""" """

View File

@ -273,11 +273,6 @@ class Project:
yield from compute.post("/projects/{}/close".format(self._id)) yield from compute.post("/projects/{}/close".format(self._id))
self._allocated_node_names.clear() self._allocated_node_names.clear()
@asyncio.coroutine
def commit(self):
for compute in self._project_created_on_compute:
yield from compute.post("/projects/{}/commit".format(self._id))
@asyncio.coroutine @asyncio.coroutine
def delete(self): def delete(self):
yield from self.close() yield from self.close()

View File

@ -121,23 +121,6 @@ class ProjectHandler:
yield from module.instance().project_moved(project) yield from module.instance().project_moved(project)
response.json(project) response.json(project)
@Route.post(
r"/projects/{project_id}/commit",
description="Write changes on disk",
parameters={
"project_id": "Project UUID",
},
status_codes={
204: "Changes have been written on disk",
404: "The project doesn't exist"
})
def commit(request, response):
pm = ProjectManager.instance()
project = pm.get_project(request.match_info["project_id"])
yield from project.commit()
response.set_status(204)
@Route.post( @Route.post(
r"/projects/{project_id}/close", r"/projects/{project_id}/close",
description="Close a project", description="Close a project",

View File

@ -76,23 +76,6 @@ class ProjectHandler:
project = controller.get_project(request.match_info["project_id"]) project = controller.get_project(request.match_info["project_id"])
response.json(project) response.json(project)
@Route.post(
r"/projects/{project_id}/commit",
description="Write changes on disk",
parameters={
"project_id": "Project UUID",
},
status_codes={
204: "Changes have been written on disk",
404: "The project doesn't exist"
})
def commit(request, response):
controller = Controller.instance()
project = controller.get_project(request.match_info["project_id"])
yield from project.commit()
response.set_status(204)
@Route.post( @Route.post(
r"/projects/{project_id}/close", r"/projects/{project_id}/close",
description="Close a project", description="Close a project",

View File

@ -106,43 +106,6 @@ def test_node_working_directory(tmpdir, node):
assert os.path.exists(p.node_working_directory(node)) assert os.path.exists(p.node_working_directory(node))
def test_mark_node_for_destruction(node):
project = Project(project_id=str(uuid4()))
project.add_node(node)
project.mark_node_for_destruction(node)
assert len(project._nodes_to_destroy) == 1
assert len(project.nodes) == 0
def test_commit(manager, loop):
project = Project(project_id=str(uuid4()))
node = VPCSVM("test", "00010203-0405-0607-0809-0a0b0c0d0e0f", project, manager)
project.add_node(node)
directory = project.node_working_directory(node)
project.mark_node_for_destruction(node)
assert len(project._nodes_to_destroy) == 1
assert os.path.exists(directory)
loop.run_until_complete(asyncio.async(project.commit()))
assert len(project._nodes_to_destroy) == 0
assert os.path.exists(directory) is False
assert len(project.nodes) == 0
def test_commit_permission_issue(manager, loop):
"""
GNS3 will fix the permission and continue to delete
"""
project = Project(project_id=str(uuid4()))
node = VPCSVM("test", "00010203-0405-0607-0809-0a0b0c0d0e0f", project, manager)
project.add_node(node)
directory = project.node_working_directory(node)
project.mark_node_for_destruction(node)
assert len(project._nodes_to_destroy) == 1
assert os.path.exists(directory)
os.chmod(directory, 0)
loop.run_until_complete(asyncio.async(project.commit()))
def test_project_delete(loop): def test_project_delete(loop):
project = Project(project_id=str(uuid4())) project = Project(project_id=str(uuid4()))
directory = project.path directory = project.path

View File

@ -114,18 +114,6 @@ def test_update_path_project_non_local(http_compute, tmpdir):
assert response.status == 403 assert response.status == 403
def test_commit_project(http_compute, project):
with asyncio_patch("gns3server.compute.project.Project.commit", return_value=True) as mock:
response = http_compute.post("/projects/{project_id}/commit".format(project_id=project.id), example=True)
assert response.status == 204
assert mock.called
def test_commit_project_invalid_uuid(http_compute):
response = http_compute.post("/projects/{project_id}/commit".format(project_id=uuid.uuid4()))
assert response.status == 404
def test_delete_project(http_compute, project): def test_delete_project(http_compute, project):
with asyncio_patch("gns3server.compute.project.Project.delete", return_value=True) as mock: with asyncio_patch("gns3server.compute.project.Project.delete", return_value=True) as mock:
response = http_compute.delete("/projects/{project_id}".format(project_id=project.id), example=True) response = http_compute.delete("/projects/{project_id}".format(project_id=project.id), example=True)

View File

@ -73,18 +73,6 @@ def test_list_projects(http_controller, tmpdir):
assert projects[0]["name"] == "test" assert projects[0]["name"] == "test"
def test_commit_project(http_controller, project):
with asyncio_patch("gns3server.controller.project.Project.commit", return_value=True) as mock:
response = http_controller.post("/projects/{project_id}/commit".format(project_id=project.id), example=True)
assert response.status == 204
assert mock.called
def test_commit_project_invalid_uuid(http_controller):
response = http_controller.post("/projects/{project_id}/commit".format(project_id=uuid.uuid4()))
assert response.status == 404
def test_get_project(http_controller, project): def test_get_project(http_controller, project):
response = http_controller.get("/projects/{project_id}".format(project_id=project.id), example=True) response = http_controller.get("/projects/{project_id}".format(project_id=project.id), example=True)
assert response.status == 200 assert response.status == 200