mirror of
https://github.com/GNS3/gns3-server
synced 2025-05-04 16:19:01 +00:00
Delete VPCS
This commit is contained in:
parent
545a3d2b58
commit
e12e6044dc
@ -74,6 +74,7 @@ class VPCSHandler:
|
|||||||
r"/vpcs/{uuid}",
|
r"/vpcs/{uuid}",
|
||||||
status_codes={
|
status_codes={
|
||||||
200: "VPCS instance updated",
|
200: "VPCS instance updated",
|
||||||
|
404: "VPCS instance doesn't exist",
|
||||||
409: "Conflict"
|
409: "Conflict"
|
||||||
},
|
},
|
||||||
description="Update a VPCS instance",
|
description="Update a VPCS instance",
|
||||||
@ -87,9 +88,21 @@ class VPCSHandler:
|
|||||||
vm.console = request.json.get("console", vm.console)
|
vm.console = request.json.get("console", vm.console)
|
||||||
vm.script_file = request.json.get("script_file", vm.script_file)
|
vm.script_file = request.json.get("script_file", vm.script_file)
|
||||||
vm.startup_script = request.json.get("startup_script", vm.startup_script)
|
vm.startup_script = request.json.get("startup_script", vm.startup_script)
|
||||||
|
|
||||||
response.json(vm)
|
response.json(vm)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
@Route.delete(
|
||||||
|
r"/vpcs/{uuid}",
|
||||||
|
status_codes={
|
||||||
|
204: "VPCS instance updated",
|
||||||
|
404: "VPCS instance doesn't exist"
|
||||||
|
},
|
||||||
|
description="Delete a VPCS instance")
|
||||||
|
def delete(request, response):
|
||||||
|
|
||||||
|
yield from VPCS.instance().delete_vm(request.match_info["uuid"])
|
||||||
|
response.set_status(204)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@Route.post(
|
@Route.post(
|
||||||
r"/vpcs/{uuid}/start",
|
r"/vpcs/{uuid}/start",
|
||||||
|
@ -132,3 +132,18 @@ class BaseManager:
|
|||||||
vm.create()
|
vm.create()
|
||||||
self._vms[vm.uuid] = vm
|
self._vms[vm.uuid] = vm
|
||||||
return vm
|
return vm
|
||||||
|
|
||||||
|
@asyncio.coroutine
|
||||||
|
def delete_vm(self, uuid):
|
||||||
|
"""
|
||||||
|
Delete a VM
|
||||||
|
|
||||||
|
:param uuid: VM UUID
|
||||||
|
"""
|
||||||
|
|
||||||
|
vm = self.get_vm(uuid)
|
||||||
|
if asyncio.iscoroutinefunction(vm.destroy):
|
||||||
|
yield from vm.destroy()
|
||||||
|
else:
|
||||||
|
vm.destroy()
|
||||||
|
del self._vms[vm.uuid]
|
||||||
|
@ -82,7 +82,13 @@ class VPCSVM(BaseVM):
|
|||||||
self._console = self._manager.port_manager.get_free_console_port()
|
self._console = self._manager.port_manager.get_free_console_port()
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
|
self.destroy()
|
||||||
|
|
||||||
|
def destroy(self):
|
||||||
self._kill_process()
|
self._kill_process()
|
||||||
|
if self._console:
|
||||||
|
self._manager.port_manager.release_console_port(self._console)
|
||||||
|
self._console = None
|
||||||
|
|
||||||
@asyncio.coroutine
|
@asyncio.coroutine
|
||||||
def _check_requirements(self):
|
def _check_requirements(self):
|
||||||
|
@ -126,6 +126,13 @@ def test_vpcs_reload(server, vm):
|
|||||||
assert response.status == 204
|
assert response.status == 204
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpcs_delete(server, vm):
|
||||||
|
with asyncio_patch("gns3server.modules.vpcs.VPCS.delete_vm", return_value=True) as mock:
|
||||||
|
response = server.delete("/vpcs/{}".format(vm["uuid"]))
|
||||||
|
assert mock.called
|
||||||
|
assert response.status == 204
|
||||||
|
|
||||||
|
|
||||||
def test_vpcs_update(server, vm, tmpdir, free_console_port):
|
def test_vpcs_update(server, vm, tmpdir, free_console_port):
|
||||||
path = os.path.join(str(tmpdir), 'startup2.vpcs')
|
path = os.path.join(str(tmpdir), 'startup2.vpcs')
|
||||||
with open(path, 'w+') as f:
|
with open(path, 'w+') as f:
|
||||||
|
@ -177,3 +177,14 @@ def test_change_script_file(vm, tmpdir):
|
|||||||
path = os.path.join(str(tmpdir), 'startup2.vpcs')
|
path = os.path.join(str(tmpdir), 'startup2.vpcs')
|
||||||
vm.script_file = path
|
vm.script_file = path
|
||||||
assert vm.script_file == path
|
assert vm.script_file == path
|
||||||
|
|
||||||
|
|
||||||
|
def test_destroy(vm, port_manager):
|
||||||
|
with asyncio_patch("gns3server.modules.vpcs.vpcs_vm.VPCSVM._check_requirements", return_value=True):
|
||||||
|
with asyncio_patch("asyncio.create_subprocess_exec", return_value=MagicMock()):
|
||||||
|
vm.start()
|
||||||
|
port = vm.console
|
||||||
|
vm.destroy()
|
||||||
|
# Raise an exception if the port is not free
|
||||||
|
port_manager.reserve_console_port(port)
|
||||||
|
assert vm.is_running() is False
|
||||||
|
Loading…
Reference in New Issue
Block a user