mirror of
https://github.com/retspen/webvirtcloud
synced 2026-11-08 11:16:47 +00:00
131 test modules sat next to the code they test; instances alone had 51 of them beside views.py and utils.py. They move into a tests/ package per app, and the JavaScript checks into webvirtcloud/tests/js. Each non-empty tests.py becomes tests/test_views.py; the empty generated stubs are removed. Imports of the app's own modules become absolute, paths built from __file__ go one level up, the live helper is instances.tests.livetest, and coverage omits */tests/*. The suite discovers the same 960 tests as before.
86 lines
3.5 KiB
Python
86 lines
3.5 KiB
Python
"""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 instances/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 . 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"<volume><name>{P}{name}.{fmt}</name><capacity unit='MiB'>64</capacity>"
|
|
f"<target><format type='{fmt}'/></target></volume>",
|
|
0,
|
|
)
|
|
dom = self.conn.defineXML(
|
|
f"<domain type='kvm'><name>{P}{name}</name><memory unit='MiB'>128</memory><vcpu>1</vcpu>"
|
|
"<os><type arch='x86_64' machine='q35'>hvm</type></os><features><acpi/></features><devices>"
|
|
f"<disk type='file' device='disk'><driver name='qemu' type='{fmt}'/>"
|
|
f"<source file='{vol.path()}'/><target dev='vda' bus='virtio'/></disk></devices></domain>"
|
|
)
|
|
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)
|