xmlbuilder: Add explicit support for yes/no XML options
This commit is contained in:
parent
326731cfc5
commit
b18a29d8ff
|
@ -122,7 +122,7 @@ class XMLParseTest(unittest.TestCase):
|
|||
check("model", "selinux", "apparmor")
|
||||
check("label", "foolabel", "barlabel")
|
||||
check("imagelabel", "imagelabel", "fooimage")
|
||||
check("relabel", False, True)
|
||||
check("relabel", None, True)
|
||||
|
||||
check = self._make_checker(guest.installer)
|
||||
check("type", "kvm", "test")
|
||||
|
|
|
@ -48,15 +48,8 @@ class Boot(XMLBuilder):
|
|||
return self._enable_bootmenu
|
||||
def _set_enable_bootmenu(self, val):
|
||||
self._enable_bootmenu = val
|
||||
def _get_menu_converter(self, val):
|
||||
ignore = self
|
||||
if val is None:
|
||||
return None
|
||||
return bool(val == "yes")
|
||||
enable_bootmenu = XMLProperty(_get_enable_bootmenu, _set_enable_bootmenu,
|
||||
get_converter=_get_menu_converter,
|
||||
set_converter=lambda s, x: x and "yes" or "no",
|
||||
xpath="./os/bootmenu/@enable")
|
||||
xpath="./os/bootmenu/@enable", is_yesno=True)
|
||||
|
||||
def _get_bootorder(self):
|
||||
return self._bootorder
|
||||
|
|
|
@ -92,6 +92,4 @@ class Seclabel(XMLBuilder):
|
|||
|
||||
label = XMLProperty(xpath="./seclabel/label")
|
||||
imagelabel = XMLProperty(xpath="./seclabel/imagelabel")
|
||||
relabel = XMLProperty(xpath="./seclabel/@relabel",
|
||||
get_converter=lambda s, x: bool(x == "yes"),
|
||||
set_converter=lambda s, x: x and "yes" or "no")
|
||||
relabel = XMLProperty(xpath="./seclabel/@relabel", is_yesno=True)
|
||||
|
|
|
@ -45,18 +45,6 @@ def _int_or_none(val):
|
|||
return int(val)
|
||||
|
||||
|
||||
def _yes_no_none(val):
|
||||
if val is None:
|
||||
return None
|
||||
return val and "yes" or "no"
|
||||
|
||||
|
||||
def _yes_bool(val):
|
||||
if val is None:
|
||||
return None
|
||||
return bool(val == "yes")
|
||||
|
||||
|
||||
class VirtualGraphics(VirtualDevice):
|
||||
virtual_device_type = VirtualDevice.VIRTUAL_DEV_GRAPHICS
|
||||
|
||||
|
@ -168,10 +156,8 @@ class VirtualGraphics(VirtualDevice):
|
|||
get_converter=lambda s, v: _int_or_none(v),
|
||||
set_converter=lambda s, v: _validate_port("TLS port", v),
|
||||
default_cb=_get_default_tlsport)
|
||||
autoport = XMLProperty(xpath="./@autoport",
|
||||
get_converter=lambda s, v: _yes_bool(v),
|
||||
set_converter=lambda s, v: _yes_no_none(v),
|
||||
default_cb=_get_default_autoport)
|
||||
autoport = XMLProperty(xpath="./@autoport", is_yesno=True,
|
||||
default_cb=_get_default_autoport)
|
||||
|
||||
channel_main_mode = _get_mode_prop(CHANNEL_TYPE_MAIN)
|
||||
channel_display_mode = _get_mode_prop(CHANNEL_TYPE_DISPLAY)
|
||||
|
|
|
@ -88,10 +88,8 @@ class VirtualHostDevice(VirtualDevice):
|
|||
|
||||
def _get_default_managed(self):
|
||||
return self.conn.is_xen() and "no" or "yes"
|
||||
managed = XMLProperty(get_converter=lambda s, x: bool(x == "yes"),
|
||||
set_converter=lambda s, x: x and "yes" or "no",
|
||||
default_cb=_get_default_managed,
|
||||
xpath="./@managed")
|
||||
managed = XMLProperty(xpath="./@managed", is_yesno=True,
|
||||
default_cb=_get_default_managed)
|
||||
|
||||
vendor = XMLProperty(xpath="./source/vendor/@id")
|
||||
product = XMLProperty(xpath="./source/product/@id")
|
||||
|
|
|
@ -228,7 +228,8 @@ class XMLProperty(property):
|
|||
def __init__(self, fget=None, fset=None, doc=None, xpath=None, name=None,
|
||||
get_converter=None, set_converter=None,
|
||||
xml_get_xpath=None, xml_set_xpath=None,
|
||||
is_bool=False, is_tri=False, is_int=False, is_multi=False,
|
||||
is_bool=False, is_tri=False, is_int=False,
|
||||
is_multi=False, is_yesno=False,
|
||||
clear_first=None, default_cb=None, default_name=None):
|
||||
"""
|
||||
Set a XMLBuilder class property that represents a value in the
|
||||
|
@ -263,6 +264,7 @@ class XMLProperty(property):
|
|||
no value set.
|
||||
@param is_multi: Whether data is coming multiple or a single node
|
||||
@param is_int: Whethere this is an integer property in the XML
|
||||
@param is_yesno: Whethere this is a yes/no property in the XML
|
||||
@param clear_first: List of xpaths to unset before any 'set' operation.
|
||||
For those weird interdependent XML props like disk source type and
|
||||
path attribute.
|
||||
|
@ -283,6 +285,7 @@ class XMLProperty(property):
|
|||
self._is_bool = is_bool or is_tri
|
||||
self._is_int = is_int
|
||||
self._is_multi = is_multi
|
||||
self._is_yesno = is_yesno
|
||||
|
||||
self._xpath_for_getter_cb = xml_get_xpath
|
||||
self._xpath_for_setter_cb = xml_set_xpath
|
||||
|
@ -294,7 +297,7 @@ class XMLProperty(property):
|
|||
self._default_name = default_name
|
||||
|
||||
if sum([int(bool(i)) for i in [
|
||||
self._is_bool, self._is_int,
|
||||
self._is_bool, self._is_int, self._is_yesno,
|
||||
(self._convert_value_for_getter_cb or
|
||||
self._convert_value_for_setter_cb)]]) > 1:
|
||||
raise RuntimeError("Conflict property converter options.")
|
||||
|
@ -397,6 +400,9 @@ class XMLProperty(property):
|
|||
val = self._convert_value_for_setter_cb(xmlbuilder, val)
|
||||
elif self._default_name and val == self._default_name:
|
||||
val = self._default_cb(xmlbuilder)
|
||||
elif self._is_yesno:
|
||||
if val is not None:
|
||||
val = bool(val) and "yes" or "no"
|
||||
return val
|
||||
|
||||
def _build_node_list(self, xmlbuilder, xpath):
|
||||
|
@ -442,6 +448,8 @@ class XMLProperty(property):
|
|||
if "0x" in str(val):
|
||||
intkwargs["base"] = 16
|
||||
return int(val, **intkwargs)
|
||||
elif self._is_yesno and val is not None:
|
||||
return bool(val == "yes")
|
||||
elif self._convert_value_for_getter_cb:
|
||||
return self._convert_value_for_getter_cb(xmlbuilder, val)
|
||||
elif self._is_multi and val is None:
|
||||
|
|
Loading…
Reference in New Issue