def check_emulatorpin(params): """ Check emulator affinity :params: the parameter dictionary """ dicts = {} vm = params.get("vm") vm_name = params.get("main_vm") cpu_list = params.get("cpu_list") cgconfig = params.get("cgconfig", "on") options = params.get("emulatorpin_options") result = virsh.emulatorpin(vm_name) cmd_output = result.stdout.strip().splitlines() logging.debug(cmd_output) # Parsing command output and putting them into python dictionary. for l in cmd_output[2:]: k, v = l.split(':') dicts[k.strip()] = v.strip() logging.debug(dicts) emulator_from_cmd = dicts['*'] emulatorpin_from_xml = "" # To change a running guest with 'config' option, which will affect # next boot, if don't shutdown the guest, we need to run virsh dumpxml # with 'inactive' option to get guest XML changes. if options == "config" and vm and not vm.is_alive(): emulatorpin_from_xml = \ vm_xml.VMXML().new_from_dumpxml(vm_name, "--inactive").emulatorpin else: emulatorpin_from_xml = \ vm_xml.VMXML().new_from_dumpxml(vm_name).emulatorpin # To get guest corresponding emulator/cpuset.cpus value # from cpuset controller of the cgroup. if cgconfig == "on" and vm and vm.is_alive(): emulatorpin_from_cgroup = get_emulatorpin_from_cgroup(params) logging.debug("The emulatorpin value from " "cgroup: %s", emulatorpin_from_cgroup) # To check specified cpulist value with virsh command output # and/or cpuset.cpus from cpuset controller of the cgroup. if cpu_list: if vm and vm.is_alive() and options != "config": if (cpu_list != cpus_parser(emulator_from_cmd)) or \ (cpu_list != cpus_parser(emulatorpin_from_cgroup)): logging.error("To expect emulatorpin %s: %s", cpu_list, emulator_from_cmd) return False else: if cpu_list != cpus_parser(emulatorpin_from_xml): logging.error("To expect emulatorpin %s: %s", cpu_list, emulatorpin_from_xml) return False return True
def check_numatune_xml(params): """ Compare mode and nodeset value with guest XML configuration :params: the parameter dictionary """ vm_name = params.get("vms") mode = params.get("numa_mode", "") nodeset = params.get("numa_nodeset", "") options = params.get("options", "") # --config option will act after vm shutdown. if options == "config": virsh.shutdown(vm_name) # The verification of the numa params should # be done when vm is running. if not virsh.is_alive(vm_name): virsh.start(vm_name) numa_params = libvirt_xml.VMXML.get_numa_params(vm_name) if not numa_params: logging.error("Could not get numa parameters for %s", vm_name) return False mode_from_xml = numa_params["mode"] # if the placement is auto, there is no nodeset in numa param. try: nodeset_from_xml = numa_params["nodeset"] except KeyError(): nodeset_from_xml = "" if mode and mode != mode_from_xml: logging.error("To expect %s: %s", mode, mode_from_xml) return False # The actual nodeset value is different with guest XML configuration, # so need to compare them via a middle result, for example, if you # set nodeset is '0,1,2' then it will be a list '0-2' in guest XML nodeset = cpus_parser(nodeset) nodeset_from_xml = cpus_parser(nodeset_from_xml) if nodeset and nodeset != nodeset_from_xml: logging.error("To expect %s: %s", nodeset, nodeset_from_xml) return False return True
def check_numatune_xml(params): """ Compare mode and nodeset value with guest XML configuration :params: the parameter dictionary """ vm_name = params.get("vms") mode = params.get("numa_mode", "") nodeset = params.get("numa_nodeset", "") options = params.get("options", "") #--config option will act after vm shutdown. if options == "config": virsh.shutdown(vm_name) # The verification of the numa params should # be done when vm is running. if not virsh.is_alive(vm_name): virsh.start(vm_name) numa_params = libvirt_xml.VMXML.get_numa_params(vm_name) if not numa_params: logging.error("Could not get numa parameters for %s", vm_name) return False mode_from_xml = numa_params['mode'] # if the placement is auto, there is no nodeset in numa param. try: nodeset_from_xml = numa_params['nodeset'] except KeyError(): nodeset_from_xml = "" if mode and mode != mode_from_xml: logging.error("To expect %s: %s", mode, mode_from_xml) return False # The actual nodeset value is different with guest XML configuration, # so need to compare them via a middle result, for example, if you # set nodeset is '0,1,2' then it will be a list '0-2' in guest XML nodeset = cpus_parser(nodeset) nodeset_from_xml = cpus_parser(nodeset_from_xml) if nodeset and nodeset != nodeset_from_xml: logging.error("To expect %s: %s", nodeset, nodeset_from_xml) return False return True
def set_numa_parameter(params): """ Set the numa parameters :params: the parameter dictionary """ vm_name = params.get("vms") mode = params.get("numa_mode") nodeset = params.get("numa_nodeset") options = params.get("options", None) start_vm = params.get("start_vm", "yes") # Don't use libvirt_xml here because testing numatune command result = virsh.numatune(vm_name, mode, nodeset, options, debug=True) status = result.exit_status # Check status_error status_error = params.get("status_error", "no") # For a running domain, the mode can't be changed, and the nodeset can # be changed only the domain was started with a mode of 'strict' if mode == "strict" and start_vm == "yes": status_error = "no" # TODO, the '--config' option will affect next boot, and if the guest # is shutoff status, the '--current' option will be equivalent to # '--config', if users give a specified nodeset range is more than # host NUMA nodes, and use virsh numatune with '--config' or '--current' # option to set the invalid nodeset to a guest with shutoff status, and # then virsh numatune will return 0 rather than 1, because the libvirt just # check it when starting the guest, however, the current virsh.start() # can't meet this requirement. if status_error == "yes": if status: logging.info("It's an expected error") else: raise error.TestFail("Unexpected return code %d" % status) elif status_error == "no": if status: if len(cpus_parser(nodeset)) > num_numa_nodes(): raise error.TestNAError("Host does not support requested" " nodeset") else: raise error.TestFail(result.stderr) else: if check_numatune_xml(params): logging.info(result.stdout) else: raise error.TestFail("The 'mode' or/and 'nodeset' are" " inconsistent with numatune XML")
def run_virsh_emulatorpin(test, params, env): """ Test emulatorpin tuning 1) Positive testing 1.1) get the current emulatorpin parameters for a running/shutoff guest 1.2) set the current emulatorpin parameters for a running/shutoff guest 2) Negative testing 2.1) get emulatorpin parameters for a running/shutoff guest 2.2) set emulatorpin parameters running/shutoff guest """ # Run test case vm_name = params.get("main_vm") vm = env.get_vm(vm_name) cgconfig = params.get("cgconfig", "on") cpulist = params.get("emulatorpin_cpulist") status_error = params.get("status_error", "no") change_parameters = params.get("change_parameters", "no") test_dicts = dict(params) test_dicts['vm'] = vm host_cpus = int(open('/proc/cpuinfo').read().count('processor')) test_dicts['host_cpus'] = host_cpus cpu_list = None if cpulist: cpu_list = cpus_parser(cpulist) test_dicts['cpu_list'] = cpu_list logging.debug("CPU list is %s", cpu_list) # If the physical CPU N doesn't exist, it's an expected error if cpu_list and max(cpu_list) > host_cpus - 1: test_dicts["status_error"] = "yes" # positive and negative testing ######### if status_error == "no": if change_parameters == "no": get_emulatorpin_parameter(test_dicts) else: set_emulatorpin_parameter(test_dicts) cg = utils_cgroup.CgconfigService() if cgconfig == "off": if cg.cgconfig_is_running(): cg.cgconfig_stop() if status_error == "yes": if change_parameters == "no": get_emulatorpin_parameter(test_dicts) else: set_emulatorpin_parameter(test_dicts) # Recover cgconfig and libvirtd service if not cg.cgconfig_is_running(): cg.cgconfig_restart()() utils_libvirtd.service_libvirtd_control("restart")