diff --git a/instances/test_disk_isolation.py b/instances/test_disk_isolation.py index ae03b011..951551a8 100644 --- a/instances/test_disk_isolation.py +++ b/instances/test_disk_isolation.py @@ -304,3 +304,14 @@ class DiskViewsTenantIsolationTestCase(TestCase): "bus": "virtio", "cache": "default"}, ) mock_create.return_value.create_volume.assert_not_called() + + def test_edit_volume_accepts_a_disk_without_any_driver_format(self): + self.client.force_login(self.superuser) + no_format_disk = dict(VM_DISK, format=None) + with patch("instances.models.wvmInstance") as mock_wvm: + proxy = mock_wvm.return_value + self._mock_disk_options(proxy) + proxy.get_disk_devices.return_value = [no_format_disk] + self._edit_volume_post(vol_format="None") + proxy.edit_disk.assert_called_once() + self.assertEqual(proxy.edit_disk.call_args[0][6], "") diff --git a/instances/views.py b/instances/views.py index 1813238f..75c85eee 100755 --- a/instances/views.py +++ b/instances/views.py @@ -985,7 +985,8 @@ def edit_volume(request, pk): io=io, discard=discard, zeroes=zeroes, - format=format, + # "": the disk has no driver type and keeps having none. + format=format or None, serial=serial, ) if target_dev not in [disk["dev"] for disk in instance.disks]: diff --git a/vrtManager/instance.py b/vrtManager/instance.py index cf5162a1..6c418d7d 100644 --- a/vrtManager/instance.py +++ b/vrtManager/instance.py @@ -913,12 +913,12 @@ class wvmInstance(wvmConnect): additionals += f"detect_zeroes='{detect_zeroes_mode}' " xml_disk = f"" + # A disk without a driver type keeps having none. + type_attr = f"type='{format}' " if format else "" if old_disk_device == "cdrom": - xml_disk += f"" + xml_disk += f"" elif old_disk_device == "disk": - xml_disk += ( - f"" - ) + xml_disk += f"" if disk_el.get("type") == "file": xml_disk += f"" diff --git a/vrtManager/test_xml_safety.py b/vrtManager/test_xml_safety.py index 32b1369a..91d3ac13 100644 --- a/vrtManager/test_xml_safety.py +++ b/vrtManager/test_xml_safety.py @@ -304,3 +304,22 @@ class TestChangeDiskBus(unittest.TestCase): self.assertEqual(disk.find("source").get("name"), "pool/vm-disk") self.assertEqual(disk.find("source/host").get("name"), "mon1") self.assertEqual(disk.find("auth/secret").get("uuid"), "aaaa") + + def test_edit_disk_without_format_omits_the_driver_type(self): + from lxml import etree + + inst = wvmInstance.__new__(wvmInstance) + inst.instance = MagicMock() + inst._XMLDesc = MagicMock( + return_value=( + "" + "" + "" + ) + ) + inst.edit_disk( + "vda", "/images/vm.img", False, False, "virtio", "", "", + "default", "default", "default", "default", + ) + disk = etree.fromstring(inst.instance.updateDeviceFlags.call_args[0][0]) + self.assertIsNone(disk.find("driver").get("type"))