mirror of
https://github.com/retspen/webvirtcloud
synced 2026-11-10 12:16:49 +00:00
fix(instances): a running VM's options and CPU edits keep the pending changes
On an active VM the options and CPU forms write the persistent definition but showed the running VM's title, description and vCPUs, so saving one posted the live values back over a pending change. They now read the persistent definition (get_vcpu, get_cur_vcpu, get_title and get_description take config=). Buttons in the settings and resize tabs that were disabled only by class get the disabled attribute: Enter in a field no longer submits a form the page shows as unavailable while the VM runs.
This commit is contained in:
parent
ea9424ee1f
commit
042530fbfd
8 changed files with 106 additions and 37 deletions
|
|
@ -446,13 +446,13 @@ class wvmInstance(wvmConnect):
|
|||
def get_uuid(self):
|
||||
return self.instance.UUIDString()
|
||||
|
||||
def get_vcpu(self):
|
||||
vcpu = util.get_xml_path(self._XMLDesc(0), "/domain/vcpu")
|
||||
def get_vcpu(self, config=False):
|
||||
vcpu = util.get_xml_path(self._XMLDesc(PERSISTENT_XML if config else 0), "/domain/vcpu")
|
||||
return int(vcpu)
|
||||
|
||||
def get_cur_vcpu(self):
|
||||
cur_vcpu = util.get_xml_path(self._XMLDesc(0), "/domain/vcpu/@current")
|
||||
return int(cur_vcpu) if cur_vcpu else self.get_vcpu()
|
||||
def get_cur_vcpu(self, config=False):
|
||||
cur_vcpu = util.get_xml_path(self._XMLDesc(PERSISTENT_XML if config else 0), "/domain/vcpu/@current")
|
||||
return int(cur_vcpu) if cur_vcpu else self.get_vcpu(config)
|
||||
|
||||
def get_arch(self):
|
||||
return util.get_xml_path(self._XMLDesc(0), "/domain/os/type/@arch")
|
||||
|
|
@ -497,8 +497,8 @@ class wvmInstance(wvmConnect):
|
|||
mem = util.get_xml_path(self._XMLDesc(0), "/domain/currentMemory")
|
||||
return int(mem) // 1024
|
||||
|
||||
def get_title(self):
|
||||
title = util.get_xml_path(self._XMLDesc(0), "/domain/title")
|
||||
def get_title(self, config=False):
|
||||
title = util.get_xml_path(self._XMLDesc(PERSISTENT_XML if config else 0), "/domain/title")
|
||||
return title or ""
|
||||
|
||||
def get_filterrefs(self):
|
||||
|
|
@ -512,8 +512,8 @@ class wvmInstance(wvmConnect):
|
|||
|
||||
return util.get_xml_path(self._XMLDesc(0), func=filterrefs)
|
||||
|
||||
def get_description(self):
|
||||
description = util.get_xml_path(self._XMLDesc(0), "/domain/description")
|
||||
def get_description(self, config=False):
|
||||
description = util.get_xml_path(self._XMLDesc(PERSISTENT_XML if config else 0), "/domain/description")
|
||||
return description or ""
|
||||
|
||||
def get_max_memory(self):
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
"""Device edits of a VM: each definition is changed as it describes the
|
||||
device, every NIC type can be a boot device, posted values stay values, and
|
||||
definition changes go through _defineXML, a QoS edit keeps the floor. An active VM's memory is resized
|
||||
definition changes go through _defineXML, a QoS edit keeps the floor, and the CPU, title and description are read from either definition. An active VM's memory is resized
|
||||
by balloon, a stopped one's in its definition. Enabling vCPU hot plug keeps
|
||||
the vCPUs enabled at boot."""
|
||||
|
||||
|
|
@ -18,7 +18,7 @@ from vrtManager import util
|
|||
from vrtManager.instance import PERSISTENT_XML, wvmInstance
|
||||
from libvirt import VIR_DOMAIN_AFFECT_CONFIG, VIR_DOMAIN_AFFECT_LIVE
|
||||
|
||||
PERSISTENT = """<domain><os><type>hvm</type></os><devices>
|
||||
PERSISTENT = """<domain><title>pending</title><vcpu current='2'>4</vcpu><os><type>hvm</type></os><devices>
|
||||
<disk type='file' device='disk'><source file='/pool/a.qcow2'/><target dev='vda' bus='virtio'/></disk>
|
||||
<disk type='file' device='disk'><source file='/pool/b.qcow2'/><target dev='vdb' bus='virtio'/></disk>
|
||||
<interface type='bridge'><mac address='52:54:10:00:00:02'/><source bridge='br0'/></interface>
|
||||
|
|
@ -26,7 +26,7 @@ PERSISTENT = """<domain><os><type>hvm</type></os><devices>
|
|||
<bandwidth><inbound average='1' peak='2' burst='3' floor='4'/></bandwidth></interface>
|
||||
<video><model type='vga'/></video>
|
||||
</devices></domain>"""
|
||||
LIVE = """<domain><devices>
|
||||
LIVE = """<domain><vcpu>1</vcpu><devices>
|
||||
<disk type='file' device='disk'><source file='/pool/a.qcow2'/><target dev='vda' bus='virtio'/><alias name='virtio-disk0'/></disk>
|
||||
</devices></domain>"""
|
||||
|
||||
|
|
@ -115,6 +115,11 @@ class DeviceEditsTestCase(unittest.TestCase):
|
|||
inbound = defined(p).find("devices/interface[@type='network']/bandwidth/inbound")
|
||||
self.assertEqual(inbound.attrib, {"average": "10", "peak": "20", "burst": "30", "floor": "4"})
|
||||
|
||||
def test_cpu_title_and_description_are_read_from_either_definition(self):
|
||||
p = proxy()
|
||||
self.assertEqual((p.get_vcpu(), p.get_cur_vcpu(), p.get_title(), p.get_description()), (1, 1, "", ""))
|
||||
self.assertEqual((p.get_vcpu(config=True), p.get_cur_vcpu(config=True), p.get_title(config=True)), (4, 2, "pending"))
|
||||
|
||||
def test_the_default_nic_model_leaves_the_choice_to_libvirt(self):
|
||||
p = proxy()
|
||||
p.change_network("52:54:10:00:00:01", "52:54:10:00:00:01", "default", "net", "default", "")
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue