On 09/14/2011 06:31 PM, Wayne Sun wrote:
* repos/libvirtd/qemu_hang.py
qemu process get hang should not cause libvirtd hang or dead
---
repos/libvirtd/qemu_hang.py | 142 +++++++++++++++++++++++++++++++++++++++++++
1 files changed, 142 insertions(+), 0 deletions(-)
create mode 100644 repos/libvirtd/qemu_hang.py
diff --git a/repos/libvirtd/qemu_hang.py b/repos/libvirtd/qemu_hang.py
new file mode 100644
index 0000000..f377df3
--- /dev/null
+++ b/repos/libvirtd/qemu_hang.py
@@ -0,0 +1,142 @@
+#!/usr/bin/env python
+""" QEMU get hang should not cause libvirtd hang or dead. This test stop
+ a qemu process and check whether libvird get hang. For doing this
+ test, a running domain is required.
+ libvirtd:qemu_hang
+ guestname
+ #GUESTNAME#
+"""
+
+__author__ = 'Wayne Sun: gsun@xxxxxxxxxx'
+__date__ = 'Thu Sep 2, 2011'
+__version__ = '0.1.0'
+__credits__ = 'Copyright (C) 2011 Red Hat, Inc.'
+__all__ = ['qemu_hang']
+
+import os
+import re
+import sys
+
+def append_path(path):
+ """Append root path of package"""
+ if path not in sys.path:
+ sys.path.append(path)
+
+pwd = os.getcwd()
+result = re.search('(.*)libvirt-test-API', pwd)
+append_path(result.group(0))
+
+from lib import connectAPI
+from lib import domainAPI
+from utils.Python import utils
+
+VIRSH_LIST = "virsh list --all"
+RESTART_CMD = "service libvirtd restart"
+
+def check_params(params):
+ """Verify inputing parameter dictionary"""
+ logger = params['logger']
+ keys = ['guestname']
+ for key in keys:
+ if key not in params:
+ logger.error("%s is required" %key)
+ return 1
+ return 0
+
+def check_domain_running(domobj, guestname, logger):
+ """ check if the domain exists, may or may not be active """
+ guest_names = domobj.get_list()
+
+ if guestname not in guest_names:
+ logger.error("%s doesn't exist or not running" % guestname)
+ return 1
+ else:
+ return 0
+
+def libvirtd_check(util, logger):
+ """check libvirtd status
+ """
+ cmd = "service libvirtd status"
+ ret, out = util.exec_cmd(cmd, shell=True)
+ if ret != 0:
+ logger.error("failed to get libvirtd status")
+ return 1
+ else:
+ logger.info(out[0])
+
+ logger.info(VIRSH_LIST)
+ ret, out = util.exec_cmd(VIRSH_LIST, shell=True)
+ if ret != 0:
+ logger.error("failed to get virsh list result")
+ return 1
+ else:
+ for i in range(len(out)):
+ logger.info(out[i])
+
+ return 0
+
+def get_domain_pid(util, logger, guestname):
+ """get the pid of running domain"""
+ logger.info("get the pid of running domain %s" % guestname)
+ get_pid_cmd = "cat /var/run/libvirt/qemu/%s.pid" % guestname
+ ret, pid = util.exec_cmd(get_pid_cmd, shell=True)
+ if ret:
+ logger.error("fail to get the pid of runnings domain %s" % \
+ guestname)
+ return 1, ""
+ else:
+ logger.info("the pid of domain %s is %s" % \
+ (guestname, pid[0]))
+ return 0, pid[0]
+
+def qemu_hang(params):
+ """Hang qemu process, check libvirtd status"""
+ # Initiate and check parameters
+ params_check_result = check_params(params)
+ if params_check_result:
+ return 1
+
+ logger = params['logger']
+ guestname = params['guestname']
+ util = utils.Utils()
+ uri = util.get_uri('127.0.0.1')
+
+ conn = connectAPI.ConnectAPI()
+ virconn = conn.open(uri)
+ domobj = domainAPI.DomainAPI(virconn)
+
+ logger.info("check the domain state")
+ ret = check_domain_running(domobj, guestname, logger)
+ if ret:
+ return 1
+
+ conn.close()
+
+ logger.info("check the libvirtd status:")
+ result = libvirtd_check(util, logger)
+ if result:
+ return 1
+
+ ret, pid = get_domain_pid(util, logger, guestname)
+ if ret:
+ return 1
+
+ cmd = "kill -STOP %s" % pid
+ logger.info(cmd)
+ ret, out = util.exec_cmd(cmd, shell=True)
+ if ret:
+ logger.error("failed to stop qemu process of %s" % guestname)
+ return 1
+
It should be "kill -SIGSTOP $pid"
The better to check the state of a process is by "ps aufx |
grep qemu"
In the ps output, the stopped processes will have a status
containing "T" like;
qemu 28653 0.2 0.5 771468 21596 ? Tl Sep13
7:17 /usr/libexec/qemu-kvm ...
+ logger.info("recheck libvirtd status:")
+ result = libvirtd_check(util, logger)
+ if result:
+ return 1
+
+ return 0
+
+def qemu_hang_cleanup(params):
+ """ clean testing environment """
+ pass
+
+
ACK and pushed with these fixed.
--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list