diff --git a/gns3server/compute/virtualbox/virtualbox_vm.py b/gns3server/compute/virtualbox/virtualbox_vm.py index a2b73b01..be62168c 100644 --- a/gns3server/compute/virtualbox/virtualbox_vm.py +++ b/gns3server/compute/virtualbox/virtualbox_vm.py @@ -27,6 +27,7 @@ import tempfile import json import socket import asyncio +import xml.etree.ElementTree as ET from gns3server.utils import parse_version from gns3server.utils.telnet_server import TelnetServer @@ -162,8 +163,8 @@ class VirtualBoxVM(BaseNode): if self.linked_clone: if self.id and os.path.isdir(os.path.join(self.working_dir, self._vmname)): - vbox_file = os.path.join(self.working_dir, self._vmname, self._vmname + ".vbox") - yield from self.manager.execute("registervm", [vbox_file]) + self._patch_vm_uuid() + yield from self.manager.execute("registervm", [self._linked_vbox_file()]) yield from self._reattach_linked_hdds() else: yield from self._create_linked_clone() @@ -175,6 +176,18 @@ class VirtualBoxVM(BaseNode): if "memory" in vm_info: self._ram = int(vm_info["memory"]) + def _linked_vbox_file(self): + return os.path.join(self.working_dir, self._vmname, self._vmname + ".vbox") + + def _patch_vm_uuid(self): + """ + Fix the VM uuid in the case of linked clone + """ + tree = ET.parse(self._linked_vbox_file()) + machine = tree.getroot().find("{http://www.virtualbox.org/}Machine") + machine.set("uuid", "{" + self.id + "}") + tree.write(self._linked_vbox_file()) + @asyncio.coroutine def check_hw_virtualization(self): """ diff --git a/tests/compute/virtualbox/test_virtualbox_vm.py b/tests/compute/virtualbox/test_virtualbox_vm.py index 00efeb4e..9a5543ed 100644 --- a/tests/compute/virtualbox/test_virtualbox_vm.py +++ b/tests/compute/virtualbox/test_virtualbox_vm.py @@ -15,6 +15,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . +import os import pytest import asyncio from tests.utils import asyncio_patch @@ -67,3 +68,20 @@ def test_json(vm, tmpdir, project): project._path = str(tmpdir) vm._linked_clone = True assert vm.__json__()["node_directory"] is not None + + +def test_patch_vm_uuid(vm): + xml = """ + + + + + """ + os.makedirs(os.path.join(vm.working_dir, vm._vmname), exist_ok=True) + with open(vm._linked_vbox_file(), "w+") as f: + f.write(xml) + vm._linked_clone = True + vm._patch_vm_uuid() + with open(vm._linked_vbox_file()) as f: + c = f.read() + assert "{" + vm.id + "}" in c