Delete VPCS

This commit is contained in:
Julien Duponchelle 2015-01-22 11:34:10 +01:00
parent 545a3d2b58
commit e12e6044dc
5 changed files with 53 additions and 1 deletions

View File

@ -74,6 +74,7 @@ class VPCSHandler:
r"/vpcs/{uuid}",
status_codes={
200: "VPCS instance updated",
404: "VPCS instance doesn't exist",
409: "Conflict"
},
description="Update a VPCS instance",
@ -87,9 +88,21 @@ class VPCSHandler:
vm.console = request.json.get("console", vm.console)
vm.script_file = request.json.get("script_file", vm.script_file)
vm.startup_script = request.json.get("startup_script", vm.startup_script)
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
@Route.post(
r"/vpcs/{uuid}/start",

View File

@ -132,3 +132,18 @@ class BaseManager:
vm.create()
self._vms[vm.uuid] = 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]

View File

@ -82,7 +82,13 @@ class VPCSVM(BaseVM):
self._console = self._manager.port_manager.get_free_console_port()
def __del__(self):
self.destroy()
def destroy(self):
self._kill_process()
if self._console:
self._manager.port_manager.release_console_port(self._console)
self._console = None
@asyncio.coroutine
def _check_requirements(self):

View File

@ -126,6 +126,13 @@ def test_vpcs_reload(server, vm):
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):
path = os.path.join(str(tmpdir), 'startup2.vpcs')
with open(path, 'w+') as f:

View File

@ -177,3 +177,14 @@ def test_change_script_file(vm, tmpdir):
path = os.path.join(str(tmpdir), 'startup2.vpcs')
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