[libvirt] [PATCH 2/2] Add new testcase for cpu topology testing

Guannan Ren gren at redhat.com
Thu Sep 1 02:19:25 UTC 2011


    *repos/domain/cpu_topology.py
---
 repos/domain/cpu_topology.py |  248 ++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 248 insertions(+), 0 deletions(-)
 create mode 100644 repos/domain/cpu_topology.py

diff --git a/repos/domain/cpu_topology.py b/repos/domain/cpu_topology.py
new file mode 100644
index 0000000..7202559
--- /dev/null
+++ b/repos/domain/cpu_topology.py
@@ -0,0 +1,248 @@
+#!/usr/bin/env python
+""" To test guest cpu topology
+    domain:cpu_topology
+        guestname
+            xxx
+        username
+            root
+        password
+            xxxxxx
+        sockets
+            2
+        cores
+            1
+        threads
+            2
+"""
+
+__author__ = 'Guannan Ren: gren at redhat.com'
+__date__ = 'Tue Aug 30, 2011'
+__version__ = '0.1.0'
+__credits__ = 'Copyright (C) 2011 Red Hat, Inc.'
+__all__ = []
+
+import os
+import re
+import sys
+import time
+from xml.dom import minidom
+
+def append_path(path):
+    """Append root path of package"""
+    if path in sys.path:
+        pass
+    else:
+        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
+from exception import LibvirtAPI
+
+def check_params(params):
+    """check out the arguments requried for testing"""
+    logger = params['logger']
+    keys = ['guestname', 'username', 'password',
+            'sockets', 'cores', 'threads']
+    for key in keys:
+        if key not in params:
+            logger.error("Argument %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"""
+    defined_guest_names = domobj.get_defined_list()
+
+    if guestname not in defined_guest_names:
+        logger.error("%s doesn't exist or still in running" % guestname)
+        return 1
+    else:
+        return 0
+
+def add_cpu_xml(domobj, guestname, sockets, cores, threads, logger):
+    """edit domain xml description and insert <cpu> element"""
+
+    guestxml = domobj.get_xml_desc(guestname)
+    logger.debug('''original guest %s xml :\n%s''' %(guestname, guestxml))
+
+    doc = minidom.parseString(guestxml)
+    cpu = doc.createElement('cpu')
+    topology = doc.createElement('topology')
+    topology.setAttribute('sockets', sockets)
+    topology.setAttribute('cores', cores)
+    topology.setAttribute('threads', threads)
+    cpu.appendChild(topology)
+
+    vcpuval = int(sockets) * int(cores) * int(threads)
+    newvcpu = doc.createElement('vcpu')
+    newvcpuval = doc.createTextNode(str(vcpuval))
+    newvcpu.appendChild(newvcpuval)
+    oldvcpu = doc.getElementsByTagName('vcpu')[0]
+
+    domain = doc.getElementsByTagName('domain')[0]
+    domain.appendChild(cpu)
+    domain.replaceChild(newvcpu, oldvcpu)
+
+    return doc.toxml()
+
+def guest_undefine(domobj, guestname, logger):
+    """undefine original guest"""
+    try:
+        logger.info("undefine guest")
+        domobj.undefine(guestname)
+        logger.info("undefine the domain is successful")
+    except LibvirtAPI, e:
+        logger.error("API error message: %s, error code is %s" % \
+                     (e.response()['message'], e.response()['code']))
+        logger.error("fail to undefine domain")
+        return 1
+
+    return 0
+
+def guest_define(domobj, domxml, logger):
+    """define new guest xml"""
+    try:
+        logger.info("define guest")
+        domobj.define(domxml)
+        logger.info("success to define new domain xml description")
+    except LibvirtAPI, e:
+        logger.error("API error message: %s, error code is %s" % \
+                     (e.response()['message'], e.response()['code']))
+        logger.error("fail to define domain")
+        return 1
+
+    return 0
+
+def guest_start(domobj, guestname, util, logger):
+    """start guest"""
+    timeout = 600
+    ip = ''
+    mac = util.get_dom_mac_addr(guestname)
+
+    try:
+        logger.info("start guest")
+        domobj.start(guestname)
+    except LibvirtAPI, e:
+        logger.error("API error message: %s, error code is %s" % \
+                     (e.response()['message'], e.response()['code']))
+        logger.error("fail to start domain")
+        return 1
+
+    while timeout:
+        time.sleep(10)
+        timeout -= 10
+
+        ip = util.mac_to_ip(mac, 180)
+
+        if not ip:
+            logger.info(str(timeout) + "s left")
+        else:
+            logger.info("vm %s power on successfully" % guestname)
+            logger.info("the ip address of vm %s is %s" % (guestname, ip))
+            break
+
+    if timeout <= 0:
+        logger.info("fail to power on vm %s" % guestname)
+        return 1, ip
+
+    return 0, ip
+
+def cpu_topology_check(ip, username, password,
+                       sockets, cores, threads, util, logger):
+    """login the guest, run lscpu command to check the result"""
+    lscpu = "lscpu"
+    # sleep for 5 seconds
+    time.sleep(40)
+    ret, output = util.remote_exec_pexpect(ip, username, password, lscpu)
+    logger.debug("lscpu:")
+    logger.debug(output)
+    if ret:
+        logger.error("failed to run lscpu on guest OS")
+        return 1
+
+    int = 0
+    actual_thread = actual_core = actual_socket = ''
+
+    for item in output.strip().split('\r'):
+        if int == 5:
+            actual_thread = item.split()[-1]
+            logger.info("the actual thread in the guest is %s" % actual_thread)
+        if int == 6:
+            actual_core = item.split()[-1]
+            logger.info("the actual core in the guest is %s" % actual_core)
+        if int == 7:
+            actual_socket = item.split()[-1]
+            logger.info("the actual socket in the guest is %s" % actual_socket)
+
+        int += 1
+
+    if actual_thread == '' or actual_core == '' or actual_socket == '':
+       logger.error("No data was retrieved")
+       return 1
+
+    if actual_thread == threads and actual_core == cores and actual_socket == sockets:
+       return 0
+    else:
+       logger.error("The data doesn't match!!!")
+       return 1
+
+def cpu_topology(params):
+    """ edit domain xml description according to the values
+        and login to the guest to check the results
+    """
+    logger = params['logger']
+    params_check_result = check_params(params)
+    if params_check_result:
+        return 1
+
+    guestname = params['guestname']
+    username = params['username']
+    password = params['password']
+    sockets = params['sockets']
+    cores = params['cores']
+    threads = params['threads']
+
+    logger.info("guestname is %s" % guestname)
+    logger.info("sockets is %s" % sockets)
+    logger.info("cores is %s" % cores)
+    logger.info("threads is %s" % threads)
+
+    util = utils.Utils()
+    uri = util.get_uri('127.0.0.1')
+
+    logger.info("the uri is %s" % uri)
+    conn = connectAPI.ConnectAPI()
+    virconn = conn.open(uri)
+    domobj = domainAPI.DomainAPI(virconn)
+
+    if check_domain_running(domobj, guestname, logger):
+        conn.close()
+        return 1
+
+    domxml = add_cpu_xml(domobj, guestname, sockets, cores, threads, logger)
+
+    if guest_undefine(domobj, guestname, logger):
+        conn.close()
+        return 1
+
+    if guest_define(domobj, domxml, logger):
+        conn.close()
+        return 1
+
+    ret, ip = guest_start(domobj, guestname, util, logger)
+    if ret:
+        conn.close()
+        return 1
+
+    if cpu_topology_check(ip, username, password,
+                          sockets, cores, threads, util, logger):
+       conn.close()
+       return 1
+
+    conn.close()
+    return 0
-- 
1.7.1




More information about the libvir-list mailing list