"""Live checks that a disk grows while its VM runs or is paused.
QEMU holds a running domain's image, so the size goes through blockResize;
the guest and the volume must both see it, and the persistent definition
stays as it was. Runs only with TEST_LIBVIRT_HOST set (see vrtManager/tests/livetest.py).
"""
import os
import unittest
import libvirt
from django.test import SimpleTestCase
from vrtManager.connection import connection_manager
from vrtManager.instance import wvmInstance
from vrtManager.tests import livetest
P = livetest.PREFIX
PERSISTENT = libvirt.VIR_DOMAIN_XML_INACTIVE | libvirt.VIR_DOMAIN_XML_SECURE
class LiveDiskResizeTestCase(SimpleTestCase):
@classmethod
def setUpClass(cls):
if not livetest.enabled():
raise unittest.SkipTest("Set TEST_LIBVIRT_HOST to run the live libvirt tests")
cls.args = (
os.environ["TEST_LIBVIRT_HOST"],
os.environ.get("TEST_LIBVIRT_LOGIN", ""),
os.environ.get("TEST_LIBVIRT_PASSWORD", ""),
int(os.environ.get("TEST_LIBVIRT_TYPE", 4)),
)
cls.conn = connection_manager.get_connection(*cls.args)
livetest.cleanup(cls.conn)
livetest.ensure_pool(cls.conn)
cls.inventory = livetest.inventory(cls.conn)
super().setUpClass()
@classmethod
def tearDownClass(cls):
try:
livetest.remove_pool(cls.conn)
finally:
super().tearDownClass()
if livetest.inventory(cls.conn) != cls.inventory:
raise AssertionError("Live tests changed objects outside the test namespace")
def tearDown(self):
livetest.cleanup(self.conn)
def vm(self, name, fmt):
pool = self.conn.storagePoolLookupByName(livetest.POOL)
vol = pool.createXML(
f"{P}{name}.{fmt}64"
f"",
0,
)
dom = self.conn.defineXML(
f"{P}{name}1281"
"hvm"
f""
f""
)
return dom, vol, wvmInstance(*self.args, f"{P}{name}")
def test_a_disk_grows_while_the_vm_runs_or_is_paused(self):
new_size = 96 << 20
for state in ("running", "paused"):
for fmt in ("qcow2", "raw"):
with self.subTest(state=state, fmt=fmt):
try:
dom, vol, vm = self.vm(f"resize-{state}-{fmt}", fmt)
dom.create()
if state == "paused":
dom.suspend()
before = dom.XMLDesc(PERSISTENT)
disk = vm.get_disk_devices()[0]
vm.resize_disk([{"path": disk["path"], "size_new": new_size}])
self.assertEqual(dom.blockInfo(disk["path"])[0], new_size, "the guest's disk")
self.assertEqual(vol.info()[1], new_size, "the volume")
self.assertEqual(dom.XMLDesc(PERSISTENT), before)
self.assertEqual(dom.state()[0], libvirt.VIR_DOMAIN_PAUSED if state == "paused" else libvirt.VIR_DOMAIN_RUNNING)
finally:
livetest.cleanup(self.conn)