[libvirt] [test-API][PATCH] Add new cases for testing setSchedulerParametersFlags related API

Xuesong Zhang xuzhang at redhat.com
Thu Dec 12 08:29:31 UTC 2013


---
 cases/sched_params.conf           | 120 +++++++++++++++++++++++++++++++
 repos/domain/sched_params.py      | 136 ++++++++++++++++-------------------
 repos/domain/sched_params_flag.py | 148 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 330 insertions(+), 74 deletions(-)
 create mode 100755 cases/sched_params.conf
 create mode 100644 repos/domain/sched_params_flag.py

diff --git a/cases/sched_params.conf b/cases/sched_params.conf
new file mode 100755
index 0000000..6f7acce
--- /dev/null
+++ b/cases/sched_params.conf
@@ -0,0 +1,120 @@
+domain:install_linux_cdrom
+    guestname
+        $defaultname
+    guestos
+        $defaultos
+    guestarch
+        $defaultarch
+    vcpu
+        $defaultvcpu
+    memory
+        $defaultmem
+    hddriver
+        $defaulthd
+    nicdriver
+        $defaultnic
+    imageformat
+        qcow2
+
+domain:sched_params
+    guestname
+        $defaultname
+    vcpuquota
+        1000
+    vcpuperiod
+        200000
+    emulatorperiod
+        300000
+    emulatorquota
+        4000
+    cpushares
+        5000
+
+domain:sched_params_flag
+    guestname
+        $defaultname
+    vcpuquota
+        1001
+    vcpuperiod
+        200001
+    emulatorperiod
+        300001
+    emulatorquota
+        4001
+    cpushares
+        5001
+    flag
+        current
+
+domain:sched_params_flag
+    guestname
+        $defaultname
+    vcpuquota
+        1002
+    vcpuperiod
+        200002
+    emulatorperiod
+        300002
+    emulatorquota
+        4002
+    cpushares
+        5002
+    flag
+        live
+
+domain:sched_params_flag
+    guestname
+        $defaultname
+    vcpuquota
+        1003
+    vcpuperiod
+        200003
+    emulatorperiod
+        300003
+    emulatorquota
+        4003
+    cpushares
+        5003
+    flag
+        config
+
+domain:destroy
+    guestname
+        $defaultname
+
+domain:sched_params_flag
+    guestname
+        $defaultname
+    vcpuquota
+        1004
+    vcpuperiod
+        200004
+    emulatorperiod
+        300004
+    emulatorquota
+        4004
+    cpushares
+        5004
+    flag
+        current
+
+domain:sched_params_flag
+    guestname
+        $defaultname
+    vcpuquota
+        1005
+    vcpuperiod
+        200005
+    emulatorperiod
+        300005
+    emulatorquota
+        4005
+    cpushares
+        5005
+    flag
+        config
+
+domain:undefine
+    guestname
+        $defaultname
+
diff --git a/repos/domain/sched_params.py b/repos/domain/sched_params.py
index 786e357..1be5986 100644
--- a/repos/domain/sched_params.py
+++ b/repos/domain/sched_params.py
@@ -1,95 +1,83 @@
 #!/usr/bin/evn python
-# To test domain scheduler parameters
-
-import os
-import sys
-import time
-import commands
+# Set and show scheduler parameters
 
 import libvirt
+from libvirt import libvirtError
 
 from src import sharedmod
 from utils import utils
 
-required_params = ('guestname', 'capshares',)
+import os
+
+required_params = ('guestname', 'vcpuquota', 'vcpuperiod', 'emulatorperiod', \
+                   'emulatorquota', 'cpushares',)
 optional_params = {}
 
-def check_guest_status(domobj):
-    """Check guest current status"""
-    state = domobj.info()[0]
-    if state == libvirt.VIR_DOMAIN_SHUTOFF or state == libvirt.VIR_DOMAIN_SHUTDOWN:
-        domobj.create()
-        time.sleep(30)
-    # Add check function
-        return True
+def check_sched_params(guestname, sched_params_after):
+    """Check scheduler parameters validity after setting
+    """
+
+    if os.path.exists("/cgroup"):
+        """ Add the judgment method, since the cgroup path is different on
+            rhel6 and rhel7.
+            if the folder cgroup is existed, it means the host os is rhel6,
+            if not existed, it means the the host of is rhel7
+        """
+
+        cgroup_path = "cat /cgroup/cpu/libvirt/qemu/%s/" % guestname
     else:
-        return True
-
-def check_sched_params(*args):
-    """Check scheduler parameters validity after setting"""
-    hypervisor, dicts, guestname, domobj = args
-    sched_dict = {}
-    if hypervisor == "xen":
-        sched_dict = eval(commands.getoutput('xm sched-credit -d %s'
-                          % guestname))
-        if sched_dict['weight'] == dicts['weight'] and \
-          sched_dict['cap'] == dicts['cap']:
-            return 0
-        else:
+        cgroup_path = "cat /sys/fs/cgroup/cpu\,cpuacct/machine.slice/" \
+                      "machine-qemu\\\\x2d%s.scope/" % guestname
+
+    sched_dicts = {'vcpu_quota': 'vcpu0/cpu.cfs_quota_us', \
+                       'vcpu_period': 'vcpu0/cpu.cfs_period_us', \
+                       'emulator_period': 'emulator/cpu.cfs_period_us', \
+                       'emulator_quota': 'emulator/cpu.cfs_quota_us', \
+                       'cpu_shares': 'cpu.shares'}
+
+    for sched_key in sched_dicts:
+        cmd = cgroup_path + sched_dicts[sched_key]
+        status, cmd_value = utils.exec_cmd(cmd, shell=True)
+        if status:
+            logger.error("failed to get ***%s*** value" % sched_key)
             return 1
-    if hypervisor == "kvm":
-        sched_dict = domobj.schedulerParameters()
-        if sched_dict['cpu_shares'] == dicts['cpu_shares']:
-            return 0
-        else:
+        sched_dicts[sched_key] = int(cmd_value[0])
+        if sched_dicts[sched_key] != sched_params_after[sched_key]:
+            logger.error("set scheduler parameters failed")
             return 1
 
+    logger.info("set scheduler parameters success")
+    return 0
+
 def sched_params(params):
-    """Setting scheduler parameters, argument params is a
-       dictionary data type.which includes 'weight' and 'cap'
-       keys, by assigning different value to 'weight' and 'cap'
-       to verify validity of the result
+    """ Change and get the scheduler parameters
     """
-    hypervisor = utils.get_hypervisor()
 
+    global logger
     logger = params['logger']
     guestname = params['guestname']
-    conn = sharedmod.libvirtobj['conn']
-
-    domobj = conn.lookupByName(guestname)
-
-    if check_guest_status(domobj):
-        sched_params = domobj.schedulerParameters()
-        logger.info("original scheduler parameters: %s\n" % sched_params)
-
-    if 'xen' in hypervisor:
-        str_weight = params['weight']
-        str_cap = params['cap']
-        for wgt in eval(str_weight):
-            for cap in eval(str_cap):
-                dicts = {'weight': wgt, 'cap': cap}
-                logger.info("setting scheduler parameters: %s" % dicts)
-                domobj.setSchedulerParameters(dicts)
-                sched_params = domobj.schedulerParameters()
-                logger.info("current scheduler parameters: %s\n" % sched_params)
-
-                retval = check_sched_params(hypervisor, dicts,
-                                            guestname, domobj)
-                if retval != 0:
-                    return 1
-    elif 'kvm' in hypervisor:
-        cpu_shares = int(params['cpushares'])
-        dicts = {'cpu_shares': cpu_shares}
+    dicts = {'vcpu_quota': int(params['vcpuquota']), \
+             'vcpu_period': int(params['vcpuperiod']), \
+             'emulator_period': int(params['emulatorperiod']), \
+             'emulator_quota': int(params['emulatorquota']), \
+             'cpu_shares': int(params['cpushares'])}
+
+    try:
+        conn = sharedmod.libvirtobj['conn']
+        domobj = conn.lookupByName(guestname)
+
+        sched_type = str(domobj.schedulerType()[0])
+        logger.info("the scheduler type is: %s" % sched_type)
+        sched_params_original = domobj.schedulerParameters()
+        logger.info("original scheduler parameters: %s" % sched_params_original)
         logger.info("setting scheduler parameters: %s" % dicts)
         domobj.setSchedulerParameters(dicts)
-        sched_params = domobj.schedulerParameters()
-        logger.info("current scheduler parameters: %s\n" % sched_params)
-        retval = check_sched_params(hypervisor, dicts,
-                                    guestname, domobj)
-        if retval != 0:
-            return 1
-    else:
-        logger.error("unsupported hypervisor type: %s" % hypervisor)
-        return 1
+        sched_params_after = domobj.schedulerParameters()
+        logger.info("current scheduler parameters: %s" % sched_params_after)
 
-    return 0
+        ret = check_sched_params(guestname, sched_params_after)
+
+        return ret
+    except libvirtError, e:
+        logger.error("libvirt call failed: " + str(e))
+        return 1
diff --git a/repos/domain/sched_params_flag.py b/repos/domain/sched_params_flag.py
new file mode 100644
index 0000000..19bcb13
--- /dev/null
+++ b/repos/domain/sched_params_flag.py
@@ -0,0 +1,148 @@
+#!/usr/bin/evn python
+# Set and show scheduler parameters with flag, such as "--current", "--live"
+# and "--config"
+
+import libvirt
+from libvirt import libvirtError
+
+from src import sharedmod
+from utils import utils
+from xml.dom import minidom
+import os
+
+required_params = ('guestname', 'vcpuquota', 'vcpuperiod', 'emulatorperiod', \
+                   'emulatorquota', 'cpushares', 'flag',)
+optional_params = {}
+
+def check_sched_params_flag(guestname, domobj, sched_params_after, domstate, \
+                            flags_value):
+    """Check scheduler parameters validity after setting
+    """
+
+    if (domstate == 1) and ((flags_value == 0) or (flags_value == 1)):
+        """While the domain is running and the flag is "--live" or "--current",
+           the value can be checked with the cgroup value
+           As for the other condition, the value can be checked with the domain
+           config xml
+        """
+
+        if os.path.exists("/cgroup"):
+            """ Add the judgment method, since the cgroup path is different on
+                rhel6 and rhel7.
+                if the folder cgroup is existed, it means the host os is rhel6,
+                if not existed, it means the the host of is rhel7
+            """
+
+            cgroup_path = "cat /cgroup/cpu/libvirt/qemu/%s/" % guestname
+        else:
+            cgroup_path = "cat /sys/fs/cgroup/cpu\,cpuacct/machine.slice/" \
+                          "machine-qemu\\\\x2d%s.scope/" % guestname
+
+        sched_dicts = {'vcpu_quota': 'vcpu0/cpu.cfs_quota_us', \
+                       'vcpu_period': 'vcpu0/cpu.cfs_period_us', \
+                       'emulator_period': 'emulator/cpu.cfs_period_us', \
+                       'emulator_quota': 'emulator/cpu.cfs_quota_us', \
+                       'cpu_shares': 'cpu.shares'}
+
+        for sched_key in sched_dicts:
+            cmd = cgroup_path + sched_dicts[sched_key]
+            status, cmd_value = utils.exec_cmd(cmd, shell=True)
+            if status:
+                logger.error("failed to get ***%s*** value" % sched_key)
+                return 1
+            sched_dicts[sched_key] = int(cmd_value[0])
+            if sched_dicts[sched_key] != sched_params_after[sched_key]:
+                logger.error("set scheduler parameters failed")
+                return 1
+
+    else:
+        guestxml = domobj.XMLDesc(libvirt.VIR_DOMAIN_XML_INACTIVE)
+        logger.debug("domain %s config xml :\n%s" % (domobj.name(), guestxml))
+
+        xmlrootnode = minidom.parseString(guestxml)
+
+        sched_dicts = {'vcpu_quota': 'quota', 'vcpu_period': 'period', \
+                       'emulator_period': 'emulator_period', \
+                       'emulator_quota': 'emulator_quota', \
+                       'cpu_shares': 'shares'}
+
+        for sched_key in sched_dicts:
+            node = xmlrootnode.getElementsByTagName(sched_dicts[sched_key])[0]
+            sched_dicts[sched_key] = int(node.childNodes[0].data)
+            if sched_dicts[sched_key] != sched_params_after[sched_key]:
+                logger.error("set scheduler parameters failed")
+                return 1
+
+    logger.info("set scheduler parameters success")
+    return 0
+
+def sched_params_flag(params):
+    """ Change and get the scheduler parameters
+    """
+
+    global logger
+    logger = params['logger']
+    guestname = params['guestname']
+    dicts = {'vcpu_quota': int(params['vcpuquota']), \
+             'vcpu_period': int(params['vcpuperiod']), \
+             'emulator_period': int(params['emulatorperiod']), \
+             'emulator_quota': int(params['emulatorquota']), \
+             'cpu_shares': int(params['cpushares'])}
+    flags = params['flag']
+
+    try:
+        conn = sharedmod.libvirtobj['conn']
+        domobj = conn.lookupByName(guestname)
+
+        domstate = domobj.state(0)[0]
+        """following is the domain state:
+           '1' is running status
+           '5' is shutoff status
+           please see the following reference link:
+           http://libvirt.org/html/libvirt-libvirt.html#virDomainState
+        """
+        if domstate == 1:
+            logger.info("the state of virtual machine is ***running***")
+        elif domstate == 5:
+            logger.info("the state of virtual machine is ***shutoff***")
+        else:
+            logger.error("the state of virtual machine is not running or " \
+                         "shutoff now, it is out of the check range of this " \
+                         "script. Please check the domain status.")
+            return 1
+
+        """virDomainModificationImpact
+           VIR_DOMAIN_AFFECT_CURRENT = 0
+           VIR_DOMAIN_AFFECT_LIVE = 1
+           VIR_DOMAIN_AFFECT_CONFIG = 2
+        """
+
+        if flags == "current":
+            flags_value = libvirt.VIR_DOMAIN_AFFECT_CURRENT
+        elif flags == "live":
+            flags_value = libvirt.VIR_DOMAIN_AFFECT_LIVE
+        elif flags == "config":
+            flags_value = libvirt.VIR_DOMAIN_AFFECT_CONFIG
+        else:
+            logger.error("the value of flags is not correct, please check " \
+                         "the conf file")
+            return 1
+
+        sched_type = str(domobj.schedulerType()[0])
+        logger.info("the scheduler type is: %s" % sched_type)
+        sched_params_original = domobj.schedulerParametersFlags(flags_value)
+        logger.info("original scheduler parameters with flag ***%s***: %s" % \
+                    (flags, sched_params_original))
+        logger.info("setting scheduler parameters: %s" % dicts)
+        domobj.setSchedulerParametersFlags(dicts, flags_value)
+        sched_params_after = domobj.schedulerParametersFlags(flags_value)
+        logger.info("current scheduler parameters with flag ***%s***: %s" % \
+                    (flags, sched_params_after))
+
+        ret = check_sched_params_flag(guestname, domobj, sched_params_after, \
+                                      domstate, flags_value)
+
+        return ret
+    except libvirtError, e:
+        logger.error("libvirt call failed: " + str(e))
+        return 1
-- 
1.8.3.1




More information about the libvir-list mailing list