mirror of
https://github.com/retspen/webvirtcloud
synced 2026-11-08 19:26:48 +00:00
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.
56 lines
1.9 KiB
Python
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()
|