mirror of
https://github.com/retspen/webvirtcloud
synced 2026-11-09 03:36:48 +00:00
fix(instances): disk and agent channel changes on paused VMs
attach_disk (new or existing volume, CD-ROM), add_guest_agent and remove_guest_agent acted only when the status was running (1) or shut off (5). On a paused VM they changed neither definition and the request reported success. They now use the same rule as the NIC edits: the running definition while the VM is active, paused included, and the persistent one always. remove_guest_agent reads each definition from its own XML, so a channel present only in the persistent one is removed too. Unit tests check paused, running and stopped VMs (paused fails on the previous code). The live effects test adds attach_disk and add_guest_agent, and now also checks that edits meant for the running VM reach it, which showed that an ejected CD-ROM keeps an empty <source> in the live XML; NIC unplug is left to the guest tests, as these VMs have no OS to acknowledge it.
This commit is contained in:
parent
9931b73b2c
commit
16e1a334d0
3 changed files with 69 additions and 22 deletions
|
|
@ -831,11 +831,8 @@ class wvmInstance(wvmConnect):
|
|||
if serial is not None and serial != "None" and serial != "":
|
||||
xml_disk += f"""<serial>{serial}</serial>"""
|
||||
xml_disk += """</disk>"""
|
||||
if self.get_status() == 1:
|
||||
self.instance.attachDeviceFlags(xml_disk, VIR_DOMAIN_AFFECT_LIVE)
|
||||
self.instance.attachDeviceFlags(xml_disk, VIR_DOMAIN_AFFECT_CONFIG)
|
||||
if self.get_status() == 5:
|
||||
self.instance.attachDeviceFlags(xml_disk, VIR_DOMAIN_AFFECT_CONFIG)
|
||||
for _, affect in self._definitions():
|
||||
self.instance.attachDeviceFlags(xml_disk, affect)
|
||||
|
||||
def detach_disk(self, target_dev):
|
||||
tree = etree.fromstring(self._XMLDesc(0))
|
||||
|
|
@ -1927,24 +1924,17 @@ class wvmInstance(wvmConnect):
|
|||
<target type='virtio' name='org.qemu.guest_agent.0'/>
|
||||
</channel>
|
||||
"""
|
||||
if self.get_status() == 1:
|
||||
self.instance.attachDeviceFlags(channel_xml, VIR_DOMAIN_AFFECT_LIVE)
|
||||
self.instance.attachDeviceFlags(channel_xml, VIR_DOMAIN_AFFECT_CONFIG)
|
||||
if self.get_status() == 5:
|
||||
self.instance.attachDeviceFlags(channel_xml, VIR_DOMAIN_AFFECT_CONFIG)
|
||||
for _, affect in self._definitions():
|
||||
self.instance.attachDeviceFlags(channel_xml, affect)
|
||||
|
||||
def remove_guest_agent(self):
|
||||
tree = etree.fromstring(self._XMLDesc(0))
|
||||
for target in tree.xpath(
|
||||
"/domain/devices/channel[@type='unix']/target[@name='org.qemu.guest_agent.0']"
|
||||
):
|
||||
parent = target.getparent()
|
||||
channel_xml = etree.tostring(parent).decode()
|
||||
if self.get_status() == 1:
|
||||
self.instance.detachDeviceFlags(channel_xml, VIR_DOMAIN_AFFECT_LIVE)
|
||||
self.instance.detachDeviceFlags(channel_xml, VIR_DOMAIN_AFFECT_CONFIG)
|
||||
if self.get_status() == 5:
|
||||
self.instance.detachDeviceFlags(channel_xml, VIR_DOMAIN_AFFECT_CONFIG)
|
||||
for xml_flags, affect in self._definitions():
|
||||
tree = etree.fromstring(self._XMLDesc(xml_flags))
|
||||
for target in tree.xpath(
|
||||
"/domain/devices/channel[@type='unix']/target[@name='org.qemu.guest_agent.0']"
|
||||
):
|
||||
channel_xml = etree.tostring(target.getparent()).decode()
|
||||
self.instance.detachDeviceFlags(channel_xml, affect)
|
||||
|
||||
def get_guest_agent(self):
|
||||
def _get_agent(doc):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue