mirror of
https://github.com/GNS3/gns3-server
synced 2024-11-24 17:28:08 +00:00
Fix timeout issues when starting VMware or VBox
Fix https://github.com/GNS3/gns3-gui/issues/1632
This commit is contained in:
parent
a35eaa8e60
commit
3c5cbebfb4
@ -435,7 +435,7 @@ class Compute:
|
|||||||
return "{}://{}:{}/v2/compute{}".format(self._protocol, host, self._port, path)
|
return "{}://{}:{}/v2/compute{}".format(self._protocol, host, self._port, path)
|
||||||
|
|
||||||
@asyncio.coroutine
|
@asyncio.coroutine
|
||||||
def _run_http_query(self, method, path, data=None, timeout=10, raw=False):
|
def _run_http_query(self, method, path, data=None, timeout=20, raw=False):
|
||||||
with Timeout(timeout):
|
with Timeout(timeout):
|
||||||
url = self._getUrl(path)
|
url = self._getUrl(path)
|
||||||
headers = {}
|
headers = {}
|
||||||
|
@ -387,7 +387,7 @@ class Node:
|
|||||||
Start a node
|
Start a node
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
yield from self.post("/start")
|
yield from self.post("/start", timeout=240)
|
||||||
except asyncio.TimeoutError:
|
except asyncio.TimeoutError:
|
||||||
raise aiohttp.web.HTTPRequestTimeout(text="Timeout when starting {}".format(self._name))
|
raise aiohttp.web.HTTPRequestTimeout(text="Timeout when starting {}".format(self._name))
|
||||||
|
|
||||||
@ -397,7 +397,7 @@ class Node:
|
|||||||
Stop a node
|
Stop a node
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
yield from self.post("/stop")
|
yield from self.post("/stop", timeout=240)
|
||||||
# We don't care if a node is down at this step
|
# We don't care if a node is down at this step
|
||||||
except (aiohttp.errors.ClientOSError, aiohttp.errors.ClientHttpProcessingError, aiohttp.web.HTTPError):
|
except (aiohttp.errors.ClientOSError, aiohttp.errors.ClientHttpProcessingError, aiohttp.web.HTTPError):
|
||||||
pass
|
pass
|
||||||
@ -409,27 +409,33 @@ class Node:
|
|||||||
"""
|
"""
|
||||||
Suspend a node
|
Suspend a node
|
||||||
"""
|
"""
|
||||||
yield from self.post("/suspend")
|
try:
|
||||||
|
yield from self.post("/suspend", timeout=240)
|
||||||
|
except asyncio.TimeoutError:
|
||||||
|
raise aiohttp.web.HTTPRequestTimeout(text="Timeout when reloading {}".format(self._name))
|
||||||
|
|
||||||
@asyncio.coroutine
|
@asyncio.coroutine
|
||||||
def reload(self):
|
def reload(self):
|
||||||
"""
|
"""
|
||||||
Suspend a node
|
Suspend a node
|
||||||
"""
|
"""
|
||||||
yield from self.post("/reload")
|
try:
|
||||||
|
yield from self.post("/reload", timeout=240)
|
||||||
|
except asyncio.TimeoutError:
|
||||||
|
raise aiohttp.web.HTTPRequestTimeout(text="Timeout when reloading {}".format(self._name))
|
||||||
|
|
||||||
@asyncio.coroutine
|
@asyncio.coroutine
|
||||||
def post(self, path, data=None):
|
def post(self, path, data=None, **kwargs):
|
||||||
"""
|
"""
|
||||||
HTTP post on the node
|
HTTP post on the node
|
||||||
"""
|
"""
|
||||||
if data:
|
if data:
|
||||||
return (yield from self._compute.post("/projects/{}/{}/nodes/{}{}".format(self._project.id, self._node_type, self._id, path), data=data))
|
return (yield from self._compute.post("/projects/{}/{}/nodes/{}{}".format(self._project.id, self._node_type, self._id, path), data=data, **kwargs))
|
||||||
else:
|
else:
|
||||||
return (yield from self._compute.post("/projects/{}/{}/nodes/{}{}".format(self._project.id, self._node_type, self._id, path)))
|
return (yield from self._compute.post("/projects/{}/{}/nodes/{}{}".format(self._project.id, self._node_type, self._id, path), **kwargs))
|
||||||
|
|
||||||
@asyncio.coroutine
|
@asyncio.coroutine
|
||||||
def put(self, path, data=None):
|
def put(self, path, data=None, **kwargs):
|
||||||
"""
|
"""
|
||||||
HTTP post on the node
|
HTTP post on the node
|
||||||
"""
|
"""
|
||||||
@ -438,19 +444,19 @@ class Node:
|
|||||||
else:
|
else:
|
||||||
path = "/projects/{}/{}/nodes/{}{}".format(self._project.id, self._node_type, self._id, path)
|
path = "/projects/{}/{}/nodes/{}{}".format(self._project.id, self._node_type, self._id, path)
|
||||||
if data:
|
if data:
|
||||||
return (yield from self._compute.put(path, data=data))
|
return (yield from self._compute.put(path, data=data, **kwargs))
|
||||||
else:
|
else:
|
||||||
return (yield from self._compute.put(path))
|
return (yield from self._compute.put(path, **kwargs))
|
||||||
|
|
||||||
@asyncio.coroutine
|
@asyncio.coroutine
|
||||||
def delete(self, path=None):
|
def delete(self, path=None, **kwargs):
|
||||||
"""
|
"""
|
||||||
HTTP post on the node
|
HTTP post on the node
|
||||||
"""
|
"""
|
||||||
if path is None:
|
if path is None:
|
||||||
return (yield from self._compute.delete("/projects/{}/{}/nodes/{}".format(self._project.id, self._node_type, self._id)))
|
return (yield from self._compute.delete("/projects/{}/{}/nodes/{}".format(self._project.id, self._node_type, self._id), **kwargs))
|
||||||
else:
|
else:
|
||||||
return (yield from self._compute.delete("/projects/{}/{}/nodes/{}{}".format(self._project.id, self._node_type, self._id, path)))
|
return (yield from self._compute.delete("/projects/{}/{}/nodes/{}{}".format(self._project.id, self._node_type, self._id, path), **kwargs))
|
||||||
|
|
||||||
@asyncio.coroutine
|
@asyncio.coroutine
|
||||||
def _upload_missing_image(self, type, img):
|
def _upload_missing_image(self, type, img):
|
||||||
|
@ -75,7 +75,7 @@ def test_compute_httpQuery(compute, async_run):
|
|||||||
response.status = 200
|
response.status = 200
|
||||||
|
|
||||||
async_run(compute.post("/projects", {"a": "b"}))
|
async_run(compute.post("/projects", {"a": "b"}))
|
||||||
mock.assert_called_with("POST", "https://example.com:84/v2/compute/projects", data='{"a": "b"}', headers={'content-type': 'application/json'}, auth=None, chunked=False, timeout=10)
|
mock.assert_called_with("POST", "https://example.com:84/v2/compute/projects", data='{"a": "b"}', headers={'content-type': 'application/json'}, auth=None, chunked=False, timeout=20)
|
||||||
assert compute._auth is None
|
assert compute._auth is None
|
||||||
|
|
||||||
|
|
||||||
@ -87,7 +87,7 @@ def test_compute_httpQueryAuth(compute, async_run):
|
|||||||
compute.user = "root"
|
compute.user = "root"
|
||||||
compute.password = "toor"
|
compute.password = "toor"
|
||||||
async_run(compute.post("/projects", {"a": "b"}))
|
async_run(compute.post("/projects", {"a": "b"}))
|
||||||
mock.assert_called_with("POST", "https://example.com:84/v2/compute/projects", data='{"a": "b"}', headers={'content-type': 'application/json'}, auth=compute._auth, chunked=False, timeout=10)
|
mock.assert_called_with("POST", "https://example.com:84/v2/compute/projects", data='{"a": "b"}', headers={'content-type': 'application/json'}, auth=compute._auth, chunked=False, timeout=20)
|
||||||
assert compute._auth.login == "root"
|
assert compute._auth.login == "root"
|
||||||
assert compute._auth.password == "toor"
|
assert compute._auth.password == "toor"
|
||||||
|
|
||||||
@ -100,8 +100,8 @@ def test_compute_httpQueryNotConnected(compute, controller, async_run):
|
|||||||
response.status = 200
|
response.status = 200
|
||||||
with asyncio_patch("aiohttp.ClientSession.request", return_value=response) as mock:
|
with asyncio_patch("aiohttp.ClientSession.request", return_value=response) as mock:
|
||||||
async_run(compute.post("/projects", {"a": "b"}))
|
async_run(compute.post("/projects", {"a": "b"}))
|
||||||
mock.assert_any_call("GET", "https://example.com:84/v2/compute/capabilities", headers={'content-type': 'application/json'}, data=None, auth=None, chunked=False, timeout=10)
|
mock.assert_any_call("GET", "https://example.com:84/v2/compute/capabilities", headers={'content-type': 'application/json'}, data=None, auth=None, chunked=False, timeout=20)
|
||||||
mock.assert_any_call("POST", "https://example.com:84/v2/compute/projects", data='{"a": "b"}', headers={'content-type': 'application/json'}, auth=None, chunked=False, timeout=10)
|
mock.assert_any_call("POST", "https://example.com:84/v2/compute/projects", data='{"a": "b"}', headers={'content-type': 'application/json'}, auth=None, chunked=False, timeout=20)
|
||||||
assert compute._connected
|
assert compute._connected
|
||||||
assert compute._capabilities["version"] == __version__
|
assert compute._capabilities["version"] == __version__
|
||||||
controller.notification.emit.assert_called_with("compute.updated", compute.__json__())
|
controller.notification.emit.assert_called_with("compute.updated", compute.__json__())
|
||||||
@ -122,8 +122,8 @@ def test_compute_httpQueryNotConnectedGNS3vmNotRunning(compute, controller, asyn
|
|||||||
response.status = 200
|
response.status = 200
|
||||||
with asyncio_patch("aiohttp.ClientSession.request", return_value=response) as mock:
|
with asyncio_patch("aiohttp.ClientSession.request", return_value=response) as mock:
|
||||||
async_run(compute.post("/projects", {"a": "b"}))
|
async_run(compute.post("/projects", {"a": "b"}))
|
||||||
mock.assert_any_call("GET", "https://example.com:84/v2/compute/capabilities", headers={'content-type': 'application/json'}, data=None, auth=None, chunked=False, timeout=10)
|
mock.assert_any_call("GET", "https://example.com:84/v2/compute/capabilities", headers={'content-type': 'application/json'}, data=None, auth=None, chunked=False, timeout=20)
|
||||||
mock.assert_any_call("POST", "https://example.com:84/v2/compute/projects", data='{"a": "b"}', headers={'content-type': 'application/json'}, auth=None, chunked=False, timeout=10)
|
mock.assert_any_call("POST", "https://example.com:84/v2/compute/projects", data='{"a": "b"}', headers={'content-type': 'application/json'}, auth=None, chunked=False, timeout=20)
|
||||||
|
|
||||||
assert controller.gns3vm.start.called
|
assert controller.gns3vm.start.called
|
||||||
assert compute._connected
|
assert compute._connected
|
||||||
@ -139,7 +139,7 @@ def test_compute_httpQueryNotConnectedInvalidVersion(compute, async_run):
|
|||||||
with asyncio_patch("aiohttp.ClientSession.request", return_value=response) as mock:
|
with asyncio_patch("aiohttp.ClientSession.request", return_value=response) as mock:
|
||||||
with pytest.raises(aiohttp.web.HTTPConflict):
|
with pytest.raises(aiohttp.web.HTTPConflict):
|
||||||
async_run(compute.post("/projects", {"a": "b"}))
|
async_run(compute.post("/projects", {"a": "b"}))
|
||||||
mock.assert_any_call("GET", "https://example.com:84/v2/compute/capabilities", headers={'content-type': 'application/json'}, data=None, auth=None, chunked=False, timeout=10)
|
mock.assert_any_call("GET", "https://example.com:84/v2/compute/capabilities", headers={'content-type': 'application/json'}, data=None, auth=None, chunked=False, timeout=20)
|
||||||
|
|
||||||
|
|
||||||
def test_compute_httpQueryNotConnectedNonGNS3Server(compute, async_run):
|
def test_compute_httpQueryNotConnectedNonGNS3Server(compute, async_run):
|
||||||
@ -150,7 +150,7 @@ def test_compute_httpQueryNotConnectedNonGNS3Server(compute, async_run):
|
|||||||
with asyncio_patch("aiohttp.ClientSession.request", return_value=response) as mock:
|
with asyncio_patch("aiohttp.ClientSession.request", return_value=response) as mock:
|
||||||
with pytest.raises(aiohttp.web.HTTPConflict):
|
with pytest.raises(aiohttp.web.HTTPConflict):
|
||||||
async_run(compute.post("/projects", {"a": "b"}))
|
async_run(compute.post("/projects", {"a": "b"}))
|
||||||
mock.assert_any_call("GET", "https://example.com:84/v2/compute/capabilities", headers={'content-type': 'application/json'}, data=None, auth=None, chunked=False, timeout=10)
|
mock.assert_any_call("GET", "https://example.com:84/v2/compute/capabilities", headers={'content-type': 'application/json'}, data=None, auth=None, chunked=False, timeout=20)
|
||||||
|
|
||||||
|
|
||||||
def test_compute_httpQueryNotConnectedNonGNS3Server2(compute, async_run):
|
def test_compute_httpQueryNotConnectedNonGNS3Server2(compute, async_run):
|
||||||
@ -161,7 +161,7 @@ def test_compute_httpQueryNotConnectedNonGNS3Server2(compute, async_run):
|
|||||||
with asyncio_patch("aiohttp.ClientSession.request", return_value=response) as mock:
|
with asyncio_patch("aiohttp.ClientSession.request", return_value=response) as mock:
|
||||||
with pytest.raises(aiohttp.web.HTTPConflict):
|
with pytest.raises(aiohttp.web.HTTPConflict):
|
||||||
async_run(compute.post("/projects", {"a": "b"}))
|
async_run(compute.post("/projects", {"a": "b"}))
|
||||||
mock.assert_any_call("GET", "https://example.com:84/v2/compute/capabilities", headers={'content-type': 'application/json'}, data=None, auth=None, chunked=False, timeout=10)
|
mock.assert_any_call("GET", "https://example.com:84/v2/compute/capabilities", headers={'content-type': 'application/json'}, data=None, auth=None, chunked=False, timeout=20)
|
||||||
|
|
||||||
|
|
||||||
def test_compute_httpQueryError(compute, async_run):
|
def test_compute_httpQueryError(compute, async_run):
|
||||||
@ -190,7 +190,7 @@ def test_compute_httpQuery_project(compute, async_run):
|
|||||||
|
|
||||||
project = Project(name="Test")
|
project = Project(name="Test")
|
||||||
async_run(compute.post("/projects", project))
|
async_run(compute.post("/projects", project))
|
||||||
mock.assert_called_with("POST", "https://example.com:84/v2/compute/projects", data=json.dumps(project.__json__()), headers={'content-type': 'application/json'}, auth=None, chunked=False, timeout=10)
|
mock.assert_called_with("POST", "https://example.com:84/v2/compute/projects", data=json.dumps(project.__json__()), headers={'content-type': 'application/json'}, auth=None, chunked=False, timeout=20)
|
||||||
|
|
||||||
|
|
||||||
def test_connectNotification(compute, async_run):
|
def test_connectNotification(compute, async_run):
|
||||||
@ -390,7 +390,7 @@ def test_interfaces(project, async_run, compute):
|
|||||||
response.status = 200
|
response.status = 200
|
||||||
with asyncio_patch("aiohttp.ClientSession.request", return_value=response) as mock:
|
with asyncio_patch("aiohttp.ClientSession.request", return_value=response) as mock:
|
||||||
assert async_run(compute.interfaces()) == res
|
assert async_run(compute.interfaces()) == res
|
||||||
mock.assert_any_call("GET", "https://example.com:84/v2/compute/network/interfaces", auth=None, chunked=False, data=None, headers={'content-type': 'application/json'}, timeout=10)
|
mock.assert_any_call("GET", "https://example.com:84/v2/compute/network/interfaces", auth=None, chunked=False, data=None, headers={'content-type': 'application/json'}, timeout=20)
|
||||||
|
|
||||||
|
|
||||||
def test_get_ip_on_same_subnet(controller, async_run):
|
def test_get_ip_on_same_subnet(controller, async_run):
|
||||||
|
@ -343,7 +343,7 @@ def test_start(node, compute, project, async_run):
|
|||||||
compute.post = AsyncioMagicMock()
|
compute.post = AsyncioMagicMock()
|
||||||
|
|
||||||
async_run(node.start())
|
async_run(node.start())
|
||||||
compute.post.assert_called_with("/projects/{}/vpcs/nodes/{}/start".format(node.project.id, node.id))
|
compute.post.assert_called_with("/projects/{}/vpcs/nodes/{}/start".format(node.project.id, node.id), timeout=240)
|
||||||
|
|
||||||
|
|
||||||
def test_stop(node, compute, project, async_run):
|
def test_stop(node, compute, project, async_run):
|
||||||
@ -351,7 +351,7 @@ def test_stop(node, compute, project, async_run):
|
|||||||
compute.post = AsyncioMagicMock()
|
compute.post = AsyncioMagicMock()
|
||||||
|
|
||||||
async_run(node.stop())
|
async_run(node.stop())
|
||||||
compute.post.assert_called_with("/projects/{}/vpcs/nodes/{}/stop".format(node.project.id, node.id))
|
compute.post.assert_called_with("/projects/{}/vpcs/nodes/{}/stop".format(node.project.id, node.id), timeout=240)
|
||||||
|
|
||||||
|
|
||||||
def test_suspend(node, compute, project, async_run):
|
def test_suspend(node, compute, project, async_run):
|
||||||
@ -359,7 +359,7 @@ def test_suspend(node, compute, project, async_run):
|
|||||||
compute.post = AsyncioMagicMock()
|
compute.post = AsyncioMagicMock()
|
||||||
|
|
||||||
async_run(node.suspend())
|
async_run(node.suspend())
|
||||||
compute.post.assert_called_with("/projects/{}/vpcs/nodes/{}/suspend".format(node.project.id, node.id))
|
compute.post.assert_called_with("/projects/{}/vpcs/nodes/{}/suspend".format(node.project.id, node.id), timeout=240)
|
||||||
|
|
||||||
|
|
||||||
def test_reload(node, compute, project, async_run):
|
def test_reload(node, compute, project, async_run):
|
||||||
@ -367,7 +367,7 @@ def test_reload(node, compute, project, async_run):
|
|||||||
compute.post = AsyncioMagicMock()
|
compute.post = AsyncioMagicMock()
|
||||||
|
|
||||||
async_run(node.reload())
|
async_run(node.reload())
|
||||||
compute.post.assert_called_with("/projects/{}/vpcs/nodes/{}/reload".format(node.project.id, node.id))
|
compute.post.assert_called_with("/projects/{}/vpcs/nodes/{}/reload".format(node.project.id, node.id), timeout=240)
|
||||||
|
|
||||||
|
|
||||||
def test_create_without_console(node, compute, project, async_run):
|
def test_create_without_console(node, compute, project, async_run):
|
||||||
|
Loading…
Reference in New Issue
Block a user