"""The VM page's device getters read each device on its own: a value of one NIC, CD-ROM or boot device does not carry over to the next.""" import unittest from unittest.mock import MagicMock from libvirt import libvirtError from vrtManager.instance import wvmInstance XML = """ hvm """ def proxy(): p = wvmInstance.__new__(wvmInstance) # no connection: only these calls p._XMLDesc = lambda flags: XML volumes = {"/iso/x.iso": ("x.iso", "iso")} def volume(path): if path not in volumes: raise libvirtError("no volume") name, pool = volumes[path] return MagicMock(**{"name.return_value": name, "info.return_value": [0, 10, 4], "storagePoolLookupByVolume.return_value.name.return_value": pool}) p.get_volume_by_path = volume return p class DeviceGettersTestCase(unittest.TestCase): def test_a_nic_without_qos_source_or_model_has_none(self): nics = proxy().get_net_devices() self.assertEqual(nics[0]["inbound"], {"average": "100", "peak": "200", "burst": "300"}) self.assertEqual(nics[0]["outbound"], {"average": "10", "peak": "20", "burst": "30"}) self.assertEqual([(n["inbound"], n["outbound"]) for n in nics[1:]], [([], [])] * 2) self.assertEqual([(n["nic"], n["model"]) for n in nics], [("default", "virtio"), ("br0", ""), ("", "")]) def test_a_disk_no_pool_holds_has_the_size_libvirt_reads(self): p = proxy() p.instance = MagicMock() # vda: libvirt reads it, by its path; vdb: it cannot p.instance.blockInfo.side_effect = lambda path: [20 << 30, 5 << 30, 20 << 30] if path == "/pool/a.qcow2" else \ (_ for _ in ()).throw(libvirtError("cannot read")) self.assertEqual([(d["dev"], d["size"], d["used"]) for d in p.get_disk_devices()], [("vda", 20 << 30, 5 << 30), ("vdb", None, None)]) def test_an_empty_cdrom_shows_no_pool(self): media = proxy().get_media_devices() self.assertEqual( media, [ {"dev": "sda", "image": "x.iso", "storage": "iso", "path": "/iso/x.iso", "bus": "sata"}, {"dev": "sdb", "image": None, "storage": None, "path": None, "bus": "sata"}, ], ) def test_every_boot_device_has_its_target(self): order = proxy().get_bootorder() self.assertEqual( [order[i]["target"] for i in range(4)], ["52:54:10:00:00:02", "52:54:10:00:00:03", "vda", "vdb"], ) class RefreshInstancePoolsTestCase(unittest.TestCase): def test_only_pools_holding_a_disk_are_refreshed(self): p = proxy() p.get_disk_devices = lambda: [{"path": "/pool/a.qcow2"}, {"path": "/elsewhere/b.img"}, {"path": None}] pool = MagicMock() p.get_wvmStorages = lambda: MagicMock(get_pool_by_target=lambda target: pool if target == "/pool" else None) p.refresh_instance_pools() pool.refresh.assert_called_once_with(0)