diff --git a/gns3server/controller/compute.py b/gns3server/controller/compute.py index 06ae501c..cb0d9947 100644 --- a/gns3server/controller/compute.py +++ b/gns3server/controller/compute.py @@ -424,12 +424,24 @@ class Compute: if hasattr(data, '__json__'): data = json.dumps(data.__json__()) # Stream the request - elif isinstance(data, aiohttp.streams.StreamReader) or isinstance(data, io.BufferedIOBase) or isinstance(data, bytes): + elif isinstance(data, aiohttp.streams.StreamReader) or isinstance(data, bytes): chunked = True headers['content-type'] = 'application/octet-stream' + # If the data is an open file we will iterate on it + elif isinstance(data, io.BufferedIOBase): + chunked = True + headers['content-type'] = 'application/octet-stream' + + def send_data(f): + while True: + chunk = f.read(1024) + if not chunk: + break + yield chunk + + data = send_data(data) else: data = json.dumps(data) - response = yield from self._session().request(method, url, headers=headers, data=data, auth=self._auth, chunked=chunked) body = yield from response.read() if body and not raw: diff --git a/gns3server/controller/node.py b/gns3server/controller/node.py index ba51394a..d61cbde9 100644 --- a/gns3server/controller/node.py +++ b/gns3server/controller/node.py @@ -273,9 +273,9 @@ class Node: data = self._node_data() data["node_id"] = self._id if self._node_type == "docker": - timeout = 60 - else: timeout = None + else: + timeout = 120 trial = 0 while trial != 6: try: diff --git a/tests/controller/test_node.py b/tests/controller/test_node.py index 6edb8fdb..89f117f9 100644 --- a/tests/controller/test_node.py +++ b/tests/controller/test_node.py @@ -161,7 +161,7 @@ def test_create(node, compute, project, async_run): "startup_script": "echo test", "name": "demo" } - compute.post.assert_called_with("/projects/{}/vpcs/nodes".format(node.project.id), data=data) + compute.post.assert_called_with("/projects/{}/vpcs/nodes".format(node.project.id), data=data, timeout=120) assert node._console == 2048 assert node._properties == {"startup_script": "echo test"} @@ -372,7 +372,7 @@ def test_create_without_console(node, compute, project, async_run): "startup_script": "echo test", "name": "demo" } - compute.post.assert_called_with("/projects/{}/vpcs/nodes".format(node.project.id), data=data) + compute.post.assert_called_with("/projects/{}/vpcs/nodes".format(node.project.id), data=data, timeout=120) assert node._console == 2048 assert node._properties == {"test_value": "success", "startup_script": "echo test"} diff --git a/tests/controller/test_project.py b/tests/controller/test_project.py index 46bcd6e4..4024e944 100644 --- a/tests/controller/test_project.py +++ b/tests/controller/test_project.py @@ -110,6 +110,7 @@ def test_init_path(tmpdir): p = Project(path=str(tmpdir), project_id=str(uuid4()), name="Test") assert p.path == str(tmpdir) + @pytest.mark.skipif(sys.platform.startswith("win"), reason="Not supported on Windows") def test_changing_path_with_quote_not_allowed(tmpdir): with pytest.raises(aiohttp.web.HTTPForbidden): @@ -147,7 +148,8 @@ def test_add_node_local(async_run, controller): compute.post.assert_any_call('/projects/{}/vpcs/nodes'.format(project.id), data={'node_id': node.id, 'startup_config': 'test.cfg', - 'name': 'test'}) + 'name': 'test'}, + timeout=120) assert compute in project._project_created_on_compute controller.notification.emit.assert_any_call("node.created", node.__json__()) @@ -174,7 +176,8 @@ def test_add_node_non_local(async_run, controller): compute.post.assert_any_call('/projects/{}/vpcs/nodes'.format(project.id), data={'node_id': node.id, 'startup_config': 'test.cfg', - 'name': 'test'}) + 'name': 'test'}, + timeout=120) assert compute in project._project_created_on_compute controller.notification.emit.assert_any_call("node.created", node.__json__())