1
0
Fork 0
mirror of https://github.com/retspen/webvirtcloud synced 2026-11-08 19:26:48 +00:00
webvirtcloud/vrtManager/test_iso_media.py
catborise 9f86330552 fix(instances): ISO mount/unmount for every VM state and CD-ROM
The old code edited the live XML, called attachDevice and redefined the
domain from it: a stopped VM lost its VNC password, a paused VM crashed
with UnboundLocalError, an unknown CD-ROM was silently ignored (on a
running VM the last disk of the loop could be updated instead), and a
missing ISO raised AttributeError.

Media changes now use updateDeviceFlags on the requested CD-ROM, built
from the live and the persistent definition separately. A CD-ROM
missing from one definition, an unknown ISO, an ISO name present in
more than one pool, or a change that reached only the running VM is
reported to the user. The mount and unmount log messages were swapped.
2026-10-04 01:08:11 +03:00

56 lines
1.9 KiB
Python

import unittest
from unittest.mock import MagicMock
from django.conf import settings
if not settings.configured:
settings.configure(MAC_OUI="52:54:10")
from libvirt import VIR_DOMAIN_AFFECT_CONFIG, VIR_DOMAIN_AFFECT_LIVE, libvirtError
from lxml import etree
from vrtManager.instance import wvmInstance
DOMAIN = """<domain><devices>
<disk type='file' device='cdrom'><driver name='qemu' type='raw'/><target dev='sda' bus='sata'/></disk>
<disk type='file' device='cdrom'><driver name='qemu' type='raw'/><target dev='sdb' bus='sata'/></disk>
</devices></domain>"""
def vm(active):
inst = wvmInstance.__new__(wvmInstance)
inst.instance = MagicMock()
inst.instance.isActive.return_value = active
inst._XMLDesc = MagicMock(return_value=DOMAIN)
return inst
class IsoMediaTestCase(unittest.TestCase):
"""R-12: media change goes through updateDeviceFlags for the right CD-ROM."""
def updates(self, inst):
return [
(etree.fromstring(c.args[0]).find("target").get("dev"), etree.fromstring(c.args[0]).xpath("string(source/@file)"), c.args[1])
for c in inst.instance.updateDeviceFlags.call_args_list
]
def test_stopped_vm_changes_only_the_persistent_definition(self):
inst = vm(active=False)
inst._set_cdrom_media("sdb", "/iso/a.iso")
self.assertEqual(self.updates(inst), [("sdb", "/iso/a.iso", VIR_DOMAIN_AFFECT_CONFIG)])
def test_running_vm_changes_live_then_persistent(self):
inst = vm(active=True)
inst._set_cdrom_media("sdb", None)
self.assertEqual(
self.updates(inst), [("sdb", "", VIR_DOMAIN_AFFECT_LIVE), ("sdb", "", VIR_DOMAIN_AFFECT_CONFIG)]
)
def test_unknown_cdrom_changes_nothing(self):
inst = vm(active=True)
with self.assertRaises(libvirtError):
inst._set_cdrom_media("sdz", "/iso/a.iso")
inst.instance.updateDeviceFlags.assert_not_called()
if __name__ == "__main__":
unittest.main()