def get_ovmf_path(): """ Retrieve the ovmf path in virsh domcapabilities :returns: str, ovmf path, otherwise None """ domcapa_xml = domcapability_xml.DomCapabilityXML() ovmf_nodes = domcapa_xml.xmltreefile.findall('/os/loader/value') if not ovmf_nodes: return None return ovmf_nodes[0].text
def get_domcapa_xml(extract=False): """ Get full domcapabilities xml or the cpu definition from domcapabilities xml :param extract: Setting True will extract cpu definition from domcapabilities xml :return: The instance of DomCapabilityXML """ domcapa_xml = domcapability_xml.DomCapabilityXML() if extract: domcapa_xml.xmltreefile = domcapa_xml.xmltreefile.reroot('/cpu') return domcapa_xml
def get_cpu_features(): """ Get all supported CPU features :return: list of feature string """ features = [] dom_capa = domcapability_xml.DomCapabilityXML() modelname = dom_capa.get_hostmodel_name() for item in dom_capa.get_additional_feature_list('host-model'): for key, value in item.items(): if value == 'require': features.append(key) return list(set(features) | set(cpu.get_model_features(modelname)))
def update_cpu_xml(): """ Update cpu xml for test """ vmxml = vm_xml.VMXML.new_from_inactive_dumpxml(vm_name) # Create cpu xml for test if vmxml.xmltreefile.find('cpu'): cpu_xml = vmxml.cpu else: cpu_xml = vm_xml.VMCPUXML() if customize_cpu_features: for idx in range(len(cpu_xml.get_feature_list()) - 1, -1, -1): cpu_xml.remove_feature(idx) domcapa_xml = domcapability_xml.DomCapabilityXML() features = domcapa_xml.get_additional_feature_list( 'host-model', ignore_features=None) for feature in features: for feature_name, feature_policy in feature.items(): # For host-passthrough mode, adding "invtsc" requires # more settings, so it will be ignored. if feature_name != "invtsc": cpu_xml.add_feature(feature_name, feature_policy) if cpu_mode: cpu_xml.mode = cpu_mode if cpu_vendor_id: cpu_xml.vendor_id = cpu_vendor_id # Update vm's cpu vmxml.cpu = cpu_xml vmxml.sync() if vcpu_max: if with_topology: vm_xml.VMXML.set_vm_vcpus(vm_name, int(vcpu_max), cores=int(vcpu_max), sockets=1, threads=1, add_topology=with_topology, topology_correction=with_topology) else: vm_xml.VMXML.set_vm_vcpus(vm_name, int(vcpu_max))
def get_cpu_definition(source_type, vm_name, test): """ Extract cpu definition according source type :param source_type: The source file type includes domxml, domcapa_xml and capa_xml :param vm_name: The VM name :param test: Avocado test object :return: The string of cpu definition """ cpu_xml = None if source_type == "domxml": dom_xml = vm_xml.VMXML.new_from_dumpxml(vm_name) cpu_xml = dom_xml.xmltreefile.get_element_string('/cpu') elif source_type == "domcapa_xml": domcapa_xml = domcapability_xml.DomCapabilityXML() cpu_xml = domcapa_xml.xmltreefile.get_element_string('/cpu') elif source_type == "capa_xml": capa_xml = capability_xml.CapabilityXML() cpu_xml = capa_xml.xmltreefile.get_element_string('/host/cpu') else: test.fail("Invalid source type: %s" % source_type) return cpu_xml
def run(test, params, env): """ Test the command virsh maxvcpus (1) Call virsh maxvcpus (2) Call virsh -c remote_uri maxvcpus (3) Call virsh maxvcpus with an unexpected option """ # get the params from subtests. # params for general. option = params.get("virsh_maxvcpus_options") status_error = params.get("status_error") connect_arg = params.get("connect_arg", "") # params for transport connect. local_ip = params.get("local_ip", "ENTER.YOUR.LOCAL.IP") local_pwd = params.get("local_pwd", "ENTER.YOUR.LOCAL.ROOT.PASSWORD") server_ip = params.get("remote_ip", local_ip) server_pwd = params.get("remote_pwd", local_pwd) transport_type = params.get("connect_transport_type", "local") transport = params.get("connect_transport", "ssh") connect_uri = None # check the config if (connect_arg == "transport" and transport_type == "remote" and local_ip.count("ENTER")): raise exceptions.TestSkipError("Parameter local_ip is not configured " "in remote test.") if (connect_arg == "transport" and transport_type == "remote" and local_pwd.count("ENTER")): raise exceptions.TestSkipError("Parameter local_pwd is not configured " "in remote test.") if connect_arg == "transport": canonical_uri_type = virsh.driver() if transport == "ssh": ssh_connection = utils_conn.SSHConnection(server_ip=server_ip, server_pwd=server_pwd, client_ip=local_ip, client_pwd=local_pwd) try: ssh_connection.conn_check() except utils_conn.ConnectionError: ssh_connection.conn_setup() ssh_connection.conn_check() connect_uri = libvirt_vm.get_uri_with_transport( uri_type=canonical_uri_type, transport=transport, dest_ip=server_ip) virsh_dargs = { 'remote_ip': server_ip, 'remote_user': '******', 'remote_pwd': server_pwd, 'ssh_remote_auth': True } virsh_instance = virsh.VirshPersistent(**virsh_dargs) else: connect_uri = connect_arg virsh_instance = virsh if libvirt_version.version_compare(2, 3, 0): try: maxvcpus = None maxvcpus_cap = None dom_capabilities = None # make sure we take maxvcpus from right host, helps in case remote try: dom_capabilities = domcap.DomCapabilityXML( virsh_instance=virsh_instance) maxvcpus = dom_capabilities.max logging.debug( "maxvcpus calculate from domcapabilities " "is %s", maxvcpus) except Exception as details: raise exceptions.TestFail("Failed to get maxvcpus from " "domcapabilities xml:\n%s" % dom_capabilities) try: cap_xml = capability_xml.CapabilityXML() maxvcpus_cap = cap_xml.get_guest_capabilities()['hvm'][ platform.machine()]['maxcpus'] logging.debug('maxvcpus_cap is %s', maxvcpus_cap) except Exception as details: logging.debug( "Failed to get maxvcpu from virsh " "capabilities: %s", details) # Let's fall back in case of failure maxvcpus_cap = maxvcpus if not maxvcpus: raise exceptions.TestFail("Failed to get max value for vcpu" "from domcapabilities " "xml:\n%s" % dom_capabilities) except Exception as details: raise exceptions.TestFail( "Failed get the virsh instance with uri: " "%s\n Details: %s" % (connect_uri, details)) is_arm = "aarch" in platform.machine() gic_version = '' if is_arm: for gic_enum in domcap.DomCapabilityXML()['features']['gic_enums']: if gic_enum['name'] == "version": gic_version = gic_enum['values'][0].get_value() # Run test case result = virsh.maxvcpus(option, uri=connect_uri, ignore_status=True, debug=True) maxvcpus_test = result.stdout.strip() status = result.exit_status # Check status_error if status_error == "yes": if status == 0: raise exceptions.TestFail("Run succeeded with unsupported option!") else: logging.info("Run failed with unsupported option %s " % option) elif status_error == "no": if status == 0: if not libvirt_version.version_compare(2, 3, 0): if "kqemu" in option: if not maxvcpus_test == '1': raise exceptions.TestFail("Command output %s is not " "expected for %s " % (maxvcpus_test, option)) elif option in ['qemu', '--type qemu', '']: if not maxvcpus_test == '16': raise exceptions.TestFail("Command output %s is not " "expected for %s " % (maxvcpus_test, option)) else: # No check with other types pass else: # It covers all possible combinations if option in [ 'qemu', 'kvm', '--type qemu', '--type kvm', 'kqemu', '--type kqemu', '' ]: if (is_arm and gic_version == '2' and option in ['kvm', '']): if not maxvcpus_test == '8': raise exceptions.TestFail( "Command output %s is not " "expected for %s " % (maxvcpus_test, option)) elif not (maxvcpus_test == maxvcpus or maxvcpus_test == maxvcpus_cap): raise exceptions.TestFail("Command output %s is not " "expected for %s " % (maxvcpus_test, option)) else: # No check with other types pass else: raise exceptions.TestFail("Run command failed")
def check_cpu(xml, cpu_match, arch, model, policies): """ Check the dumpxml result for --update-cpu option Note, function custom_cpu() hard code these features and policy, so after run virsh dumpxml --update-cpu: 1. For match='minimum', all host support features will added, and match change to 'exact'. Since libvirt-3.0, cpu update is reworked, and the custom CPU with minimum match is converted similarly to host-model. 2. policy='optional' features(support by host) will update to policy='require' 3. policy='optional' features(unsupported by host) will update to policy='disable' 4. Other policy='disable|force|forbid|require' with keep the original values """ vmxml = vm_xml.VMXML() vmxml['xml'] = xml vmcpu_xml = vmxml['cpu'] check_pass = True require_count = 0 expect_require_features = 0 cpu_feature_list = vmcpu_xml.get_feature_list() dom_capa = domcapability_xml.DomCapabilityXML() is_supported_on_hypervisor = is_supported_on_hypervisor_func(dom_capa) for i in range(len(cpu_feature_list)): f_name = vmcpu_xml.get_feature_name(i) f_policy = vmcpu_xml.get_feature_policy(i) err_msg = "Policy of '%s' is not expected: %s" % (f_name, f_policy) expect_policy = "disable" if f_name in policies: if policies[f_name] == "optional" and arch != "s390x": if is_supported_on_hypervisor(f_name): expect_policy = "require" else: expect_policy = policies[f_name] if f_policy != expect_policy: logging.error(err_msg) check_pass = False # Count expect require features if expect_policy == "require": expect_require_features += 1 # Count actual require features if f_policy == "require": require_count += 1 # Check optional feature is changed to require/disable expect_model = model if cpu_match == "minimum": # libvirt commit 3b6be3c0 change the behavior of update-cpu # Check model is changed to host cpu-model given in domcapabilities if libvirt_version.version_compare(3, 0, 0): expect_model = dom_capa.get_hostmodel_name() expect_match = "exact" # For different host, the support require features are different, # so just check the actual require features greater than the # expect number if require_count < expect_require_features: logging.error("Found %d require features, but expect >=%s", require_count, expect_require_features) check_pass = False else: expect_match = cpu_match if require_count != expect_require_features: logging.error("Found %d require features, but expect %s", require_count, expect_require_features) check_pass = False logging.debug("Expect 'match' value is: %s", expect_match) match = vmcpu_xml['match'] if match != expect_match: logging.error("CPU match '%s' is not expected", match) check_pass = False logging.debug("Expect 'model' value is: %s", expect_model) if vmcpu_xml['model'] != expect_model: logging.error("CPU model %s is not expected", vmcpu_xml['model']) check_pass = False return check_pass
def run(test, params, env): """ Test the command virsh maxvcpus (1) Call virsh maxvcpus (2) Call virsh -c remote_uri maxvcpus (3) Call virsh maxvcpus with an unexpected option """ # get the params from subtests. # params for general. option = params.get("virsh_maxvcpus_options") status_error = params.get("status_error") connect_arg = params.get("connect_arg", "") # params for transport connect. local_ip = params.get("local_ip", "ENTER.YOUR.LOCAL.IP") local_pwd = params.get("local_pwd", "ENTER.YOUR.LOCAL.ROOT.PASSWORD") server_ip = params.get("remote_ip", local_ip) server_pwd = params.get("remote_pwd", local_pwd) transport_type = params.get("connect_transport_type", "local") transport = params.get("connect_transport", "ssh") connect_uri = None # check the config if (connect_arg == "transport" and transport_type == "remote" and local_ip.count("ENTER")): raise exceptions.TestSkipError("Parameter local_ip is not configured " "in remote test.") if (connect_arg == "transport" and transport_type == "remote" and local_pwd.count("ENTER")): raise exceptions.TestSkipError("Parameter local_pwd is not configured " "in remote test.") if connect_arg == "transport": canonical_uri_type = virsh.driver() if transport == "ssh": ssh_connection = utils_conn.SSHConnection(server_ip=server_ip, server_pwd=server_pwd, client_ip=local_ip, client_pwd=local_pwd) try: ssh_connection.conn_check() except utils_conn.ConnectionError: ssh_connection.conn_setup() ssh_connection.conn_check() connect_uri = libvirt_vm.get_uri_with_transport( uri_type=canonical_uri_type, transport=transport, dest_ip=server_ip) else: connect_uri = connect_arg if libvirt_version.version_compare(2, 3, 0): try: maxvcpus = None dom_capabilities = None # make sure we take maxvcpus from right host, helps incase remote try: dom_capabilities = domcap.DomCapabilityXML() maxvcpus = dom_capabilities.max logging.debug( "maxvcpus calculate from domcapabilities " "is %s", maxvcpus) except: raise exceptions.TestFail("Failed to get maxvcpus from " "domcapabilities xml:\n%s" % dom_capabilities) if not maxvcpus: raise exceptions.TestFail("Failed to get max value for vcpu" "from domcapabilities " "xml:\n%s" % dom_capabilities) except Exception, details: raise exceptions.TestFail( "Failed get the virsh instance with uri: " "%s\n Details: %s" % (connect_uri, details))
except: raise exceptions.TestFail("Failed to get maxvcpus from " "domcapabilities xml:\n%s" % dom_capabilities) if not maxvcpus: raise exceptions.TestFail("Failed to get max value for vcpu" "from domcapabilities " "xml:\n%s" % dom_capabilities) except Exception, details: raise exceptions.TestFail( "Failed get the virsh instance with uri: " "%s\n Details: %s" % (connect_uri, details)) is_arm = "aarch" in platform.machine() if is_arm: for gic_enum in domcap.DomCapabilityXML()['features']['gic_enums']: if gic_enum['name'] == "version": gic_version = gic_enum['values'][0].get_value() # Run test case result = virsh.maxvcpus(option, uri=connect_uri, ignore_status=True, debug=True) maxvcpus_test = result.stdout.strip() status = result.exit_status # Check status_error if status_error == "yes": if status == 0: