diff --git a/gns3server/modules/virtualbox/virtualbox_vm.py b/gns3server/modules/virtualbox/virtualbox_vm.py index c0f8ce3b..887095ae 100644 --- a/gns3server/modules/virtualbox/virtualbox_vm.py +++ b/gns3server/modules/virtualbox/virtualbox_vm.py @@ -74,7 +74,7 @@ class VirtualBoxVM(BaseVM): def __json__(self): - return {"name": self.name, + json = {"name": self.name, "vm_id": self.id, "console": self.console, "project_id": self.project.id, @@ -86,6 +86,11 @@ class VirtualBoxVM(BaseVM): "adapter_type": self.adapter_type, "ram": self.ram, "use_any_adapter": self.use_any_adapter} + if self._linked_clone: + json["vm_directory"] = self.working_dir + else: + json["vm_directory"] = None + return json @asyncio.coroutine def _get_system_properties(self): diff --git a/gns3server/modules/vmware/vmware_vm.py b/gns3server/modules/vmware/vmware_vm.py index 500b359a..302e4c63 100644 --- a/gns3server/modules/vmware/vmware_vm.py +++ b/gns3server/modules/vmware/vmware_vm.py @@ -78,11 +78,11 @@ class VMwareVM(BaseVM): self._use_any_adapter = False if not os.path.exists(vmx_path): - raise VMwareError('VMware VM "{name}" [{id}]: could not find VMX file "{}"'.format(name, vmx_path)) + raise VMwareError('VMware VM "{name}" [{id}]: could not find VMX file "{vmx_path}"'.format(name=name, id=vm_id, vmx_path=vmx_path)) def __json__(self): - return {"name": self.name, + json = {"name": self.name, "vm_id": self.id, "console": self.console, "project_id": self.project.id, @@ -93,6 +93,11 @@ class VMwareVM(BaseVM): "adapters": self._adapters, "adapter_type": self.adapter_type, "use_any_adapter": self.use_any_adapter} + if self._linked_clone: + json["vm_directory"] = self.working_dir + else: + json["vm_directory"] = None + return json @property def vmnets(self): diff --git a/gns3server/schemas/virtualbox.py b/gns3server/schemas/virtualbox.py index b91e3736..762acce4 100644 --- a/gns3server/schemas/virtualbox.py +++ b/gns3server/schemas/virtualbox.py @@ -191,6 +191,10 @@ VBOX_OBJECT_SCHEMA = { "type": "string", "minLength": 1, }, + "vm_directory": { + "decription": "Path to the VM working directory", + "type": ["string", "null"] + }, "enable_remote_console": { "description": "enable the remote console", "type": "boolean" @@ -232,5 +236,5 @@ VBOX_OBJECT_SCHEMA = { }, }, "additionalProperties": False, - "required": ["name", "vm_id", "project_id"] + "required": ["name", "vm_id", "project_id", "vm_directory"] } diff --git a/gns3server/schemas/vmware.py b/gns3server/schemas/vmware.py index bd7b5e18..84bd6e60 100644 --- a/gns3server/schemas/vmware.py +++ b/gns3server/schemas/vmware.py @@ -149,6 +149,10 @@ VMWARE_OBJECT_SCHEMA = { "maxLength": 36, "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$" }, + "vm_directory": { + "decription": "Path to the VM working directory", + "type": ["string", "null"] + }, "project_id": { "description": "Project UUID", "type": "string", diff --git a/tests/modules/virtualbox/test_virtualbox_vm.py b/tests/modules/virtualbox/test_virtualbox_vm.py index 58540e49..3144d1a9 100644 --- a/tests/modules/virtualbox/test_virtualbox_vm.py +++ b/tests/modules/virtualbox/test_virtualbox_vm.py @@ -60,3 +60,10 @@ def test_vm_adapter_add_nio_binding_adapter_not_exist(loop, vm, manager, free_co nio = manager.create_nio(manager.vboxmanage_path, {"type": "nio_udp", "lport": free_console_port, "rport": free_console_port, "rhost": "192.168.1.2"}) with pytest.raises(VirtualBoxError): loop.run_until_complete(asyncio.async(vm.adapter_add_nio_binding(15, nio))) + + +def test_json(vm, tmpdir, project): + assert vm.__json__()["vm_directory"] is None + project._path = str(tmpdir) + vm._linked_clone = True + assert vm.__json__()["vm_directory"] is not None diff --git a/tests/modules/vmware/test_vmware_vm.py b/tests/modules/vmware/test_vmware_vm.py new file mode 100644 index 00000000..ef0cb893 --- /dev/null +++ b/tests/modules/vmware/test_vmware_vm.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2015 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +import pytest +import asyncio +from tests.utils import asyncio_patch + +from gns3server.modules.vmware.vmware_vm import VMwareVM +from gns3server.modules.vmware.vmware_error import VMwareError +from gns3server.modules.vmware import VMware + + +@pytest.fixture(scope="module") +def manager(port_manager): + m = VMware.instance() + m.port_manager = port_manager + return m + + +@pytest.fixture(scope="function") +def vm(project, manager, tmpdir): + fake_vmx = str(tmpdir / "test.vmx") + open(fake_vmx, "w+").close() + + return VMwareVM("test", "00010203-0405-0607-0809-0a0b0c0d0e0f", project, manager, fake_vmx, False) + + +def test_vm(project, manager, vm): + assert vm.name == "test" + assert vm.id == "00010203-0405-0607-0809-0a0b0c0d0e0f" + + +def test_json(vm, tmpdir, project): + assert vm.__json__()["vm_directory"] is None + project._path = str(tmpdir) + vm._linked_clone = True + assert vm.__json__()["vm_directory"] is not None