mirror of
https://github.com/retspen/webvirtcloud
synced 2026-11-08 19:26:48 +00:00
Plan reviewed with Codex; libvirt's behaviour checked on a host. - A filter is not deleted while a VM's interface references it, as the VM runs or as saved for its next boot (a stopped VM too), or while another filter references it: libvirt refuses only one a running VM uses, and a VM using a filter that references a deleted one does not start. The VMs are read from one listing, one or two XML reads each, instead of a connection per VM; the refusal names them. - Create refuses a name or UUID the host has, clone a name in use or one outside the panel's names, and editing the XML must keep the filter's name and UUID: each would replace another filter or make a copy. Entered XML is read for these checks without expanding entities or taking a DTD (util.parse_xml, shared with the network editor), and a rule is one <rule> element. - A rule or reference is deleted only while it reads as the page showed it, not by index and three attributes: a rule alike in those or a filter changed meanwhile loses nothing. - A reference is added only to another filter of the host not referenced yet; the picker offers those. - References keep their parameters, in order (a name may repeat); a rule shows every protocol element it has, a rule without one too. - One change a POST (two would both start from the page's reading, the second undoing the first); every change redirects and reports its refusal as a message, a POST for a filter gone meanwhile going to the list; the catch-all that showed any error goes, and so does wvmInstance.get_filterrefs, which only the old delete check used. The list reads each filter's XML once from one listing; a filter's page reads its XML once and only the other filters' names; the per-filter XML dialog of the list goes (a filter's page shows its XML). The XML editors send their text untouched too.
47 lines
1.7 KiB
Python
47 lines
1.7 KiB
Python
"""Values from requests do not change the XPath queries they are used in."""
|
|
|
|
import unittest
|
|
from unittest.mock import Mock
|
|
|
|
from django.conf import settings
|
|
|
|
if not settings.configured:
|
|
settings.configure(MAC_OUI="52:54:10")
|
|
|
|
from vrtManager.connection import wvmConnect
|
|
from vrtManager.network import wvmNetwork
|
|
|
|
CAPS = """<capabilities><guest><arch name='x86_64'><wordsize>64</wordsize><emulator>/usr/bin/qemu-x86</emulator>
|
|
<machine canonical='pc-q35'>q35</machine></arch>
|
|
<arch name='aarch64'><emulator>/usr/bin/qemu-arm</emulator><machine>virt</machine></arch></guest></capabilities>"""
|
|
|
|
class FakeConn:
|
|
def __init__(self):
|
|
self.defined = None
|
|
|
|
def networkDefineXML(self, xml):
|
|
self.defined = xml
|
|
|
|
|
|
class XPathValueTests(unittest.TestCase):
|
|
def setUp(self):
|
|
self.conn = wvmConnect.__new__(wvmConnect)
|
|
self.conn.get_cap_xml = lambda: CAPS
|
|
|
|
def test_arch_lookups(self):
|
|
self.assertEqual(self.conn.get_emulator("x86_64"), "/usr/bin/qemu-x86")
|
|
self.assertEqual(self.conn.get_machine_types("aarch64"), ["virt"])
|
|
injected = "nope' or '1'='1"
|
|
self.assertIsNone(self.conn.get_emulator(injected))
|
|
self.assertEqual(self.conn.get_machine_types(injected), [])
|
|
self.assertEqual(self.conn.get_capabilities(injected), {})
|
|
|
|
def test_qos_direction_must_be_known(self):
|
|
net = wvmNetwork.__new__(wvmNetwork)
|
|
net.wvm = FakeConn()
|
|
net.net = Mock(**{"XMLDesc.return_value": "<network><bandwidth><inbound average='1'/><outbound average='2'/></bandwidth></network>"})
|
|
with self.assertRaises(ValueError):
|
|
net.unset_qos("*")
|
|
net.unset_qos("inbound")
|
|
self.assertNotIn("inbound", net.wvm.defined)
|
|
self.assertIn("outbound", net.wvm.defined)
|