[PATCH] get vms list by listAllDomains

From: ShaoHe Feng <shaohef@linux.vnet.ibm.com> we can get all domains by listAllDomains Signed-off-by: Aline Manera <alinefm@linux.vnet.ibm.com> Signed-off-by: ShaoHe Feng <shaohef@linux.vnet.ibm.com> --- src/kimchi/model.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/kimchi/model.py b/src/kimchi/model.py index 671af02..4b7df7e 100644 --- a/src/kimchi/model.py +++ b/src/kimchi/model.py @@ -646,10 +646,7 @@ class Model(object): def vms_get_list(self): conn = self.conn.get() - ids = conn.listDomainsID() - names = map(lambda x: conn.lookupByID(x).name(), ids) - names += conn.listDefinedDomains() - names = map(lambda x: x.decode('utf-8'), names) + names = [dom.name().decode('utf-8') for dom in conn.listAllDomains(0)] return sorted(names, key=unicode.lower) def vmscreenshot_lookup(self, name): -- 1.8.4.2

From: ShaoHe Feng <shaohef@linux.vnet.ibm.com> This patch cleans up pep8 style issue in model.py Signed-off-by: ShaoHe Feng <shaohef@linux.vnet.ibm.com> --- src/kimchi/model.py | 127 +++++++++++++++++++++++++++++----------------------- 1 file changed, 72 insertions(+), 55 deletions(-) diff --git a/src/kimchi/model.py b/src/kimchi/model.py index 4b7df7e..9d0dad3 100644 --- a/src/kimchi/model.py +++ b/src/kimchi/model.py @@ -18,16 +18,14 @@ # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA import cherrypy import copy import disks import fnmatch -import functools import glob import ipaddr -import json import libvirt import logging import os @@ -43,17 +41,10 @@ import uuid from cherrypy.process.plugins import BackgroundTask -from cherrypy.process.plugins import SimplePlugin from collections import defaultdict from xml.etree import ElementTree -try: - from collections import OrderedDict -except ImportError: - from ordereddict import OrderedDict - - from kimchi import config from kimchi import netinfo from kimchi import network as knetwork @@ -70,7 +61,7 @@ from kimchi.isoinfo import IsoImage from kimchi.objectstore import ObjectStore from kimchi.scan import Scanner from kimchi.screenshot import VMScreenshot -from kimchi.utils import get_enabled_plugins, is_digit, kimchi_log +from kimchi.utils import get_enabled_plugins, kimchi_log from kimchi.vmtemplate import VMTemplate @@ -90,12 +81,15 @@ def _uri_to_name(collection, uri): raise InvalidParameter(uri) return m.group(1) + def template_name_from_uri(uri): return _uri_to_name('templates', uri) + def pool_name_from_uri(uri): return _uri_to_name('storagepools', uri) + def get_vm_name(vm_name, t_name, name_list): if vm_name: return vm_name @@ -105,6 +99,7 @@ def get_vm_name(vm_name, t_name, name_list): return vm_name raise OperationFailed("Unable to choose a VM name") + class Model(object): dom_state_map = {0: 'nostate', 1: 'running', @@ -152,9 +147,10 @@ class Model(object): # Please add new possible debug report command here # and implement the report generating function # based on the new report command - self.report_tools = ({'cmd': 'sosreport --help', 'fn': self._sosreport_generate}, - {'cmd': 'supportconfig -h', 'fn':None}, - {'cmd': 'linuxexplorers --help', 'fn':None}) + self.report_tools = ({'cmd': 'sosreport --help', + 'fn': self._sosreport_generate}, + {'cmd': 'supportconfig -h', 'fn': None}, + {'cmd': 'linuxexplorers --help', 'fn': None}) self.distros = self._get_distros() if 'qemu:///' in self.libvirt_uri: @@ -183,7 +179,8 @@ class Model(object): net = conn.networkDefineXML(xml) except libvirt.libvirtError, e: cherrypy.log.error( - "Fatal: Cannot create default network because of %s, exit kimchid" % e.message, + "Fatal: Cannot create default network because of %s, " + "exit kimchid" % e.message, severity=logging.ERROR) sys.exit(1) @@ -192,7 +189,8 @@ class Model(object): net.create() except libvirt.libvirtError, e: cherrypy.log.error( - "Fatal: Cannot activate default network because of %s, exit kimchid" % e.message, + "Fatal: Cannot activate default network because of %s, " + "exit kimchid" % e.message, severity=logging.ERROR) sys.exit(1) @@ -208,7 +206,8 @@ class Model(object): except OperationFailed as e: # path used by other pool or other reasons of failure, exit cherrypy.log.error( - "Fatal: Cannot create default pool because of %s, exit kimchid" % e.message, + "Fatal: Cannot create default pool because of %s, " + "exit kimchid" % e.message, severity=logging.ERROR) sys.exit(1) @@ -280,7 +279,7 @@ class Model(object): distro, version, codename = platform.linux_distribution() res['os_distro'] = distro res['os_version'] = version - res['os_codename'] = unicode(codename,"utf-8") + res['os_codename'] = unicode(codename, "utf-8") return res @@ -320,7 +319,7 @@ class Model(object): max_net_io = round(max(currentMaxNetRate, int(rate)), 1) self.stats[vm_uuid].update({'net_io': rate, 'max_net_io': max_net_io, - 'netRxKB': netRxKB, 'netTxKB': netTxKB}) + 'netRxKB': netRxKB, 'netTxKB': netTxKB}) def _get_disk_io_rate(self, vm_uuid, dom, seconds): prevDiskRdKB = self.stats[vm_uuid].get('diskRdKB', 0) @@ -346,8 +345,10 @@ class Model(object): rate = rd_stats + wr_stats max_disk_io = round(max(currentMaxDiskRate, int(rate)), 1) - self.stats[vm_uuid].update({'disk_io': rate, 'max_disk_io': max_disk_io, - 'diskRdKB': diskRdKB, 'diskWrKB': diskWrKB}) + self.stats[vm_uuid].update({'disk_io': rate, + 'max_disk_io': max_disk_io, + 'diskRdKB': diskRdKB, + 'diskWrKB': diskWrKB}) def debugreport_lookup(self, name): path = config.get_debugreports_path() @@ -392,7 +393,7 @@ class Model(object): return name_lists - def _update_host_stats(self): + def _update_host_stats(self): preTimeStamp = self.host_stats['timestamp'] timestamp = time.time() # FIXME when we upgrade psutil, we can get uptime by psutil.uptime @@ -474,12 +475,14 @@ class Model(object): for key, val in params.items(): if key in VM_STATIC_UPDATE_PARAMS: - new_xml = xmlutils.xml_item_update(new_xml, VM_STATIC_UPDATE_PARAMS[key], val) + new_xml = xmlutils.xml_item_update( + new_xml, VM_STATIC_UPDATE_PARAMS[key], val) try: if 'name' in params: if state == 'running': - raise InvalidParameter("vm name can just updated when vm shutoff") + raise InvalidParameter("vm name can just updated " + "when vm shutoff") else: dom.undefine() conn = self.conn.get() @@ -598,7 +601,7 @@ class Model(object): def vm_connect(self, name): graphics, port = self._vm_get_graphics(name) - if graphics == "vnc" and port != None: + if graphics == "vnc" and port is not None: vnc.add_proxy_token(name, port) else: raise OperationFailed("Only able to connect to running vm's vnc " @@ -621,7 +624,8 @@ class Model(object): t = self._get_template(t_name, vm_overrides) if not self.qemu_stream and t.info.get('iso_stream', False): - raise InvalidOperation("Remote ISO image is not supported by this server.") + raise InvalidOperation("Remote ISO image is not supported " + "by this server.") t.validate() vol_list = t.fork_vm_storage(vm_uuid) @@ -632,11 +636,12 @@ class Model(object): with self.objstore as session: session.store('vm', vm_uuid, {'icon': icon}) - libvirt_stream = False if len(self.libvirt_stream_protocols) == 0 else True + libvirt_stream = False if len(self.libvirt_stream_protocols) == 0 \ + else True xml = t.to_vm_xml(name, vm_uuid, libvirt_stream, self.qemu_stream_dns) try: - dom = conn.defineXML(xml.encode('utf-8')) + conn.defineXML(xml.encode('utf-8')) except libvirt.libvirtError as e: for v in vol_list: vol = conn.storageVolLookupByPath(v['path']) @@ -704,7 +709,8 @@ class Model(object): try: self._get_storagepool(pool_name_from_uri(new_storagepool)) except Exception as e: - raise InvalidParameter("Storagepool specified is not valid: %s." % e.message) + raise InvalidParameter("Storagepool specified is not valid: " + "%s." % e.message) for net_name in params.get(u'networks', []): try: @@ -925,7 +931,7 @@ class Model(object): return '-'.join(('kimchi', interface, vlan_id)) def _is_vlan_tagged_bridge(self, bridge): - return bridge.startswith('kimchi-') + return bridge.startswith('kimchi-') def _create_vlan_tagged_bridge(self, interface, vlan_id): br_name = self._get_vlan_tagged_bridge_name(interface, vlan_id) @@ -960,7 +966,7 @@ class Model(object): id = self.next_taskid self.next_taskid = self.next_taskid + 1 - task = AsyncTask(id, target_uri, fn, self.objstore, opaque) + AsyncTask(id, target_uri, fn, self.objstore, opaque) return id @@ -981,7 +987,6 @@ class Model(object): except: raise - def _get_vm(self, name): conn = self.conn.get() try: @@ -1027,7 +1032,8 @@ class Model(object): with self.objstore as session: session.delete('scanning', pool_name) except Exception, e: - kimchi_log.debug("Exception %s occured when cleaning scan result" % e.message) + kimchi_log.debug("Exception %s occured when cleaning scan result", + e.message) def _do_deep_scan(self, params): scan_params = dict(ignore_list=[]) @@ -1040,10 +1046,11 @@ class Model(object): if res['state'] == 'active': scan_params['ignore_list'].append(res['path']) except Exception, e: - kimchi_log.debug("Exception %s occured when get ignore path" % e.message) + kimchi_log.debug("Exception %s occured when get ignore path", + e.message) - params['path'] = scan_params['pool_path'] = self.scanner.scan_dir_prepare( - params['name']) + params['path'] = scan_params['pool_path'] = \ + self.scanner.scan_dir_prepare(params['name']) task_id = self.add_task('', self.scanner.start_scan, scan_params) # Record scanning-task/storagepool mapping for future querying with self.objstore as session: @@ -1068,7 +1075,7 @@ class Model(object): if name in self.storagepools_get_list(): raise InvalidOperation( - "The name %s has been used by a pool" % name) + "The name %s has been used by a pool" % name) try: if task_id: @@ -1178,7 +1185,7 @@ class Model(object): pool = self._get_storagepool(name) if pool.isActive(): raise InvalidOperation( - "Unable to delete the active storagepool %s" % name) + "Unable to delete the active storagepool %s" % name) try: pool.undefine() except libvirt.libvirtError as e: @@ -1204,7 +1211,7 @@ class Model(object): raise def storagevolumes_create(self, pool, params): - info = self.storagepool_lookup(pool) + self.storagepool_lookup(pool) try: name = params['name'] xml = _get_volume_xml(**params) @@ -1239,7 +1246,8 @@ class Model(object): except IsoFormatError: bootable = False res.update( - dict(os_distro=os_distro, os_version=os_version, path=path, bootable=bootable)) + dict(os_distro=os_distro, os_version=os_version, + path=path, bootable=bootable)) return res @@ -1269,7 +1277,8 @@ class Model(object): pool = self._get_storagepool(pool) if not pool.isActive(): raise InvalidOperation( - "Unable to list volumes in inactive storagepool %s" % pool.name()) + "Unable to list volumes in inactive storagepool " + "%s" % pool.name()) try: self._pool_refresh(pool) return pool.listVolumes() @@ -1280,7 +1289,8 @@ class Model(object): pool = self._get_storagepool(pool) if not pool.isActive(): raise InvalidOperation( - "Unable to list volumes in inactive storagepool %s" % pool.name()) + "Unable to list volumes in inactive storagepool " + "%s" % pool.name()) try: return pool.storageVolLookupByName(name) except libvirt.libvirtError as e: @@ -1301,7 +1311,8 @@ class Model(object): def _sosreport_generate(self, cb, name): command = 'sosreport --batch --name "%s"' % name try: - retcode = subprocess.call(command, shell=True, stdout=subprocess.PIPE) + retcode = subprocess.call(command, shell=True, + stdout=subprocess.PIPE) if retcode < 0: raise OperationFailed('Command terminated with signal') elif retcode > 0: @@ -1346,7 +1357,8 @@ class Model(object): for helper_tool in self.report_tools: try: retcode = subprocess.call(helper_tool['cmd'], shell=True, - stdout=subprocess.PIPE, stderr=subprocess.PIPE) + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) if retcode == 0: return helper_tool['fn'] except Exception, e: @@ -1364,7 +1376,7 @@ class Model(object): def _get_distros(self): distroloader = DistroLoader() - return distroloader.get() + return distroloader.get() def distros_get_list(self): return self.distros.keys() @@ -1436,9 +1448,11 @@ class LibvirtVMTemplate(VMTemplate): conn = self.conn.get() pool = conn.storagePoolLookupByName(pool_name) except libvirt.libvirtError: - raise InvalidParameter('Storage specified by template does not exist') + raise InvalidParameter('Storage specified by template does ' + 'not exist') if not pool.isActive(): - raise InvalidParameter('Storage specified by template is not active') + raise InvalidParameter('Storage specified by template is ' + 'not active') return pool @@ -1449,9 +1463,11 @@ class LibvirtVMTemplate(VMTemplate): conn = self.conn.get() network = conn.networkLookupByName(name) except libvirt.libvirtError: - raise InvalidParameter('Network specified by template does not exist') + raise InvalidParameter('Network specified by template does ' + 'not exist') if not network.isActive(): - raise InvalidParameter('Network specified by template is not active') + raise InvalidParameter('Network specified by template is ' + 'not active') def _get_storage_path(self): pool = self._storage_validate() @@ -1485,7 +1501,7 @@ class LibvirtVMScreenshot(VMScreenshot): dom = conn.lookupByUUIDString(self.vm_uuid) vm_name = dom.name() stream = conn.newStream(0) - mimetype = dom.screenshot(stream, 0, 0) + dom.screenshot(stream, 0, 0) stream.recvAll(handler, fd) except libvirt.libvirtError: try: @@ -1734,8 +1750,8 @@ class LibvirtConnection(object): def get_wrappable_objects(self): """ When a wrapped function returns an instance of another libvirt object, - we also want to wrap that object so we can catch errors that happen when - calling its methods. + we also want to wrap that object so we can catch errors that happen + when calling its methods. """ objs = [] for name in ('virDomain', 'virDomainSnapshot', 'virInterface', @@ -1791,7 +1807,8 @@ class LibvirtConnection(object): except libvirt.libvirtError: kimchi_log.error('Unable to connect to libvirt.') if not retries: - kimchi_log.error('Libvirt is not available, exiting.') + kimchi_log.error( + 'Libvirt is not available, exiting.') cherrypy.engine.stop() raise time.sleep(2) @@ -1808,8 +1825,8 @@ class LibvirtConnection(object): setattr(cls, name, wrapMethod(method)) self._connections[conn_id] = conn - # In case we're running into troubles with keeping the connections - # alive we should place here: + # In case we're running into troubles with keeping the + # connections alive we should place here: # conn.setKeepAlive(interval=5, count=3) # However the values need to be considered wisely to not affect # hosts which are hosting a lot of virtual machines -- 1.8.4.2

Hi Sheldon, thanks for sending this patch, but I think Aline is refactoring model.py, splitting such as what was done for 'control'. Rodrigo Trujillo On 01/13/2014 09:12 AM, shaohef@linux.vnet.ibm.com wrote:
From: ShaoHe Feng <shaohef@linux.vnet.ibm.com>
This patch cleans up pep8 style issue in model.py
Signed-off-by: ShaoHe Feng <shaohef@linux.vnet.ibm.com> --- src/kimchi/model.py | 127 +++++++++++++++++++++++++++++----------------------- 1 file changed, 72 insertions(+), 55 deletions(-)
diff --git a/src/kimchi/model.py b/src/kimchi/model.py index 4b7df7e..9d0dad3 100644 --- a/src/kimchi/model.py +++ b/src/kimchi/model.py @@ -18,16 +18,14 @@ # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
import cherrypy import copy import disks import fnmatch -import functools import glob import ipaddr -import json import libvirt import logging import os @@ -43,17 +41,10 @@ import uuid
from cherrypy.process.plugins import BackgroundTask -from cherrypy.process.plugins import SimplePlugin from collections import defaultdict from xml.etree import ElementTree
-try: - from collections import OrderedDict -except ImportError: - from ordereddict import OrderedDict - - from kimchi import config from kimchi import netinfo from kimchi import network as knetwork @@ -70,7 +61,7 @@ from kimchi.isoinfo import IsoImage from kimchi.objectstore import ObjectStore from kimchi.scan import Scanner from kimchi.screenshot import VMScreenshot -from kimchi.utils import get_enabled_plugins, is_digit, kimchi_log +from kimchi.utils import get_enabled_plugins, kimchi_log from kimchi.vmtemplate import VMTemplate
@@ -90,12 +81,15 @@ def _uri_to_name(collection, uri): raise InvalidParameter(uri) return m.group(1)
+ def template_name_from_uri(uri): return _uri_to_name('templates', uri)
+ def pool_name_from_uri(uri): return _uri_to_name('storagepools', uri)
+ def get_vm_name(vm_name, t_name, name_list): if vm_name: return vm_name @@ -105,6 +99,7 @@ def get_vm_name(vm_name, t_name, name_list): return vm_name raise OperationFailed("Unable to choose a VM name")
+ class Model(object): dom_state_map = {0: 'nostate', 1: 'running', @@ -152,9 +147,10 @@ class Model(object): # Please add new possible debug report command here # and implement the report generating function # based on the new report command - self.report_tools = ({'cmd': 'sosreport --help', 'fn': self._sosreport_generate}, - {'cmd': 'supportconfig -h', 'fn':None}, - {'cmd': 'linuxexplorers --help', 'fn':None}) + self.report_tools = ({'cmd': 'sosreport --help', + 'fn': self._sosreport_generate}, + {'cmd': 'supportconfig -h', 'fn': None}, + {'cmd': 'linuxexplorers --help', 'fn': None})
self.distros = self._get_distros() if 'qemu:///' in self.libvirt_uri: @@ -183,7 +179,8 @@ class Model(object): net = conn.networkDefineXML(xml) except libvirt.libvirtError, e: cherrypy.log.error( - "Fatal: Cannot create default network because of %s, exit kimchid" % e.message, + "Fatal: Cannot create default network because of %s, " + "exit kimchid" % e.message, severity=logging.ERROR) sys.exit(1)
@@ -192,7 +189,8 @@ class Model(object): net.create() except libvirt.libvirtError, e: cherrypy.log.error( - "Fatal: Cannot activate default network because of %s, exit kimchid" % e.message, + "Fatal: Cannot activate default network because of %s, " + "exit kimchid" % e.message, severity=logging.ERROR) sys.exit(1)
@@ -208,7 +206,8 @@ class Model(object): except OperationFailed as e: # path used by other pool or other reasons of failure, exit cherrypy.log.error( - "Fatal: Cannot create default pool because of %s, exit kimchid" % e.message, + "Fatal: Cannot create default pool because of %s, " + "exit kimchid" % e.message, severity=logging.ERROR) sys.exit(1)
@@ -280,7 +279,7 @@ class Model(object): distro, version, codename = platform.linux_distribution() res['os_distro'] = distro res['os_version'] = version - res['os_codename'] = unicode(codename,"utf-8") + res['os_codename'] = unicode(codename, "utf-8")
return res
@@ -320,7 +319,7 @@ class Model(object): max_net_io = round(max(currentMaxNetRate, int(rate)), 1)
self.stats[vm_uuid].update({'net_io': rate, 'max_net_io': max_net_io, - 'netRxKB': netRxKB, 'netTxKB': netTxKB}) + 'netRxKB': netRxKB, 'netTxKB': netTxKB})
def _get_disk_io_rate(self, vm_uuid, dom, seconds): prevDiskRdKB = self.stats[vm_uuid].get('diskRdKB', 0) @@ -346,8 +345,10 @@ class Model(object): rate = rd_stats + wr_stats max_disk_io = round(max(currentMaxDiskRate, int(rate)), 1)
- self.stats[vm_uuid].update({'disk_io': rate, 'max_disk_io': max_disk_io, - 'diskRdKB': diskRdKB, 'diskWrKB': diskWrKB}) + self.stats[vm_uuid].update({'disk_io': rate, + 'max_disk_io': max_disk_io, + 'diskRdKB': diskRdKB, + 'diskWrKB': diskWrKB})
def debugreport_lookup(self, name): path = config.get_debugreports_path() @@ -392,7 +393,7 @@ class Model(object):
return name_lists
- def _update_host_stats(self): + def _update_host_stats(self): preTimeStamp = self.host_stats['timestamp'] timestamp = time.time() # FIXME when we upgrade psutil, we can get uptime by psutil.uptime @@ -474,12 +475,14 @@ class Model(object):
for key, val in params.items(): if key in VM_STATIC_UPDATE_PARAMS: - new_xml = xmlutils.xml_item_update(new_xml, VM_STATIC_UPDATE_PARAMS[key], val) + new_xml = xmlutils.xml_item_update( + new_xml, VM_STATIC_UPDATE_PARAMS[key], val)
try: if 'name' in params: if state == 'running': - raise InvalidParameter("vm name can just updated when vm shutoff") + raise InvalidParameter("vm name can just updated " + "when vm shutoff") else: dom.undefine() conn = self.conn.get() @@ -598,7 +601,7 @@ class Model(object):
def vm_connect(self, name): graphics, port = self._vm_get_graphics(name) - if graphics == "vnc" and port != None: + if graphics == "vnc" and port is not None: vnc.add_proxy_token(name, port) else: raise OperationFailed("Only able to connect to running vm's vnc " @@ -621,7 +624,8 @@ class Model(object): t = self._get_template(t_name, vm_overrides)
if not self.qemu_stream and t.info.get('iso_stream', False): - raise InvalidOperation("Remote ISO image is not supported by this server.") + raise InvalidOperation("Remote ISO image is not supported " + "by this server.")
t.validate() vol_list = t.fork_vm_storage(vm_uuid) @@ -632,11 +636,12 @@ class Model(object): with self.objstore as session: session.store('vm', vm_uuid, {'icon': icon})
- libvirt_stream = False if len(self.libvirt_stream_protocols) == 0 else True + libvirt_stream = False if len(self.libvirt_stream_protocols) == 0 \ + else True
xml = t.to_vm_xml(name, vm_uuid, libvirt_stream, self.qemu_stream_dns) try: - dom = conn.defineXML(xml.encode('utf-8')) + conn.defineXML(xml.encode('utf-8')) except libvirt.libvirtError as e: for v in vol_list: vol = conn.storageVolLookupByPath(v['path']) @@ -704,7 +709,8 @@ class Model(object): try: self._get_storagepool(pool_name_from_uri(new_storagepool)) except Exception as e: - raise InvalidParameter("Storagepool specified is not valid: %s." % e.message) + raise InvalidParameter("Storagepool specified is not valid: " + "%s." % e.message)
for net_name in params.get(u'networks', []): try: @@ -925,7 +931,7 @@ class Model(object): return '-'.join(('kimchi', interface, vlan_id))
def _is_vlan_tagged_bridge(self, bridge): - return bridge.startswith('kimchi-') + return bridge.startswith('kimchi-')
def _create_vlan_tagged_bridge(self, interface, vlan_id): br_name = self._get_vlan_tagged_bridge_name(interface, vlan_id) @@ -960,7 +966,7 @@ class Model(object): id = self.next_taskid self.next_taskid = self.next_taskid + 1
- task = AsyncTask(id, target_uri, fn, self.objstore, opaque) + AsyncTask(id, target_uri, fn, self.objstore, opaque)
return id
@@ -981,7 +987,6 @@ class Model(object): except: raise
- def _get_vm(self, name): conn = self.conn.get() try: @@ -1027,7 +1032,8 @@ class Model(object): with self.objstore as session: session.delete('scanning', pool_name) except Exception, e: - kimchi_log.debug("Exception %s occured when cleaning scan result" % e.message) + kimchi_log.debug("Exception %s occured when cleaning scan result", + e.message)
def _do_deep_scan(self, params): scan_params = dict(ignore_list=[]) @@ -1040,10 +1046,11 @@ class Model(object): if res['state'] == 'active': scan_params['ignore_list'].append(res['path']) except Exception, e: - kimchi_log.debug("Exception %s occured when get ignore path" % e.message) + kimchi_log.debug("Exception %s occured when get ignore path", + e.message)
- params['path'] = scan_params['pool_path'] = self.scanner.scan_dir_prepare( - params['name']) + params['path'] = scan_params['pool_path'] = \ + self.scanner.scan_dir_prepare(params['name']) task_id = self.add_task('', self.scanner.start_scan, scan_params) # Record scanning-task/storagepool mapping for future querying with self.objstore as session: @@ -1068,7 +1075,7 @@ class Model(object):
if name in self.storagepools_get_list(): raise InvalidOperation( - "The name %s has been used by a pool" % name) + "The name %s has been used by a pool" % name)
try: if task_id: @@ -1178,7 +1185,7 @@ class Model(object): pool = self._get_storagepool(name) if pool.isActive(): raise InvalidOperation( - "Unable to delete the active storagepool %s" % name) + "Unable to delete the active storagepool %s" % name) try: pool.undefine() except libvirt.libvirtError as e: @@ -1204,7 +1211,7 @@ class Model(object): raise
def storagevolumes_create(self, pool, params): - info = self.storagepool_lookup(pool) + self.storagepool_lookup(pool) try: name = params['name'] xml = _get_volume_xml(**params) @@ -1239,7 +1246,8 @@ class Model(object): except IsoFormatError: bootable = False res.update( - dict(os_distro=os_distro, os_version=os_version, path=path, bootable=bootable)) + dict(os_distro=os_distro, os_version=os_version, + path=path, bootable=bootable))
return res
@@ -1269,7 +1277,8 @@ class Model(object): pool = self._get_storagepool(pool) if not pool.isActive(): raise InvalidOperation( - "Unable to list volumes in inactive storagepool %s" % pool.name()) + "Unable to list volumes in inactive storagepool " + "%s" % pool.name()) try: self._pool_refresh(pool) return pool.listVolumes() @@ -1280,7 +1289,8 @@ class Model(object): pool = self._get_storagepool(pool) if not pool.isActive(): raise InvalidOperation( - "Unable to list volumes in inactive storagepool %s" % pool.name()) + "Unable to list volumes in inactive storagepool " + "%s" % pool.name()) try: return pool.storageVolLookupByName(name) except libvirt.libvirtError as e: @@ -1301,7 +1311,8 @@ class Model(object): def _sosreport_generate(self, cb, name): command = 'sosreport --batch --name "%s"' % name try: - retcode = subprocess.call(command, shell=True, stdout=subprocess.PIPE) + retcode = subprocess.call(command, shell=True, + stdout=subprocess.PIPE) if retcode < 0: raise OperationFailed('Command terminated with signal') elif retcode > 0: @@ -1346,7 +1357,8 @@ class Model(object): for helper_tool in self.report_tools: try: retcode = subprocess.call(helper_tool['cmd'], shell=True, - stdout=subprocess.PIPE, stderr=subprocess.PIPE) + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) if retcode == 0: return helper_tool['fn'] except Exception, e: @@ -1364,7 +1376,7 @@ class Model(object):
def _get_distros(self): distroloader = DistroLoader() - return distroloader.get() + return distroloader.get()
def distros_get_list(self): return self.distros.keys() @@ -1436,9 +1448,11 @@ class LibvirtVMTemplate(VMTemplate): conn = self.conn.get() pool = conn.storagePoolLookupByName(pool_name) except libvirt.libvirtError: - raise InvalidParameter('Storage specified by template does not exist') + raise InvalidParameter('Storage specified by template does ' + 'not exist') if not pool.isActive(): - raise InvalidParameter('Storage specified by template is not active') + raise InvalidParameter('Storage specified by template is ' + 'not active')
return pool
@@ -1449,9 +1463,11 @@ class LibvirtVMTemplate(VMTemplate): conn = self.conn.get() network = conn.networkLookupByName(name) except libvirt.libvirtError: - raise InvalidParameter('Network specified by template does not exist') + raise InvalidParameter('Network specified by template does ' + 'not exist') if not network.isActive(): - raise InvalidParameter('Network specified by template is not active') + raise InvalidParameter('Network specified by template is ' + 'not active')
def _get_storage_path(self): pool = self._storage_validate() @@ -1485,7 +1501,7 @@ class LibvirtVMScreenshot(VMScreenshot): dom = conn.lookupByUUIDString(self.vm_uuid) vm_name = dom.name() stream = conn.newStream(0) - mimetype = dom.screenshot(stream, 0, 0) + dom.screenshot(stream, 0, 0) stream.recvAll(handler, fd) except libvirt.libvirtError: try: @@ -1734,8 +1750,8 @@ class LibvirtConnection(object): def get_wrappable_objects(self): """ When a wrapped function returns an instance of another libvirt object, - we also want to wrap that object so we can catch errors that happen when - calling its methods. + we also want to wrap that object so we can catch errors that happen + when calling its methods. """ objs = [] for name in ('virDomain', 'virDomainSnapshot', 'virInterface', @@ -1791,7 +1807,8 @@ class LibvirtConnection(object): except libvirt.libvirtError: kimchi_log.error('Unable to connect to libvirt.') if not retries: - kimchi_log.error('Libvirt is not available, exiting.') + kimchi_log.error( + 'Libvirt is not available, exiting.') cherrypy.engine.stop() raise time.sleep(2) @@ -1808,8 +1825,8 @@ class LibvirtConnection(object): setattr(cls, name, wrapMethod(method))
self._connections[conn_id] = conn - # In case we're running into troubles with keeping the connections - # alive we should place here: + # In case we're running into troubles with keeping the + # connections alive we should place here: # conn.setKeepAlive(interval=5, count=3) # However the values need to be considered wisely to not affect # hosts which are hosting a lot of virtual machines

Hi Sheldon, thanks for sending this patch, but I think Aline is refactoring model.py, splitting such as what was done for 'control'.
On 01/13/2014 07:33 PM, Rodrigo Trujillo wrote: thanks Rodrigo. I just fix pep8 when I send the former patch <[PATCH] get vms list by listAllDomains> I touch model.py, So I cleanup pep8. It does not matter. aline can ignore this pep cleanup. And just focus on the the former patch. Cleanup pep8 is easy for me.
Rodrigo Trujillo
On 01/13/2014 09:12 AM, shaohef@linux.vnet.ibm.com wrote:
From: ShaoHe Feng <shaohef@linux.vnet.ibm.com>
This patch cleans up pep8 style issue in model.py
Signed-off-by: ShaoHe Feng <shaohef@linux.vnet.ibm.com> --- src/kimchi/model.py | 127 +++++++++++++++++++++++++++++----------------------- 1 file changed, 72 insertions(+), 55 deletions(-)
diff --git a/src/kimchi/model.py b/src/kimchi/model.py index 4b7df7e..9d0dad3 100644 --- a/src/kimchi/model.py +++ b/src/kimchi/model.py @@ -18,16 +18,14 @@ # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
import cherrypy import copy import disks import fnmatch -import functools import glob import ipaddr -import json import libvirt import logging import os @@ -43,17 +41,10 @@ import uuid
from cherrypy.process.plugins import BackgroundTask -from cherrypy.process.plugins import SimplePlugin from collections import defaultdict from xml.etree import ElementTree
-try: - from collections import OrderedDict -except ImportError: - from ordereddict import OrderedDict - - from kimchi import config from kimchi import netinfo from kimchi import network as knetwork @@ -70,7 +61,7 @@ from kimchi.isoinfo import IsoImage from kimchi.objectstore import ObjectStore from kimchi.scan import Scanner from kimchi.screenshot import VMScreenshot -from kimchi.utils import get_enabled_plugins, is_digit, kimchi_log +from kimchi.utils import get_enabled_plugins, kimchi_log from kimchi.vmtemplate import VMTemplate
@@ -90,12 +81,15 @@ def _uri_to_name(collection, uri): raise InvalidParameter(uri) return m.group(1)
+ def template_name_from_uri(uri): return _uri_to_name('templates', uri)
+ def pool_name_from_uri(uri): return _uri_to_name('storagepools', uri)
+ def get_vm_name(vm_name, t_name, name_list): if vm_name: return vm_name @@ -105,6 +99,7 @@ def get_vm_name(vm_name, t_name, name_list): return vm_name raise OperationFailed("Unable to choose a VM name")
+ class Model(object): dom_state_map = {0: 'nostate', 1: 'running', @@ -152,9 +147,10 @@ class Model(object): # Please add new possible debug report command here # and implement the report generating function # based on the new report command - self.report_tools = ({'cmd': 'sosreport --help', 'fn': self._sosreport_generate}, - {'cmd': 'supportconfig -h', 'fn':None}, - {'cmd': 'linuxexplorers --help', 'fn':None}) + self.report_tools = ({'cmd': 'sosreport --help', + 'fn': self._sosreport_generate}, + {'cmd': 'supportconfig -h', 'fn': None}, + {'cmd': 'linuxexplorers --help', 'fn': None})
self.distros = self._get_distros() if 'qemu:///' in self.libvirt_uri: @@ -183,7 +179,8 @@ class Model(object): net = conn.networkDefineXML(xml) except libvirt.libvirtError, e: cherrypy.log.error( - "Fatal: Cannot create default network because of %s, exit kimchid" % e.message, + "Fatal: Cannot create default network because of %s, " + "exit kimchid" % e.message, severity=logging.ERROR) sys.exit(1)
@@ -192,7 +189,8 @@ class Model(object): net.create() except libvirt.libvirtError, e: cherrypy.log.error( - "Fatal: Cannot activate default network because of %s, exit kimchid" % e.message, + "Fatal: Cannot activate default network because of %s, " + "exit kimchid" % e.message, severity=logging.ERROR) sys.exit(1)
@@ -208,7 +206,8 @@ class Model(object): except OperationFailed as e: # path used by other pool or other reasons of failure, exit cherrypy.log.error( - "Fatal: Cannot create default pool because of %s, exit kimchid" % e.message, + "Fatal: Cannot create default pool because of %s, " + "exit kimchid" % e.message, severity=logging.ERROR) sys.exit(1)
@@ -280,7 +279,7 @@ class Model(object): distro, version, codename = platform.linux_distribution() res['os_distro'] = distro res['os_version'] = version - res['os_codename'] = unicode(codename,"utf-8") + res['os_codename'] = unicode(codename, "utf-8")
return res
@@ -320,7 +319,7 @@ class Model(object): max_net_io = round(max(currentMaxNetRate, int(rate)), 1)
self.stats[vm_uuid].update({'net_io': rate, 'max_net_io': max_net_io, - 'netRxKB': netRxKB, 'netTxKB': netTxKB}) + 'netRxKB': netRxKB, 'netTxKB': netTxKB})
def _get_disk_io_rate(self, vm_uuid, dom, seconds): prevDiskRdKB = self.stats[vm_uuid].get('diskRdKB', 0) @@ -346,8 +345,10 @@ class Model(object): rate = rd_stats + wr_stats max_disk_io = round(max(currentMaxDiskRate, int(rate)), 1)
- self.stats[vm_uuid].update({'disk_io': rate, 'max_disk_io': max_disk_io, - 'diskRdKB': diskRdKB, 'diskWrKB': diskWrKB}) + self.stats[vm_uuid].update({'disk_io': rate, + 'max_disk_io': max_disk_io, + 'diskRdKB': diskRdKB, + 'diskWrKB': diskWrKB})
def debugreport_lookup(self, name): path = config.get_debugreports_path() @@ -392,7 +393,7 @@ class Model(object):
return name_lists
- def _update_host_stats(self): + def _update_host_stats(self): preTimeStamp = self.host_stats['timestamp'] timestamp = time.time() # FIXME when we upgrade psutil, we can get uptime by psutil.uptime @@ -474,12 +475,14 @@ class Model(object):
for key, val in params.items(): if key in VM_STATIC_UPDATE_PARAMS: - new_xml = xmlutils.xml_item_update(new_xml, VM_STATIC_UPDATE_PARAMS[key], val) + new_xml = xmlutils.xml_item_update( + new_xml, VM_STATIC_UPDATE_PARAMS[key], val)
try: if 'name' in params: if state == 'running': - raise InvalidParameter("vm name can just updated when vm shutoff") + raise InvalidParameter("vm name can just updated " + "when vm shutoff") else: dom.undefine() conn = self.conn.get() @@ -598,7 +601,7 @@ class Model(object):
def vm_connect(self, name): graphics, port = self._vm_get_graphics(name) - if graphics == "vnc" and port != None: + if graphics == "vnc" and port is not None: vnc.add_proxy_token(name, port) else: raise OperationFailed("Only able to connect to running vm's vnc " @@ -621,7 +624,8 @@ class Model(object): t = self._get_template(t_name, vm_overrides)
if not self.qemu_stream and t.info.get('iso_stream', False): - raise InvalidOperation("Remote ISO image is not supported by this server.") + raise InvalidOperation("Remote ISO image is not supported " + "by this server.")
t.validate() vol_list = t.fork_vm_storage(vm_uuid) @@ -632,11 +636,12 @@ class Model(object): with self.objstore as session: session.store('vm', vm_uuid, {'icon': icon})
- libvirt_stream = False if len(self.libvirt_stream_protocols) == 0 else True + libvirt_stream = False if len(self.libvirt_stream_protocols) == 0 \ + else True
xml = t.to_vm_xml(name, vm_uuid, libvirt_stream, self.qemu_stream_dns) try: - dom = conn.defineXML(xml.encode('utf-8')) + conn.defineXML(xml.encode('utf-8')) except libvirt.libvirtError as e: for v in vol_list: vol = conn.storageVolLookupByPath(v['path']) @@ -704,7 +709,8 @@ class Model(object): try: self._get_storagepool(pool_name_from_uri(new_storagepool)) except Exception as e: - raise InvalidParameter("Storagepool specified is not valid: %s." % e.message) + raise InvalidParameter("Storagepool specified is not valid: " + "%s." % e.message)
for net_name in params.get(u'networks', []): try: @@ -925,7 +931,7 @@ class Model(object): return '-'.join(('kimchi', interface, vlan_id))
def _is_vlan_tagged_bridge(self, bridge): - return bridge.startswith('kimchi-') + return bridge.startswith('kimchi-')
def _create_vlan_tagged_bridge(self, interface, vlan_id): br_name = self._get_vlan_tagged_bridge_name(interface, vlan_id) @@ -960,7 +966,7 @@ class Model(object): id = self.next_taskid self.next_taskid = self.next_taskid + 1
- task = AsyncTask(id, target_uri, fn, self.objstore, opaque) + AsyncTask(id, target_uri, fn, self.objstore, opaque)
return id
@@ -981,7 +987,6 @@ class Model(object): except: raise
- def _get_vm(self, name): conn = self.conn.get() try: @@ -1027,7 +1032,8 @@ class Model(object): with self.objstore as session: session.delete('scanning', pool_name) except Exception, e: - kimchi_log.debug("Exception %s occured when cleaning scan result" % e.message) + kimchi_log.debug("Exception %s occured when cleaning scan result", + e.message)
def _do_deep_scan(self, params): scan_params = dict(ignore_list=[]) @@ -1040,10 +1046,11 @@ class Model(object): if res['state'] == 'active': scan_params['ignore_list'].append(res['path']) except Exception, e: - kimchi_log.debug("Exception %s occured when get ignore path" % e.message) + kimchi_log.debug("Exception %s occured when get ignore path", + e.message)
- params['path'] = scan_params['pool_path'] = self.scanner.scan_dir_prepare( - params['name']) + params['path'] = scan_params['pool_path'] = \ + self.scanner.scan_dir_prepare(params['name']) task_id = self.add_task('', self.scanner.start_scan, scan_params) # Record scanning-task/storagepool mapping for future querying with self.objstore as session: @@ -1068,7 +1075,7 @@ class Model(object):
if name in self.storagepools_get_list(): raise InvalidOperation( - "The name %s has been used by a pool" % name) + "The name %s has been used by a pool" % name)
try: if task_id: @@ -1178,7 +1185,7 @@ class Model(object): pool = self._get_storagepool(name) if pool.isActive(): raise InvalidOperation( - "Unable to delete the active storagepool %s" % name) + "Unable to delete the active storagepool %s" % name) try: pool.undefine() except libvirt.libvirtError as e: @@ -1204,7 +1211,7 @@ class Model(object): raise
def storagevolumes_create(self, pool, params): - info = self.storagepool_lookup(pool) + self.storagepool_lookup(pool) try: name = params['name'] xml = _get_volume_xml(**params) @@ -1239,7 +1246,8 @@ class Model(object): except IsoFormatError: bootable = False res.update( - dict(os_distro=os_distro, os_version=os_version, path=path, bootable=bootable)) + dict(os_distro=os_distro, os_version=os_version, + path=path, bootable=bootable))
return res
@@ -1269,7 +1277,8 @@ class Model(object): pool = self._get_storagepool(pool) if not pool.isActive(): raise InvalidOperation( - "Unable to list volumes in inactive storagepool %s" % pool.name()) + "Unable to list volumes in inactive storagepool " + "%s" % pool.name()) try: self._pool_refresh(pool) return pool.listVolumes() @@ -1280,7 +1289,8 @@ class Model(object): pool = self._get_storagepool(pool) if not pool.isActive(): raise InvalidOperation( - "Unable to list volumes in inactive storagepool %s" % pool.name()) + "Unable to list volumes in inactive storagepool " + "%s" % pool.name()) try: return pool.storageVolLookupByName(name) except libvirt.libvirtError as e: @@ -1301,7 +1311,8 @@ class Model(object): def _sosreport_generate(self, cb, name): command = 'sosreport --batch --name "%s"' % name try: - retcode = subprocess.call(command, shell=True, stdout=subprocess.PIPE) + retcode = subprocess.call(command, shell=True, + stdout=subprocess.PIPE) if retcode < 0: raise OperationFailed('Command terminated with signal') elif retcode > 0: @@ -1346,7 +1357,8 @@ class Model(object): for helper_tool in self.report_tools: try: retcode = subprocess.call(helper_tool['cmd'], shell=True, - stdout=subprocess.PIPE, stderr=subprocess.PIPE) + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) if retcode == 0: return helper_tool['fn'] except Exception, e: @@ -1364,7 +1376,7 @@ class Model(object):
def _get_distros(self): distroloader = DistroLoader() - return distroloader.get() + return distroloader.get()
def distros_get_list(self): return self.distros.keys() @@ -1436,9 +1448,11 @@ class LibvirtVMTemplate(VMTemplate): conn = self.conn.get() pool = conn.storagePoolLookupByName(pool_name) except libvirt.libvirtError: - raise InvalidParameter('Storage specified by template does not exist') + raise InvalidParameter('Storage specified by template does ' + 'not exist') if not pool.isActive(): - raise InvalidParameter('Storage specified by template is not active') + raise InvalidParameter('Storage specified by template is ' + 'not active')
return pool
@@ -1449,9 +1463,11 @@ class LibvirtVMTemplate(VMTemplate): conn = self.conn.get() network = conn.networkLookupByName(name) except libvirt.libvirtError: - raise InvalidParameter('Network specified by template does not exist') + raise InvalidParameter('Network specified by template does ' + 'not exist') if not network.isActive(): - raise InvalidParameter('Network specified by template is not active') + raise InvalidParameter('Network specified by template is ' + 'not active')
def _get_storage_path(self): pool = self._storage_validate() @@ -1485,7 +1501,7 @@ class LibvirtVMScreenshot(VMScreenshot): dom = conn.lookupByUUIDString(self.vm_uuid) vm_name = dom.name() stream = conn.newStream(0) - mimetype = dom.screenshot(stream, 0, 0) + dom.screenshot(stream, 0, 0) stream.recvAll(handler, fd) except libvirt.libvirtError: try: @@ -1734,8 +1750,8 @@ class LibvirtConnection(object): def get_wrappable_objects(self): """ When a wrapped function returns an instance of another libvirt object, - we also want to wrap that object so we can catch errors that happen when - calling its methods. + we also want to wrap that object so we can catch errors that happen + when calling its methods. """ objs = [] for name in ('virDomain', 'virDomainSnapshot', 'virInterface', @@ -1791,7 +1807,8 @@ class LibvirtConnection(object): except libvirt.libvirtError: kimchi_log.error('Unable to connect to libvirt.') if not retries: - kimchi_log.error('Libvirt is not available, exiting.') + kimchi_log.error( + 'Libvirt is not available, exiting.') cherrypy.engine.stop() raise time.sleep(2) @@ -1808,8 +1825,8 @@ class LibvirtConnection(object): setattr(cls, name, wrapMethod(method))
self._connections[conn_id] = conn - # In case we're running into troubles with keeping the connections - # alive we should place here: + # In case we're running into troubles with keeping the + # connections alive we should place here: # conn.setKeepAlive(interval=5, count=3) # However the values need to be considered wisely to not affect # hosts which are hosting a lot of virtual machines
-- Thanks and best regards! Sheldon Feng(冯少合)<shaohef@linux.vnet.ibm.com> IBM Linux Technology Center

Reviewed-by: Rodrigo Trujillo <rodrigo.trujillo@linux.vnet.ibm.com> On 01/13/2014 09:12 AM, shaohef@linux.vnet.ibm.com wrote:
From: ShaoHe Feng <shaohef@linux.vnet.ibm.com>
we can get all domains by listAllDomains
Signed-off-by: Aline Manera <alinefm@linux.vnet.ibm.com> Signed-off-by: ShaoHe Feng <shaohef@linux.vnet.ibm.com> --- src/kimchi/model.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/src/kimchi/model.py b/src/kimchi/model.py index 671af02..4b7df7e 100644 --- a/src/kimchi/model.py +++ b/src/kimchi/model.py @@ -646,10 +646,7 @@ class Model(object):
def vms_get_list(self): conn = self.conn.get() - ids = conn.listDomainsID() - names = map(lambda x: conn.lookupByID(x).name(), ids) - names += conn.listDefinedDomains() - names = map(lambda x: x.decode('utf-8'), names) + names = [dom.name().decode('utf-8') for dom in conn.listAllDomains(0)] return sorted(names, key=unicode.lower)
def vmscreenshot_lookup(self, name):

Reviewed-by: Aline Manera <alinefm@linux.vnet.ibm.com> I am assuming you verified it for all the supported distros :-) On 01/13/2014 09:12 AM, shaohef@linux.vnet.ibm.com wrote:
From: ShaoHe Feng <shaohef@linux.vnet.ibm.com>
we can get all domains by listAllDomains
Signed-off-by: Aline Manera <alinefm@linux.vnet.ibm.com> Signed-off-by: ShaoHe Feng <shaohef@linux.vnet.ibm.com> --- src/kimchi/model.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/src/kimchi/model.py b/src/kimchi/model.py index 671af02..4b7df7e 100644 --- a/src/kimchi/model.py +++ b/src/kimchi/model.py @@ -646,10 +646,7 @@ class Model(object):
def vms_get_list(self): conn = self.conn.get() - ids = conn.listDomainsID() - names = map(lambda x: conn.lookupByID(x).name(), ids) - names += conn.listDefinedDomains() - names = map(lambda x: x.decode('utf-8'), names) + names = [dom.name().decode('utf-8') for dom in conn.listAllDomains(0)] return sorted(names, key=unicode.lower)
def vmscreenshot_lookup(self, name):

On 01/13/2014 07:12 PM, shaohef@linux.vnet.ibm.com wrote:
From: ShaoHe Feng <shaohef@linux.vnet.ibm.com>
we can get all domains by listAllDomains
Signed-off-by: Aline Manera <alinefm@linux.vnet.ibm.com> Signed-off-by: ShaoHe Feng <shaohef@linux.vnet.ibm.com> --- src/kimchi/model.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/src/kimchi/model.py b/src/kimchi/model.py index 671af02..4b7df7e 100644 --- a/src/kimchi/model.py +++ b/src/kimchi/model.py @@ -646,10 +646,7 @@ class Model(object):
def vms_get_list(self): conn = self.conn.get() - ids = conn.listDomainsID() - names = map(lambda x: conn.lookupByID(x).name(), ids) - names += conn.listDefinedDomains() - names = map(lambda x: x.decode('utf-8'), names) + names = [dom.name().decode('utf-8') for dom in conn.listAllDomains(0)] use generator is more efficient than generating a new list:
names = (dom.name().decode('utf-8') for dom in conn.listAllDomains(0))
return sorted(names, key=unicode.lower)
def vmscreenshot_lookup(self, name):
participants (5)
-
Aline Manera
-
Mark Wu
-
Rodrigo Trujillo
-
shaohef@linux.vnet.ibm.com
-
Sheldon