[Kimchi-devel] [PATCHv9 08/10] storage target: Add model support

Aline Manera alinefm at linux.vnet.ibm.com
Thu Jan 23 13:04:10 UTC 2014


Reviewed-by: Aline Manera <alinefm at linux.vnet.ibm.com>

On 01/22/2014 02:13 PM, lvroyce at linux.vnet.ibm.com wrote:
> From: Royce Lv <lvroyce at linux.vnet.ibm.com>
>
> Construct xml to query storage targets information from
> storage server.
> Use lxml to parse result instead of etree.
> Use lxml to parse target query result.
>
> Signed-off-by: Royce Lv <lvroyce at linux.vnet.ibm.com>
> ---
>   src/kimchi/model.py | 45 +++++++++++++++++++++++++++++++++++++++++++++
>   1 file changed, 45 insertions(+)
>
> diff --git a/src/kimchi/model.py b/src/kimchi/model.py
> index 67546b8..c7f063e 100644
> --- a/src/kimchi/model.py
> +++ b/src/kimchi/model.py
> @@ -30,6 +30,7 @@ import ipaddr
>   import json
>   import libvirt
>   import logging
> +import lxml.etree as ET
>   import os
>   import platform
>   import psutil
> @@ -46,6 +47,8 @@ import uuid
>   from cherrypy.process.plugins import BackgroundTask
>   from cherrypy.process.plugins import SimplePlugin
>   from collections import defaultdict
> +from lxml import objectify
> +from lxml.builder import E
>   from xml.etree import ElementTree
>
>
> @@ -1333,6 +1336,24 @@ class Model(object):
>
>           raise NotFoundError('server %s does not used by kimchi' % server)
>
> +    def storagetargets_get_list(self, storage_server, _target_type=None):
> +        target_types = STORAGE_SOURCES.keys() if not _target_type else [_target_type]
> +        target_list = list()
> +
> +        for target_type in target_types:
> +            xml = _get_storage_server_spec(server=storage_server, target_type=target_type)
> +            conn = self.conn.get()
> +
> +            try:
> +                ret = conn.findStoragePoolSources(target_type, xml, 0)
> +            except libvirt.libvirtError as e:
> +                kimchi_log.warning("Query storage pool source fails because of %s",
> +                    e.get_error_message())
> +                continue
> +
> +            target_list.extend(_parse_target_source_result(target_type, ret))
> +        return target_list
> +
>       def _get_screenshot(self, vm_uuid):
>           with self.objstore as session:
>               try:
> @@ -1543,6 +1564,30 @@ class LibvirtVMScreenshot(VMScreenshot):
>               os.close(fd)
>
>
> +def _parse_target_source_result(target_type, xml_str):
> +    root = objectify.fromstring(xml_str)
> +    ret = []
> +    for source in root.getchildren():
> +        if target_type == 'netfs':
> +            host_name = source.host.get('name')
> +            target_path = source.dir.get('path')
> +            type = source.format.get('type')
> +            ret.append(dict(host=host_name, target_type=type, target=target_path))
> +    return ret
> +
> +
> +def _get_storage_server_spec(**kwargs):
> +    # Required parameters:
> +    # server:
> +    # target_type:
> +    extra_args = []
> +    if kwargs['target_type'] == 'netfs':
> +        extra_args.append(E.format(type='nfs'))
> +    obj = E.source(E.host(name=kwargs['server']), *extra_args)
> +    xml = ET.tostring(obj)
> +    return xml
> +
> +
>   class StoragePoolDef(object):
>       @classmethod
>       def create(cls, poolArgs):




More information about the Kimchi-devel mailing list