1
0
Fork 0
mirror of https://github.com/retspen/webvirtcloud synced 2026-11-08 11:16:47 +00:00

fix(instances): an ISO already in a CD-ROM of the VM is not added again

A CD-ROM form sent twice (a double click, a resent request) added a
second drive with the same ISO. The form is refused when the ISO is in a
CD-ROM of the VM's running or persistent definition; an empty drive may
still be added more than once. tr and zh too.
This commit is contained in:
catborise 2026-11-05 18:43:09 +03:00
parent d15842a250
commit be68009432
6 changed files with 645 additions and 617 deletions

View file

@ -60,3 +60,16 @@ class DuplicateDeviceTests(TestCase):
self.assertEqual(self.post("add_network", form),
[f"The VM already has a network device with MAC {MAC.upper()}"])
self.proxy.add_network.assert_called_once()
def test_an_iso_in_a_cdrom_of_the_vm_is_not_added_again(self):
iso = "/var/lib/libvirt/isos/alma.iso"
self.proxy.get_iso_path.return_value = iso
with patch("instances.views.cdrom_bus_choices", return_value=["sata"]):
form = {"bus": "sata", "media": "alma.iso"}
self.post("add_cdrom", form)
self.proxy.attach_disk.assert_called_once()
self.proxy.get_media_devices.side_effect = lambda config=False: [{"path": iso, "dev": "sdb"}] if config else []
self.assertEqual(self.post("add_cdrom", form), ["alma.iso is already in a CD-ROM of this VM"])
# an empty drive may be added more than once
self.post("add_cdrom", {"bus": "sata", "media": ""})
self.assertEqual(self.proxy.attach_disk.call_count, 2)

View file

@ -1626,6 +1626,11 @@ def add_cdrom(request, pk):
if bus == "usb" and not image:
messages.error(request, _("A USB CD-ROM needs an ISO image: libvirt has no empty USB drive"))
return _back(request, pk, "disks")
path = instance.proxy.get_iso_path(image) if image else ""
# a form sent twice (a double click) adds the drive once
if path and path in {media["path"] for media in instance.media + instance.config_media}:
messages.error(request, _("%(image)s is already in a CD-ROM of this VM") % {"image": image})
return _back(request, pk, "disks")
target = utils.get_new_disk_dev(
instance.media + instance.config_media, instance.disks + instance.config_disks, bus
@ -1634,7 +1639,7 @@ def add_cdrom(request, pk):
with audit_vm(request, instance, f"add CD-ROM {target}" + (f" with {image}" if image else "")):
instance.proxy.attach_disk(
target,
instance.proxy.get_iso_path(image) if image else "",
path,
disk_device="cdrom",
cache_mode="none",
target_bus=bus,

Binary file not shown.

File diff suppressed because it is too large Load diff

Binary file not shown.

File diff suppressed because it is too large Load diff