Reviewed-By: Christy Perez <christy(a)linux.vnet.ibm.com>
On 02/11/2015 11:06 AM, 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(a)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: