diff --git a/tests/test_vm_manager_cluster.py b/tests/test_vm_manager_cluster.py
index 26c083b..c513d65 100644
--- a/tests/test_vm_manager_cluster.py
+++ b/tests/test_vm_manager_cluster.py
@@ -252,11 +252,19 @@ def test_name_replaced(self):
result = vmc._create_xml(xml, "myvm")
assert "myvm" in result
- def test_uuid_replaced(self):
+ def test_uuid_preserved_when_provided(self):
xml = _read_test_xml()
result = vmc._create_xml(xml, "myvm")
- assert "7b48b1fe-066a-41a6-aef4-f0a9c028f719" not in result
+ assert "7b48b1fe-066a-41a6-aef4-f0a9c028f719" in result
+
+ def test_uuid_generated_when_not_provided(self):
+ xml = _read_test_xml()
+ xml = xml.replace(
+ "7b48b1fe-066a-41a6-aef4-f0a9c028f719", ""
+ )
+ result = vmc._create_xml(xml, "myvm")
assert "" in result
+ assert "7b48b1fe-066a-41a6-aef4-f0a9c028f719" not in result
def test_rbd_disk_added(self):
xml = _read_test_xml()
diff --git a/tests/test_vm_manager_libvirt.py b/tests/test_vm_manager_libvirt.py
index eeb1301..5804d36 100644
--- a/tests/test_vm_manager_libvirt.py
+++ b/tests/test_vm_manager_libvirt.py
@@ -19,13 +19,22 @@ def test_name_replaced(self, vm_xml_path):
result = vml._create_xml(xml, "myvm")
assert "myvm" in result
- def test_uuid_replaced(self, vm_xml_path):
+ def test_uuid_preserved_when_provided(self, vm_xml_path):
with open(vm_xml_path) as f:
xml = f.read()
result = vml._create_xml(xml, "myvm")
- # Original UUID should be gone
- assert "7b48b1fe-066a-41a6-aef4-f0a9c028f719" not in result
+ assert "7b48b1fe-066a-41a6-aef4-f0a9c028f719" in result
+
+ def test_uuid_generated_when_not_provided(self, vm_xml_path):
+ with open(vm_xml_path) as f:
+ xml = f.read()
+ # Remove the uuid element from the XML
+ xml = xml.replace(
+ "7b48b1fe-066a-41a6-aef4-f0a9c028f719", ""
+ )
+ result = vml._create_xml(xml, "myvm")
assert "" in result
+ assert "7b48b1fe-066a-41a6-aef4-f0a9c028f719" not in result
class TestCreate:
diff --git a/vm_manager/vm_manager_cluster.py b/vm_manager/vm_manager_cluster.py
index 17e1477..1c00182 100644
--- a/vm_manager/vm_manager_cluster.py
+++ b/vm_manager/vm_manager_cluster.py
@@ -113,13 +113,18 @@ def _create_xml(xml, vm_name, target_disk_bus="virtio"):
xml_root = ElementTree.fromstring(xml)
try:
xml_root.remove(xml_root.findall("./name")[0])
- xml_root.remove(xml_root.findall("./uuid")[0])
except IndexError:
pass
+ existing_uuid = xml_root.findall("./uuid")
+ if not existing_uuid or not existing_uuid[0].text:
+ try:
+ xml_root.remove(existing_uuid[0])
+ except IndexError:
+ pass
+ uuid_element = ElementTree.SubElement(xml_root, "uuid")
+ uuid_element.text = str(uuid.uuid4())
name_element = ElementTree.SubElement(xml_root, "name")
name_element.text = vm_name
- name_element = ElementTree.SubElement(xml_root, "uuid")
- name_element.text = str(uuid.uuid4())
rbd_secret = None
hosts_list = _get_ceph_hosts_xml()
with LibVirtManager() as libvirt_manager:
@@ -429,6 +434,12 @@ def add_to_cluster(vm_options_with_nones):
raise Exception(
"Could not determine disk image path from VM " + src_name
)
+ # Remove UUID when renaming to avoid conflicts with the source VM
+ if target_name != src_name:
+ existing_uuid = xml_root.find("uuid")
+ if existing_uuid is not None:
+ xml_root.remove(existing_uuid)
+
clean_xml = ElementTree.tostring(xml_root, encoding="unicode")
# If keeping the same name, remove from libvirt first to avoid conflicts
diff --git a/vm_manager/vm_manager_libvirt.py b/vm_manager/vm_manager_libvirt.py
index 8cb2f8d..93b57cf 100644
--- a/vm_manager/vm_manager_libvirt.py
+++ b/vm_manager/vm_manager_libvirt.py
@@ -30,13 +30,18 @@ def _create_xml(xml, vm_name):
xml_root = ElementTree.fromstring(xml)
try:
xml_root.remove(xml_root.findall("./name")[0])
- xml_root.remove(xml_root.findall("./uuid")[0])
except IndexError:
pass
+ existing_uuid = xml_root.findall("./uuid")
+ if not existing_uuid or not existing_uuid[0].text:
+ try:
+ xml_root.remove(existing_uuid[0])
+ except IndexError:
+ pass
+ uuid_element = ElementTree.SubElement(xml_root, "uuid")
+ uuid_element.text = str(uuid.uuid4())
name_element = ElementTree.SubElement(xml_root, "name")
name_element.text = vm_name
- name_element = ElementTree.SubElement(xml_root, "uuid")
- name_element.text = str(uuid.uuid4())
return ElementTree.tostring(xml_root).decode()