From: Satheesh Rajendran <sathn...@linux.vnet.ibm.com> libvirt autotest patch to test virsh vcpupin command which in turn covers vcpuinfo,vcpucount commands This test covers the following git hub issue https://github.com/autotest/autotest/issues/464 Includes the test for cpu affinity in the respective proc entry also.
Signed-off-by: Satheesh Rajendran <sathn...@linux.vnet.ibm.com> --- client/tests/libvirt/tests/virsh_vcpupin.py | 126 +++++++++++++++++++++++++++ client/virt/libvirt_vm.py | 32 +++++++ client/virt/subtests.cfg.sample | 3 + 3 files changed, 161 insertions(+), 0 deletions(-) create mode 100644 client/tests/libvirt/tests/virsh_vcpupin.py diff --git a/client/tests/libvirt/tests/virsh_vcpupin.py b/client/tests/libvirt/tests/virsh_vcpupin.py new file mode 100644 index 0000000..1f6cfc3 --- /dev/null +++ b/client/tests/libvirt/tests/virsh_vcpupin.py @@ -0,0 +1,126 @@ +import logging, re, os, commands, string, math +from autotest.client.shared import utils, error +from autotest.client.virt import libvirt_vm + +def run_virsh_vcpupin(test, params, env): + + """ + Test the command virsh hostname + + (1) Get the host and guest cpu count + (2) Call virsh vcpupin for each vcpu with pinning of each cpu + (3) Check whether the virsh vcpupin has pinned the respective vcpu to cpu + (4) TODO: Right now the testcase covers the pinning one cpu at a time + this can be improved by a random number of cpus + """ + + # Initialize the variables + expected_affinity = [] + total_affinity = [] + actual_affinity = [] + + def build_actual_info(domname,vcpu): + + """ + This function returns list of the vcpu's affinity from + virsh vcpuinfo output + + @param: domname: VM Name to operate on + @param: vcpu: vcpu number for which the affinity is required + """ + output = libvirt_vm.virsh_vcpuinfo(domname) + cmd = re.findall('[^Affinity:][-y]+', str(output)) + total_affinity = cmd[vcpu].lstrip() + actual_affinity = list(total_affinity) + return actual_affinity + + def build_expected_info(vcpu,cpu): + + """ + This function returns the list of vcpu's expected affinity build + + @param: vcpu: vcpu number for which the affinity is required + @param: cpu: cpu details for the affinity + """ + expected_affinity = [] + + for i in range(int(host_cpu_count)): + expected_affinity.append('y') + + for i in range(int(host_cpu_count)): + if cpu != i: + expected_affinity[i] = '-' + + expected_affinity_proc = int(math.pow(2,cpu)) + return expected_affinity,expected_affinity_proc + + def guest_vcpu_pids(domname): + + """ + This function gets the pids of vcpu + """ + cmd = "virsh qemu-monitor-command %s --hmp 'info cpus'" % domname + output_2 = utils.run(cmd, ignore_status=False) + output_3 = re.findall(r'thread_id=(\d+)', output_2.stdout) + return output_3 + + def virsh_check_vcpupin(domname,vcpu,cpu,pid): + + """ + This function checks the actual and the expected affinity of given vcpu + and raises error if not matchs + + @param: domname: VM Name to operate on + @param: vcpu: vcpu number for which the affinity is required + @param: cpu: cpu details for the affinity + """ + expected_output,expected_output_proc = build_expected_info(vcpu,cpu) + actual_output = build_actual_info(domname,vcpu) + + # Get the vcpus pid + vcpus_pid = guest_vcpu_pids(domname) + vcpu_pid=vcpus_pid[vcpu] + + # Get the actual cpu affinity value in the proc entry + cmd = "cat /proc/%s/task/%s/status|grep Cpus_allowed:| awk '{print $2}'" % (pid,vcpu_pid) + output = str(utils.run(cmd, ignore_status=False).stdout) + actual_output_proc = int(output,16) + + if expected_output == actual_output: + logging.info("successfully pinned cpu: %s --> vcpu: %s", cpu,vcpu) + else: + raise error.TestFail("Command 'virsh vcpupin %s %s %s'not succeeded" + ", cpu pinning details not updated properly in" + " virsh vcpuinfo command output" + % (vm_name,vcpu,cpu)) + + if expected_output_proc == actual_output_proc: + logging.info("successfully pinned cpu: %s --> vcpu: %s" + " in respective proc entry" + ,cpu,vcpu) + else: + raise error.TestFail("Command 'virsh vcpupin %s %s %s'not succeeded" + " cpu pinning details not updated properly in" + " /proc/%s/task/%s/status" + %(vm_name,vcpu,cpu,pid,vcpu_pid)) + + + # Get the vm name, pid of vm and check for alive + vm_name = params.get("main_vm") + vm = env.get_vm(params["main_vm"]) + vm.verify_alive() + pid = vm.get_pid() + + # Get the host cpu count + cmd = "cat /proc/cpuinfo |grep processor|wc -l" + host_cpu_count_result = utils.run(cmd, ignore_status=False) + host_cpu_count = host_cpu_count_result.stdout.strip() + + # Get the guest vcpu count + guest_vcpu_count = libvirt_vm.virsh_vcpucount_live(vm_name) + + # Run test case + for vcpu in range(int(guest_vcpu_count)): + for cpu in range(int(host_cpu_count)): + libvirt_vm.virsh_vcpupin(vm_name,vcpu,cpu) + virsh_check_vcpupin(vm_name,vcpu,cpu,pid) diff --git a/client/virt/libvirt_vm.py b/client/virt/libvirt_vm.py index 4e27482..a631249 100644 --- a/client/virt/libvirt_vm.py +++ b/client/virt/libvirt_vm.py @@ -116,6 +116,38 @@ def virsh_cmd(cmd, uri="", ignore_status=False, print_info=False): return ret +def virsh_vcpupin(domname,vcpu,cpu,uri="",ignore_status=False,print_info=False): + + """ + Changes the cpu affinity for respective vcpu. + """ + try: + cmd_vcpupin = "vcpupin %s %s %s" % (domname,vcpu,cpu) + virsh_cmd(cmd_vcpupin,uri) + + except error.CmdError, detail: + logging.error("Virsh vcpupin VM %s failed:\n%s", name, detail) + return False + + +def virsh_vcpuinfo(domname,uri="",ignore_status=False,print_info=False): + + """ + Prints the vcpuinfo of a given domain. + """ + cmd_vcpuinfo = "vcpuinfo %s" % domname + return virsh_cmd(cmd_vcpuinfo,uri).stdout.strip() + + +def virsh_vcpucount_live(domname,uri="",ignore_status=False,print_info=False): + + """ + Prints the vcpucount of a given domain. + """ + cmd_vcpucount = "vcpucount --live --active %s" % domname + return virsh_cmd(cmd_vcpucount,uri).stdout.strip() + + def virsh_freecell(uri = "", ignore_status=False, extra = ""): """ Prints the available amount of memory on the machine or within a NUMA cell. diff --git a/client/virt/subtests.cfg.sample b/client/virt/subtests.cfg.sample index 785077b..320a577 100644 --- a/client/virt/subtests.cfg.sample +++ b/client/virt/subtests.cfg.sample @@ -212,6 +212,9 @@ variants: status_error = "yes" libvirtd = "off" + - virsh_vcpupin: install setup image_copy unattended_install.cdrom + type = virsh_vcpupin + - virsh_version: install setup image_copy unattended_install.cdrom type = virsh_version vms = '' -- 1.7.5.4 _______________________________________________ Autotest mailing list Autotest@test.kernel.org http://test.kernel.org/cgi-bin/mailman/listinfo/autotest