def output_check(nodeinfo_output): # Check CPU model cpu_model_nodeinfo = _check_nodeinfo(nodeinfo_output, "CPU model", 3) cpu_model_os = utils.get_current_kernel_arch() if not re.match(cpu_model_nodeinfo, cpu_model_os): raise error.TestFail("Virsh nodeinfo output didn't match CPU model") # Check number of CPUs cpus_nodeinfo = _check_nodeinfo(nodeinfo_output, "CPU(s)", 2) cpus_os = utils.count_cpus() if int(cpus_nodeinfo) != cpus_os: raise error.TestFail("Virsh nodeinfo output didn't match number of " "CPU(s)") # Check CPU frequency cpu_frequency_nodeinfo = _check_nodeinfo(nodeinfo_output, 'CPU frequency', 3) cmd = ("cat /proc/cpuinfo | grep 'cpu MHz' | head -n1 | " "awk '{print $4}' | awk -F. '{print $1}'") cmd_result = utils.run(cmd, ignore_status=True) cpu_frequency_os = cmd_result.stdout.strip() print cpu_frequency_os if not re.match(cpu_frequency_nodeinfo, cpu_frequency_os): raise error.TestFail("Virsh nodeinfo output didn't match CPU " "frequency") # Check CPU socket(s) cpu_sockets_nodeinfo = int(_check_nodeinfo(nodeinfo_output, 'CPU socket(s)', 3)) cmd = "grep 'physical id' /proc/cpuinfo | uniq | sort | uniq |wc -l" cmd_result = utils.run(cmd, ignore_status=True) cpu_NUMA_nodeinfo = _check_nodeinfo(nodeinfo_output, 'NUMA cell(s)', 3) cpu_sockets_os = int(cmd_result.stdout.strip())/int(cpu_NUMA_nodeinfo) if cpu_sockets_os != cpu_sockets_nodeinfo: raise error.TestFail("Virsh nodeinfo output didn't match CPU " "socket(s)") # Check Core(s) per socket cores_per_socket_nodeinfo = _check_nodeinfo(nodeinfo_output, 'Core(s) per socket', 4) cmd = "grep 'cpu cores' /proc/cpuinfo | head -n1 | awk '{print $4}'" cmd_result = utils.run(cmd, ignore_status=True) cores_per_socket_os = cmd_result.stdout.strip() if not re.match(cores_per_socket_nodeinfo, cores_per_socket_os): raise error.TestFail("Virsh nodeinfo output didn't match Core(s) " "per socket") # Check Memory size memory_size_nodeinfo = int(_check_nodeinfo(nodeinfo_output, 'Memory size', 3)) memory_size_os = utils.memtotal() if memory_size_nodeinfo != memory_size_os: raise error.TestFail("Virsh nodeinfo output didn't match " "Memory size")
def run_virsh_vcpupin(test, params, env): """ Test the command virsh vcpupin (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 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 = vm.get_vcpus_pid() vcpu_pid=vcpus_pid[vcpu] # Get the actual cpu affinity value in the proc entry output = utils.cpu_affinity_by_task(pid, vcpu_pid) 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 host_cpu_count = utils.count_cpus() # 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)): vm.vcpupin(vcpu, cpu) virsh_check_vcpupin(vm_name, vcpu, cpu, pid)