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

Royce Lv lvroyce at linux.vnet.ibm.com
Wed Jan 22 05:52:37 UTC 2014


On 2014年01月21日 10:02, zhoumeina wrote:
> On 01/21/2014 04:25 AM, Aline Manera wrote:
>>
>> 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.
Libvirt interface already implement iscsi and showmount in a uniformed 
api, is easy to use and we just need to parse the result, cons are it 
has bug in Ubuntu 13.04 so need to add featrue test.
Write on our own is easy to control and can avoid bug of 13.04.
>>
>> 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):
>>
>> _______________________________________________
>> Kimchi-devel mailing list
>> Kimchi-devel at ovirt.org
>> http://lists.ovirt.org/mailman/listinfo/kimchi-devel
>>
>




More information about the Kimchi-devel mailing list