On 07/23/2012 12:39 PM, sathn...@linux.vnet.ibm.com wrote: > 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 > > Signed-off-by: Satheesh Rajendran<sathn...@linux.vnet.ibm.com> > --- > client/tests/libvirt/tests/virsh_vcpupin.py | 86 > +++++++++++++++++++++++++++ > client/virt/libvirt_vm.py | 28 +++++++++ > client/virt/subtests.cfg.sample | 3 + > 3 files changed, 117 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..bae0596 > --- /dev/null > +++ b/client/tests/libvirt/tests/virsh_vcpupin.py > @@ -0,0 +1,86 @@ > +import logging, re, os, commands, string > +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 it 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 = [] > + d = {} > + > + def build_actual_info(domname,vcpu): Code style, to use 1 whitespace to separate function parameters. > + """ > + 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): Code style. > + """ > + 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] = '-' > + d[vcpu] = expected_affinity > + return d > + > + def virsh_check_vcpupin(domname,vcpu,cpu): Code style. > + """ > + 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 = build_expected_info(vcpu,cpu) > + actual_output = build_actual_info(domname,vcpu) Code style. > + if expected_output[vcpu] == actual_output: Not enough, test case should actually check whether cpu is correctly pinned with host cpu, as usual, you may check /proc/$domain_pid/task/*/status then find 'Cpus_allowed_list' or something like that, you will get a actual host cpu pin list. > + logging.info("successfully pinned cpu:%s --> vcpu:%s", cpu,vcpu) Code style. > + else: > + raise error.TestFail("Command 'virsh vcpupin %s %s %s' not > succeeded " > + % > (vm_name,vcpu,cpu)) Code style. > + > + # Get the vm name > + vm_name = params.get("main_vm") > + vm = env.get_vm(params["main_vm"]) > + vm.verify_alive() > + > + # 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) Code style. > diff --git a/client/virt/libvirt_vm.py b/client/virt/libvirt_vm.py > index 9a06f05..d6f1c76 100644 > --- a/client/virt/libvirt_vm.py > +++ b/client/virt/libvirt_vm.py > @@ -116,6 +116,34 @@ 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): Code style. > + """ > + Changes the cpu affinity for respective vcpu. > + """ > + try: > + cmd_vcpupin = "vcpupin %s %s %s" % (domname,vcpu,cpu) > + virsh_cmd(cmd_vcpupin,uri) Code style. > + 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): Code style. > + """ > + 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): Code style. > + """ > + Prints the vcpucount of a given domain. > + """ > + cmd_vcpucount = "vcpucount --live --active %s" % domname > + return virsh_cmd(cmd_vcpucount,uri).stdout.strip() Code style. > + > + > 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 45b6277..1162178 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 = ''
_______________________________________________ Autotest mailing list Autotest@test.kernel.org http://test.kernel.org/cgi-bin/mailman/listinfo/autotest