From 16209a2b60769a207cd92a203b6c08b7246fc466 Mon Sep 17 00:00:00 2001 From: Julien Duponchelle Date: Tue, 25 Jul 2017 11:32:09 +0200 Subject: [PATCH] Support duplicate for Docker Ref https://github.com/GNS3/gns3-gui/issues/1065 --- .../handlers/api/compute/docker_handler.py | 20 +++++++++++++++++++ tests/handlers/api/compute/test_docker.py | 18 +++++++++++++++-- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/gns3server/handlers/api/compute/docker_handler.py b/gns3server/handlers/api/compute/docker_handler.py index 8815e665..1e0775a0 100644 --- a/gns3server/handlers/api/compute/docker_handler.py +++ b/gns3server/handlers/api/compute/docker_handler.py @@ -141,6 +141,26 @@ class DockerHandler: yield from container.delete() response.set_status(204) + @Route.post( + r"/projects/{project_id}/docker/nodes/{node_id}/duplicate", + parameters={ + "project_id": "Project UUID", + "node_id": "Node UUID" + }, + status_codes={ + 201: "Instance duplicated", + 404: "Instance doesn't exist" + }, + description="Duplicate a Docker instance") + def duplicate(request, response): + + new_node = yield from Docker.instance().duplicate_node( + request.match_info["node_id"], + request.json["destination_node_id"] + ) + response.set_status(201) + response.json(new_node) + @Route.post( r"/projects/{project_id}/docker/nodes/{node_id}/pause", parameters={ diff --git a/tests/handlers/api/compute/test_docker.py b/tests/handlers/api/compute/test_docker.py index cbb732df..023eca8a 100644 --- a/tests/handlers/api/compute/test_docker.py +++ b/tests/handlers/api/compute/test_docker.py @@ -132,8 +132,8 @@ def test_docker_update_nio(http_compute, vm): "lport": 4242, "rport": 4343, "rhost": "127.0.0.1" - }, - example=True) + }, + example=True) assert response.status == 201, response.body.decode() assert response.route == "/projects/{project_id}/docker/nodes/{node_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio" @@ -184,3 +184,17 @@ def test_docker_stop_capture(http_compute, vm, tmpdir, project): assert response.status == 204 assert stop_capture.called + + +def test_docker_duplicate(http_compute, vm): + with asyncio_patch("gns3server.compute.docker.Docker.duplicate_node", return_value=True) as mock: + response = http_compute.post( + "/projects/{project_id}/docker/nodes/{node_id}/duplicate".format( + project_id=vm["project_id"], + node_id=vm["node_id"]), + body={ + "destination_node_id": str(uuid.uuid4()) + }, + example=True) + assert mock.called + assert response.status == 201