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
Are there anyone can explain the
davantage and disavantage between
libvirt and use commands directly?
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(a)linux.vnet.ibm.com wrote:
> From: Royce Lv <lvroyce(a)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(a)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):
_______________________________________________
Kimchi-devel mailing list
Kimchi-devel(a)ovirt.org
http://lists.ovirt.org/mailman/listinfo/kimchi-devel