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:
parent
0241fc9997
commit
0e74342899
|
@ -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
|
||||
|
|
|
@ -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')
|
||||
|
|
Loading…
Reference in New Issue