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

Aline Manera alinefm at linux.vnet.ibm.com
Mon Jan 20 20:25:03 UTC 2014


The patch looks good.

But we need to care about Ubuntu issue.

There are 2 possible solutions for that:

1) instead of using libvirt to discover storage targets we always use 
the commands directly: showmount and iscsiadm

2) create feature tests to identify the libvirt problem and if so use 
the commands directly only in case of failure

Checking the libvirt code it uses showmount and iscsiadm internally:

/usr/sbin/showmount --no-headers --exports localhost
/usr/sbin/iscsiadm --mode discovery --type sendtargets --portal 
localhost:3260,1

So I tend to prefer the solution 1.

Anyone else would like to join the discussion?

On 01/20/2014 07:32 AM, 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 6b009c3..65f1b83 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
> @@ -45,6 +46,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
>
>
> @@ -1330,6 +1333,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:
> @@ -1540,6 +1561,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