def check_guest_by_pattern(patterns): """ Search the command output with specified patterns :param patterns: patterns to search in guest. Type: str or list """ logging.debug("Search pattern:{}".format(patterns)) session = vm.wait_for_login(serial=True) libvirt.check_cmd_output('lspci', eval(patterns), session=session) session.close()
def run(test, params, env): """ 1. prepare env 2. check if nwfilter binding 3. run test 4. destroy vm and restore the status """ vm_name = params.get("main_vm") vm = env.get_vm(vm_name) status_error = "yes" == params.get("status_error") vmxml_backup = libvirt_xml.vm_xml.VMXML.new_from_inactive_dumpxml(vm_name) filter_name = params.get("filter_name") is_nwfilter_define = "yes" == params.get("is_nwfilter_define") vnet0_binding = os.path.join(data_dir.get_tmp_dir(), "vnet0_binding.xml") filter_binding_name = params.get("filter_binding_name") failed_msg = params.get("expected_failed") target_dev = params.get("target_dev") source_network = params.get("source_network") source_bridge = params.get("source_bridge") alias_name = params.get("alias_name") def set_env(): """ prepare the vm interface xml this xml can both use in two scenario. but little different for two scenario """ vmxml = libvirt_xml.VMXML.new_from_inactive_dumpxml(vm_name) iface_xml = vmxml.get_devices('interface')[0] vmxml.del_device(iface_xml) new_iface = interface.Interface('network') new_iface.xml = iface_xml.xml new_iface.type_name = "network" iface_target = {'dev': target_dev} new_iface.target = iface_target source = {'network': source_network, 'bridge': source_bridge} new_iface.source = source filterrefs_dict = {} filterrefs_dict['name'] = filter_name filterrefs_dict['parameters'] = [] new_filterref = new_iface.new_filterref(**filterrefs_dict) new_iface.filterref = new_filterref alias_dict = {'name': alias_name} new_iface.alias = alias_dict vmxml.add_device(new_iface) logging.debug("new interface xml is: %s" % new_iface) vmxml.sync() return new_iface def check_binding_port(cmd_res, match, is_match=True): """ check the list binding ports """ list_res = cmd_res.stdout_text.strip() if list_res and re.search(match, list_res): if not is_match: test.fail("expected not match %s" % match) elif is_match: test.fail("expected match %s but not match" % match) try: # set new interface env new_iface = set_env() # create binding dump file pkg_mgr = utils_package.package_manager(None, 'libvirt-daemon-config-nwfilter') pkg_mgr.install() virsh.start(vm_name, debug=True) ret = virsh.nwfilter_binding_dumpxml(new_iface.target['dev'], to_file=vnet0_binding, debug=True) utlv.check_exit_status(ret, status_error) binding = nwfilter_binding.NwfilterBinding() binding.xml = vnet0_binding filterrefs_dict = {} filterrefs_dict['name'] = filter_binding_name filterrefs_dict['parameters'] = [ {'name': "MAC", 'value': new_iface.mac_address}] binding.filterref = binding.new_filterref(**filterrefs_dict) logging.debug("binding is %s" % binding) # list filter if not is_nwfilter_define: virsh.nwfilter_binding_delete(new_iface.target['dev'], debug=True) if is_nwfilter_define: ret = virsh.nwfilter_binding_list(debug=True) utlv.check_exit_status(ret, status_error) check_binding_port(ret, filter_name, is_match=True) ret_create = virsh.nwfilter_binding_create(binding.xml, debug=True) # two Scenario if is_nwfilter_define: utlv.check_result(ret_create, failed_msg) elif not is_nwfilter_define: # get params for senario2 check_cmd = params.get("check_cmd") expected_match = params.get("expected_match") filter_binding_copy = params.get("filter_binding_copy") ret = virsh.nwfilter_binding_list(debug=True) check_binding_port(ret, filter_binding_name, is_match=True) utlv.check_cmd_output(check_cmd, expected_match, True) utils_libvirtd.libvirtd_restart() ret = virsh.nwfilter_binding_list(debug=True) check_binding_port(ret, filter_binding_name, is_match=True) # use check command to check result utlv.check_cmd_output(check_cmd, expected_match, True) new_binding = nwfilter_binding.NwfilterBinding() new_binding.xml = binding.xml filterrefs_dict = {} filterrefs_dict['name'] = filter_binding_copy filterrefs_dict['parameters'] = [ {'name': "MAC", 'value': new_iface.mac_address}] binding.filterref = binding.new_filterref(**filterrefs_dict) logging.debug("binding is %s" % new_binding) ret_create = virsh.nwfilter_binding_create(new_binding.xml, debug=True) utlv.check_result(ret_create, failed_msg) finally: if vm.is_alive(): vm.destroy(gracefully=False) vmxml_backup.sync()
def run(test, params, env): """ Test virsh nwfilter-binding-create 1)start a vm with interface 2)perpare the building xml 3)create binding 4)check ebtables rule is added 5)restart libvirtd and check the filter still there """ vm_name = params.get("main_vm") vm = env.get_vm(vm_name) check_cmd = params.get("check_cmd") expected_match = params.get("expected_match") status_error = "yes" == params.get("status_error") filter_name = params.get("filter_name", "clean-traffic") wait_time = params.get("wait_time", 1) # back up for recovery vmxml_backup = libvirt_xml.vm_xml.VMXML.new_from_inactive_dumpxml(vm_name) # prepare filter parameters dict filter_param_dict = [] param_dict = {} logging.debug("wait_time is : %s" % wait_time) wait_time = float(wait_time) libvirtd = utils_libvirtd.Libvirtd() def prepare_env(): vmxml = libvirt_xml.VMXML.new_from_inactive_dumpxml(vm_name) iface_xml = vmxml.get_devices('interface')[0] vmxml.del_device(iface_xml) new_iface = interface.Interface('network') new_iface.xml = iface_xml.xml new_iface.type_name = "network" new_iface.source = {'network': "default", 'bridge': "virbr0"} alias_dict = {'name': "net0"} new_iface.alias = alias_dict target_dict = {'dev': "vnet0"} new_iface.target = target_dict logging.debug("new interface xml is : %s" % new_iface) vmxml.add_device(new_iface) vmxml.sync() return new_iface def create_binding_file(new_iface): vmxml = libvirt_xml.VMXML.new_from_inactive_dumpxml(vm_name) binding = nwfilter_binding.NwfilterBinding() binding.owner = binding.new_owner(vm_name, vmxml.uuid) binding.mac_address = new_iface.mac_address portdev = "vnet0" binding.portdev = portdev param_dict['name'] = "MAC" param_dict['value'] = new_iface.mac_address filter_param_dict.append(param_dict) filterrefs_dict = {} filterrefs_dict['name'] = filter_name filterrefs_dict['parameters'] = filter_param_dict binding.filterref = binding.new_filterref(**filterrefs_dict) logging.debug("filter binding xml is: %s" % binding) return binding try: new_iface = prepare_env() binding = create_binding_file(new_iface) # binding xml vm.start() vmxml = libvirt_xml.VMXML.new_from_dumpxml(vm_name) iface_xml = vmxml.get_devices('interface')[0] iface_target = iface_xml.target['dev'] logging.debug("iface target dev name is %s" % iface_target) virsh.nwfilter_binding_create(binding.xml, debug=True) # check ebtables rule is add # wait_for nwfilter-binding-create command exec finish time.sleep(wait_time) utlv.check_cmd_output(check_cmd, expected_match, True) if not libvirtd.restart(): virsh.nwfilter_binding_list(debug=True) test.fail("fail to restart libvirtd") ret = virsh.nwfilter_binding_list(debug=True) utlv.check_exit_status(ret, status_error) ret = virsh.nwfilter_binding_dumpxml("vnet0", debug=True) utlv.check_exit_status(ret, status_error) finally: if vm.is_alive(): vm.destroy(gracefully=False) vmxml_backup.sync()
def run(test, params, env): """ Test virsh nwfilter-binding-delete 1) prepare parameters 2) Run command 3) check result 4) clean env """ vm_name = params.get("main_vm") vm = env.get_vm(vm_name) check_cmd = params.get("check_cmd") filter_name = params.get("filter_name") status_error = "yes" == params.get("status_error") expected_not_match = params.get("expected_not_match") filter_param_list = [] vmxml_backup = libvirt_xml.vm_xml.VMXML.new_from_inactive_dumpxml(vm_name) params_key = [] for i in params.keys(): if 'parameters_name_' in i: params_key.append(i) params_key.sort() for i in range(len(params_key)): params_dict = {} params_dict['name'] = params[params_key[i]] params_dict['value'] = params['parameters_value_%s' % i] filter_param_list.append(params_dict) filterref_dict = {} filterref_dict['name'] = filter_name filterref_dict['parameters'] = filter_param_list def set_env(): vmxml = libvirt_xml.VMXML.new_from_dumpxml(vm_name) iface_xml = vmxml.get_devices('interface')[0] vmxml.del_device(iface_xml) new_iface = interface.Interface('network') new_iface.xml = iface_xml.xml new_filterref = new_iface.new_filterref(**filterref_dict) new_iface.filterref = new_filterref new_iface.target = {'dev': params.get('target_name', 'net_tap')} logging.debug("new interface xml is: %s" % new_iface) vmxml.add_device(new_iface) vmxml.sync() return new_iface try: # set_env new_iface = set_env() # start vm virsh.start(vm_name, debug=True) # list filter ret = virsh.nwfilter_binding_list(debug=True) utlv.check_exit_status(ret, status_error) # delete nwfilter binding ret = virsh.nwfilter_binding_delete(new_iface.target['dev'], debug=True) utlv.check_exit_status(ret, status_error) # check rule if not utlv.check_cmd_output(check_cmd, expected_not_match, True): logging.debug("the rules are deleted as expected!") else: test.fail("the rules are still exists after binding delete") # restart libvirtd, the nwfilter-binding will restore libvirtd = utils_libvirtd.Libvirtd() if not libvirtd.restart(): test.fail("fail to restart libvirtd") ret = virsh.nwfilter_binding_list(debug=True) utlv.check_exit_status(ret, status_error) finally: if vm.is_alive(): vm.destroy(gracefully=False) vmxml_backup.sync()