xmlbuilder: Add explicit support for yes/no XML options

This commit is contained in:
Cole Robinson 2013-07-16 13:04:24 -04:00
parent 326731cfc5
commit b18a29d8ff
6 changed files with 17 additions and 34 deletions

View File

@ -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")

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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")

View File

@ -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: