[Kimchi-devel] [PATCH] Fix issue #589: Add listener to remove Kimchi leftovers

Ramon Medeiros ramonn at linux.vnet.ibm.com
Wed Feb 11 17:55:28 UTC 2015


Reviewed-By: Ramon Medeiros <ramonn at linux.vnet.ibm.com>


On 02/11/2015 03:06 PM, Aline Manera wrote:
> If Kimchi is stopped before it gets completely up, it can leave some
> leftovers on system due the Feature tests.
> So add a listener to cherrypy server to clean up any leftovers when
> server is stopped.
>
> Signed-off-by: Aline Manera <alinefm at linux.vnet.ibm.com>
> ---
>   src/kimchi/kvmusertests.py       | 19 ++++++++-----------
>   src/kimchi/model/config.py       | 27 +++++++++++++++++++++++++--
>   src/kimchi/model/featuretests.py | 21 +++++++++++++--------
>   3 files changed, 46 insertions(+), 21 deletions(-)
>
> diff --git a/src/kimchi/kvmusertests.py b/src/kimchi/kvmusertests.py
> index 408706d..37a80d7 100644
> --- a/src/kimchi/kvmusertests.py
> +++ b/src/kimchi/kvmusertests.py
> @@ -18,18 +18,18 @@
>
>   import platform
>   import psutil
> -import uuid
>
>   import libvirt
>
>   from kimchi.rollbackcontext import RollbackContext
>
> +KVMUSERTEST_VM_NAME = "KVMUSERTEST_VM"
> +
>
>   class UserTests(object):
>       SIMPLE_VM_XML = """
>       <domain type='kvm'>
> -      <name>%(vm_name)s</name>
> -      <uuid>%(vm_uuid)s</uuid>
> +      <name>%(name)s</name>
>         <memory unit='KiB'>262144</memory>
>         <os>
>           <type arch='%(arch)s'>hvm</type>
> @@ -43,22 +43,19 @@ class UserTests(object):
>           if cls.user:
>               return cls.user
>
> -        vm_uuid = uuid.uuid1()
> -        vm_name = "kimchi_test_%s" % vm_uuid
>           arch = 'ppc64' if platform.machine() == 'ppc64le' \
>               else platform.machine()
>
> -        xml = cls.SIMPLE_VM_XML % {'vm_name': vm_name, 'vm_uuid': vm_uuid,
> -                                   'arch': arch}
> +        xml = cls.SIMPLE_VM_XML % {'name': KVMUSERTEST_VM_NAME, 'arch': arch}
>
>           with RollbackContext() as rollback:
>               conn = libvirt.open(None)
>               rollback.prependDefer(conn.close)
> -            dom = conn.defineXML(xml)
> -            rollback.prependDefer(dom.undefine)
> -            dom.create()
> +            dom = conn.createXML(xml,
> +                                 flags=libvirt.VIR_DOMAIN_START_AUTODESTROY)
>               rollback.prependDefer(dom.destroy)
> -            with open('/var/run/libvirt/qemu/%s.pid' % vm_name) as f:
> +            filename = '/var/run/libvirt/qemu/%s.pid' % KVMUSERTEST_VM_NAME
> +            with open(filename) as f:
>                   pidStr = f.read()
>               p = psutil.Process(int(pidStr))
>
> diff --git a/src/kimchi/model/config.py b/src/kimchi/model/config.py
> index 6a7df41..1c43360 100644
> --- a/src/kimchi/model/config.py
> +++ b/src/kimchi/model/config.py
> @@ -1,7 +1,7 @@
>   #
>   # Project Kimchi
>   #
> -# Copyright IBM, Corp. 2014
> +# Copyright IBM, Corp. 2014-2015
>   #
>   # This library is free software; you can redistribute it and/or
>   # modify it under the terms of the GNU Lesser General Public
> @@ -27,7 +27,8 @@ from kimchi.config import find_qemu_binary, get_version
>   from kimchi.distroloader import DistroLoader
>   from kimchi.exception import NotFoundError
>   from kimchi.model.debugreports import DebugReportsModel
> -from kimchi.model.featuretests import FeatureTests
> +from kimchi.model.featuretests import FeatureTests, FEATURETEST_POOL_NAME
> +from kimchi.model.featuretests import FEATURETEST_VM_NAME
>   from kimchi.repositories import Repositories
>   from kimchi.screenshot import VMScreenshot
>   from kimchi.swupdate import SoftwareUpdate
> @@ -61,6 +62,28 @@ class CapabilitiesModel(object):
>           # It is needed because some features tests depends on the server
>           cherrypy.engine.subscribe('start', self._set_capabilities)
>
> +        # Subscribe function to clean any Kimchi leftovers
> +        cherrypy.engine.subscribe('stop', self._clean_leftovers)
> +
> +    def _clean_leftovers(self):
> +        conn = self.conn.get()
> +        FeatureTests.disable_libvirt_error_logging()
> +        try:
> +            dom = conn.lookupByName(FEATURETEST_VM_NAME)
> +            dom.undefine()
> +        except Exception:
> +            # Any exception can be ignored here
> +            pass
> +
> +        try:
> +            pool = conn.storagePoolLookupByName(FEATURETEST_POOL_NAME)
> +            pool.undefine()
> +        except Exception:
> +            # Any exception can be ignored here
> +            pass
> +
> +        FeatureTests.enable_libvirt_error_logging()
> +
>       def _set_capabilities(self):
>           kimchi_log.info("*** Running feature tests ***")
>           conn = self.conn.get()
> diff --git a/src/kimchi/model/featuretests.py b/src/kimchi/model/featuretests.py
> index 5a45990..6ffdf4a 100644
> --- a/src/kimchi/model/featuretests.py
> +++ b/src/kimchi/model/featuretests.py
> @@ -25,17 +25,19 @@ import socket
>   import subprocess
>   import threading
>
> -
>   from lxml.builder import E
>
> -
>   from kimchi.rollbackcontext import RollbackContext
>   from kimchi.utils import kimchi_log, run_command
>
>
> +FEATURETEST_VM_NAME = "FEATURETEST_VM"
> +FEATURETEST_POOL_NAME = "FEATURETEST_POOL"
> +
> +
>   ISO_STREAM_XML = """
>   <domain type='%(domain)s'>
> -  <name>ISO_STREAMING</name>
> +  <name>%(name)s</name>
>     <memory unit='KiB'>1048576</memory>
>     <os>
>       <type arch='%(arch)s'>hvm</type>
> @@ -57,7 +59,7 @@ ISO_STREAM_XML = """
>
>   SIMPLE_VM_XML = """
>   <domain type='%(domain)s'>
> -  <name>A_SIMPLE_VM</name>
> +  <name>%(name)s</name>
>     <memory unit='KiB'>10240</memory>
>     <os>
>       <type arch='%(arch)s'>hvm</type>
> @@ -67,7 +69,7 @@ SIMPLE_VM_XML = """
>
>   SCSI_FC_XML = """
>   <pool type='scsi'>
> -  <name>TEST_SCSI_FC_POOL</name>
> +  <name>%(name)s</name>
>     <source>
>       <adapter type='fc_host' wwnn='1234567890abcdef' wwpn='abcdef1234567890'/>
>     </source>
> @@ -105,7 +107,8 @@ class FeatureTests(object):
>           domain_type = 'test' if conn.getType().lower() == 'test' else 'kvm'
>           arch = 'ppc64' if platform.machine() == 'ppc64le' \
>               else platform.machine()
> -        xml = ISO_STREAM_XML % {'domain': domain_type, 'protocol': protocol,
> +        xml = ISO_STREAM_XML % {'name': FEATURETEST_VM_NAME,
> +                                'domain': domain_type, 'protocol': protocol,
>                                   'arch': arch}
>           try:
>               FeatureTests.disable_libvirt_error_logging()
> @@ -176,7 +179,8 @@ class FeatureTests(object):
>           try:
>               FeatureTests.disable_libvirt_error_logging()
>               pool = None
> -            pool = conn.storagePoolDefineXML(SCSI_FC_XML, 0)
> +            pool_xml = SCSI_FC_XML % {'name': FEATURETEST_POOL_NAME}
> +            pool = conn.storagePoolDefineXML(pool_xml, 0)
>           except libvirt.libvirtError as e:
>               if e.get_error_code() == 27:
>                   # Libvirt requires adapter name, not needed when supports to FC
> @@ -196,7 +200,8 @@ class FeatureTests(object):
>               domain_type = 'test' if conn.getType().lower() == 'test' else 'kvm'
>               arch = 'ppc64' if platform.machine() == 'ppc64le' \
>                   else platform.machine()
> -            dom = conn.defineXML(SIMPLE_VM_XML % {'domain': domain_type,
> +            dom = conn.defineXML(SIMPLE_VM_XML % {'name': FEATURETEST_VM_NAME,
> +                                                  'domain': domain_type,
>                                                     'arch': arch})
>               rollback.prependDefer(dom.undefine)
>               try:


-- 
Ramon Nunes Medeiros
Kimchi Developer
Software Engineer - Linux Technology Center Brazil
IBM Systems & Technology Group
Phone : +55 19 2132 7878
ramonn at br.ibm.com




More information about the Kimchi-devel mailing list