Remove devices/*/boot when setting bootdev

"boot" entries under "devices/*" are mutually exclusive with those
under "os". If such entries are present, vbmc fails when adding "boot"
entry under "os".

Closes-Bug: #1746983
Change-Id: I357d3b8a92ee764e6f47f564fdef54d3a79f0782
This commit is contained in:
Jacek Tomasiak 2018-02-02 13:53:09 +01:00
parent 0241fc9997
commit 0e74342899
2 changed files with 20 additions and 3 deletions

View File

@ -29,6 +29,14 @@ DOMAIN_XML_TEMPLATE = """\
<bootmenu enable='no'/>
<bios useserial='yes'/>
</os>
<devices>
<disk type='block' device='disk'>
<boot order='2'/>
</disk>
<interface type='network'>
<boot order='1'/>
</interface>
</devices>
</domain>
"""
@ -82,6 +90,7 @@ class VirtualBMCTestCase(base.TestCase):
expected = ('<boot dev="%s" />' %
vbmc.SET_BOOT_DEVICES_MAP[boot_device])
self.assertIn(expected, str(conn.defineXML.call_args))
self.assertEqual(1, str(conn.defineXML.call_args).count('<boot '))
self._assert_libvirt_calls(mock_libvirt_domain, mock_libvirt_open)
# reset mocks for the next iteraction

View File

@ -60,6 +60,10 @@ class VirtualBMC(bmc.Bmc):
boot_dev = boot_element.attrib.get('dev')
return GET_BOOT_DEVICES_MAP.get(boot_dev, 0)
def _remove_boot_elements(self, parent_element):
for boot_element in parent_element.findall('boot'):
parent_element.remove(boot_element)
def set_boot_device(self, bootdevice):
LOG.debug('Set boot device called for %(domain)s with boot '
'device "%(bootdev)s"', {'domain': self.domain_name,
@ -74,10 +78,14 @@ class VirtualBMC(bmc.Bmc):
domain = utils.get_libvirt_domain(conn, self.domain_name)
tree = ET.fromstring(domain.XMLDesc())
# Remove all "boot" element under "devices"
# They are mutually exclusive with "os/boot"
for device_element in tree.findall('devices/*'):
self._remove_boot_elements(device_element)
for os_element in tree.findall('os'):
# Remove all "boot" elements
for boot_element in os_element.findall('boot'):
os_element.remove(boot_element)
# Remove all "boot" elements under "os"
self._remove_boot_elements(os_element)
# Add a new boot element with the request boot device
boot_element = ET.SubElement(os_element, 'boot')