[Kimchi-devel] [PATCH 3/5] cdrom: Add convinient functions to deal with xml parse
Rodrigo Trujillo
rodrigo.trujillo at linux.vnet.ibm.com
Mon Jan 13 12:13:56 UTC 2014
On 01/06/2014 07:32 AM, lvroyce at linux.vnet.ibm.com wrote:
> From: Royce Lv <lvroyce at linux.vnet.ibm.com>
>
> To format xml used to create cdrom, and to parse and filter cdrom
> query results, add three helper function to do this.
>
> Signed-off-by: Royce Lv <lvroyce at linux.vnet.ibm.com>
> ---
> src/kimchi/model.py | 42 ++++++++++++++++++++++++++++++++++++++++++
> src/kimchi/xmlutils.py | 5 +++++
> 2 files changed, 47 insertions(+)
>
> diff --git a/src/kimchi/model.py b/src/kimchi/model.py
> index a21fcf7..c74c973 100644
> --- a/src/kimchi/model.py
> +++ b/src/kimchi/model.py
> @@ -1672,6 +1672,48 @@ def _get_volume_xml(**kwargs):
> return xml
>
>
> +def _get_disk_xml(**kwargs):
> + kwargs['readonly'] = "<readonly/>" \
> + if kwargs['target']['type'] == 'cdrom' else None
> + xml = """
> + <disk type='{source[type]}' device='{target[type]}'>
> + <source file='{source[path]}'/>
> + <target dev='{target[name]}' bus='{target[bus]}'/>
> + {readonly}
> + </disk>
> + """.format(**kwargs)
> + return dict(xml=xml)
> +
> +
> +def _parse_vm_disks(xml_str, filter_path, filter_name, filter_val):
> + # xml_str: xml_str of all disks
> + # filter_path: xpath of the filter attribute,
> + # such as './disk' or './disk/target'
> + # filter_name: relative path of filter attr of disks etree element
> + # such as: type, bus
> + # filter_val: expected value of filter name
> + root = ElementTree.fromstring(xml_str)
> + ret = []
> + xpath = "%s/[@%s='%s']" % (filter_path, filter_name, filter_val)
> + for disk in root.findall(xpath):
> + name = disk.find('./target').attrib['dev']
> + ret.append(name)
> +
> + return ret
> +
> +
> +def _parse_device(xml_str, dev_name):
> + xpath = "./disk/target[@dev='%s']/.." % dev_name
> + root = ElementTree.fromstring(xml_str)
> + ret = []
> + disk = root.find(xpath)
> + if disk:
> + path = disk.find('./source').attrib['file']
> + return dict(name=dev_name, path=path)
> + else:
> + raise NotFoundError
You could return a error message here, with the name of the device not
found.
> +
> +
> class LibvirtConnection(object):
> def __init__(self, uri):
> self.uri = uri
> diff --git a/src/kimchi/xmlutils.py b/src/kimchi/xmlutils.py
> index 51ff0ec..176ceb1 100644
> --- a/src/kimchi/xmlutils.py
> +++ b/src/kimchi/xmlutils.py
> @@ -40,3 +40,8 @@ def xml_item_update(xml, xpath, value):
> item = root.find(xpath)
> item.text = value
> return ElementTree.tostring(root, encoding="utf-8")
> +
> +def xml_get_child(xml, xpath):
> + root = ElementTree.fromstring(xml)
> + item = root.find(xpath)
> + return ElementTree.tostring(item, encoding="utf-8")
More information about the Kimchi-devel
mailing list