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