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

lvroyce at linux.vnet.ibm.com lvroyce at linux.vnet.ibm.com
Mon Jan 20 09:32:52 UTC 2014


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):
-- 
1.8.1.2




More information about the Kimchi-devel mailing list