Ejemplo n.º 1
0
def clean_up_nwfilter_binding(ignore_status=False):
    """
    Clean up existed nwfilter binding.

    :param ignore_status: default value True to allow silent failure.
    """
    cmd_result = virsh.nwfilter_binding_list(debug=True)
    binding_list = cmd_result.stdout_text.strip().splitlines()
    binding_list = binding_list[2:]
    result = []
    # If binding list is not empty.
    if binding_list:
        for line in binding_list:
            # Split on whitespace, assume 1 column
            linesplit = line.split(None, 1)
            result.append(linesplit[0])
    LOG.info("existed nwfilter binding list is: %s", result)
    for binding_uuid in result:
        virsh.nwfilter_binding_delete(binding_uuid, ignore_status=ignore_status)
Ejemplo n.º 2
0
 def clean_up_dirty_nwfilter_binding():
     cmd_result = virsh.nwfilter_binding_list(debug=True)
     binding_list = cmd_result.stdout_text.strip().splitlines()
     binding_list = binding_list[2:]
     result = []
     # If binding list is not empty.
     if binding_list:
         for line in binding_list:
             # Split on whitespace, assume 1 column
             linesplit = line.split(None, 1)
             result.append(linesplit[0])
     logging.info("nwfilter binding list is: %s", result)
     for binding_uuid in result:
         try:
             virsh.nwfilter_binding_delete(binding_uuid)
         except Exception as e:
             logging.error(
                 "Exception thrown while undefining nwfilter-binding: %s",
                 str(e))
             raise
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 senario.
        but little different for two senario
        """
        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
        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 Senario
        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_expected(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_expected(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()
Ejemplo n.º 4
0
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-list

    1)Prepare parameters
    2)Run nwfilter_binding_list command
    3)check result
    4)Clean env
    """
    vm_name = params.get("main_vm")
    vm = env.get_vm(vm_name)
    new_filter_1 = params.get("newfilter_1")
    new_filter_2 = params.get("newfilter_2")
    vmxml_backup = libvirt_xml.vm_xml.VMXML.new_from_inactive_dumpxml(vm_name)
    new_net0_xml = os.path.join(data_dir.get_tmp_dir(), "new_net0.xml")
    new_net1_xml = os.path.join(data_dir.get_tmp_dir(), "new_net1.xml")
    option = params.get("option")
    status_error = "yes" == params.get("status_error")
    alias_name = params.get("alias_name")
    new_filter_name = params.get("new_filter_name")
    source_network = params.get("source_network")
    # prepare vm filterrfer parameters dict list
    filter_param_list_1 = []
    params_key_1 = []
    filter_param_list_2 = []
    params_key_2 = []
    for i in params.keys():
        if 'parameters_name_' in i:
            params_key_1.append(i)
    params_key_1.sort()
    for i in range(len(params_key_1)):
        params_dict = {}
        params_dict['name'] = params[params_key_1[i]]
        params_dict['value'] = params['parameters_value_%s' % i]
        filter_param_list_1.append(params_dict)
    filterref_dict_1 = {}
    filterref_dict_1['name'] = new_filter_1
    filterref_dict_1['parameters'] = filter_param_list_1

    for i in params.keys():
        if 'parameters_dhcp_' in i:
            params_key_2.append(i)
    params_key_2.sort()
    for i in range(len(params_key_2)):
        params_dict = {}
        params_dict['name'] = params[params_key_2[i]]
        params_dict['value'] = params['dhcp_value_%s' % i]
        filter_param_list_2.append(params_dict)
    filterref_dict_2 = {}
    filterref_dict_2['name'] = new_filter_2
    filterref_dict_2['parameters'] = filter_param_list_2

    def set_env():
        """
        set two interface with different network filter
        and change interface type
        """
        # Add enough PCI to attach interface
        libvirt_pcicontr.reset_pci_num(vm_name)
        virsh.attach_interface(vm_name, option, debug=True)
        vmxml = libvirt_xml.VMXML.new_from_dumpxml(vm_name)
        logging.debug("Guest xml is {}".format(vmxml))
        devices = vmxml.get_devices('interface')
        iface_xml = devices[0]
        iface_xml_2 = devices[1]
        vmxml.del_device(iface_xml)
        vmxml.del_device(iface_xml_2)
        new_iface_1 = interface.Interface('network')
        new_iface_2 = interface.Interface('network')
        new_iface_1.xml = iface_xml.xml
        new_iface_2.xml = iface_xml_2.xml
        new_iface_1.type_name = "network"
        new_iface_2.type_name = "network"
        new_iface_1.source = {'network': source_network}
        new_iface_2.source = {'network': source_network}
        new_iface_1.target = {'dev': 'new_net0'}
        new_iface_2.target = {'dev': 'new_net1'}
        new_filterref = new_iface_1.new_filterref(**filterref_dict_1)
        new_iface_1.filterref = new_filterref
        new_filterref = new_iface_2.new_filterref(**filterref_dict_2)
        new_iface_2.filterref = new_filterref
        logging.debug("new interface xml is: %s \n %s" %
                      (new_iface_1, new_iface_2))
        vmxml.add_device(new_iface_1)
        vmxml.add_device(new_iface_2)
        vmxml.sync()
        return new_iface_1, new_iface_2

    try:
        new_iface_1, new_iface_2 = set_env()
        # start vm
        virsh.start(vm_name, debug=True)
        # list binding port dev
        ret = virsh.nwfilter_binding_list(debug=True)
        utlv.check_exit_status(ret, status_error)
        virsh.nwfilter_binding_dumpxml(new_iface_1.target['dev'],
                                       to_file=new_net0_xml,
                                       debug=True)
        virsh.nwfilter_binding_dumpxml(new_iface_2.target['dev'],
                                       to_file=new_net1_xml,
                                       debug=True)
        # check dump filterbinding can pass xml validate
        new_net0_cmd = "virt-xml-validate %s" % new_net0_xml
        new_net1_cmd = "virt-xml-validate %s" % new_net1_xml
        valid_0 = process.run(new_net0_cmd, ignore_status=True,
                              shell=True).exit_status
        valid_1 = process.run(new_net1_cmd, ignore_status=True,
                              shell=True).exit_status
        if valid_0 or valid_1:
            test.fail("the xml can not validate successfully")
        # create new xml and update device
        newnet_iface = interface.Interface('network')
        newnet_iface.xml = new_iface_1.xml
        filterref_list = []
        filterref_dict = {}
        filterref_dict['name'] = new_filter_name
        filterref_dict['parameters'] = filterref_list
        newnet_iface.alias = {'name': alias_name}
        newnet_iface.filterref = newnet_iface.new_filterref(**filterref_dict)

        ret = virsh.update_device(domainarg=vm_name,
                                  filearg=newnet_iface.xml,
                                  debug=True)
        utlv.check_exit_status(ret, status_error)
        ret_list = virsh.nwfilter_binding_list(debug=True)
        utlv.check_result(ret_list, expected_match="new_net1")

        ret_dump = virsh.nwfilter_binding_dumpxml('new_net0', debug=True)
        utlv.check_result(ret_dump, expected_match=new_filter_name)

    finally:
        if vm.is_alive():
            vm.destroy(gracefully=False)
        vmxml_backup.sync()
Ejemplo n.º 6
0
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()
Ejemplo n.º 7
0
def run(test, params, env):
    """
    Test virsh nwfilter-binding-list

    1)Prepare parameters
    2)Run nwfilter_binding_list command
    3)check result
    4)Clean env
    """
    vm_name = params.get("main_vm")
    vm = env.get_vm(vm_name)
    status_error = "yes" == params.get("status_error")
    new_filter_1 = params.get("newfilter_1")
    new_filter_2 = params.get("newfilter_2")
    time_wait = params.get("time_wait", 10)
    option = params.get("option")
    vmxml_backup = libvirt_xml.vm_xml.VMXML.new_from_inactive_dumpxml(vm_name)
    # prepare vm filterrfer parameters dict list
    filter_param_list_1 = []
    params_key_1 = []
    filter_param_list_2 = []
    params_key_2 = []
    for i in params.keys():
        if 'parameters_name_' in i:
            params_key_1.append(i)
    params_key_1.sort()
    for i in range(len(params_key_1)):
        params_dict = {}
        params_dict['name'] = params[params_key_1[i]]
        params_dict['value'] = params['parameters_value_%s' % i]
        filter_param_list_1.append(params_dict)
    filterref_dict_1 = {}
    filterref_dict_1['name'] = new_filter_1
    filterref_dict_1['parameters'] = filter_param_list_1

    for i in params.keys():
        if 'parameters_dhcp_' in i:
            params_key_2.append(i)
    params_key_2.sort()
    for i in range(len(params_key_2)):
        params_dict = {}
        params_dict['name'] = params[params_key_2[i]]
        params_dict['value'] = params['dhcp_value_%s' % i]
        filter_param_list_2.append(params_dict)
    filterref_dict_2 = {}
    filterref_dict_2['name'] = new_filter_2
    filterref_dict_2['parameters'] = filter_param_list_2

    utils_package.package_install('libvirt-daemon-config-nwfilter')

    def env_setting(filterref_dict_1, filterref_dict_2):
        ret = virsh.attach_interface(vm_name, option)
        utlv.check_exit_status(ret, status_error)
        vmxml = libvirt_xml.VMXML.new_from_dumpxml(vm_name)
        devices = vmxml.get_devices('interface')
        iface_xml = devices[0]
        logging.debug("iface_xml : %s" % iface_xml)
        iface_xml_2 = devices[1]
        vmxml.del_device(iface_xml)
        vmxml.del_device(iface_xml_2)
        new_iface_1 = interface.Interface('network')
        logging.debug("new_iface_1 : %s" % new_iface_1)
        new_iface_2 = interface.Interface('network')
        new_iface_1.xml = iface_xml.xml
        new_iface_1.type_name = "network"
        logging.debug("new_iface_1 : %s" % new_iface_1)
        new_iface_2.xml = iface_xml_2.xml

        new_iface_1.source = {'network': "default"}
        new_filterref = new_iface_1.new_filterref(**filterref_dict_1)
        new_iface_1.filterref = new_filterref
        new_filterref = new_iface_2.new_filterref(**filterref_dict_2)
        new_iface_2.filterref = new_filterref
        logging.debug("new interface xml is: %s \n %s" %
                      (new_iface_1, new_iface_2))
        vmxml.add_device(new_iface_1)
        vmxml.add_device(new_iface_2)
        vmxml.sync()
        return new_iface_1, new_iface_2

    def attach_new_device():
        newnet_iface = interface.Interface('network')
        newnet_iface.source = {'network': "default"}
        newnet_iface.model = 'virtio'
        filterref_dict = {}
        filterref_list = [{'name': "CTRL_IP_LEARNING", 'value': "dhcp"}]
        filterref_dict['name'] = "clean-traffic"
        filterref_dict['parameters'] = filterref_list
        newnet_iface.filterref = newnet_iface.new_filterref(**filterref_dict)
        ret = virsh.attach_device(domainarg=vm_name,
                                  filearg=newnet_iface.xml,
                                  debug=True)
        utlv.check_exit_status(ret, status_error)

    try:
        # set env of start vm
        new_iface_1, new_iface_2 = env_setting(filterref_dict_1,
                                               filterref_dict_2)
        # start vm
        virsh.start(vm_name, debug=True)
        # list binding port dev
        logging.debug("check nwfilter binding for 2 interfaces")
        ret = virsh.nwfilter_binding_list(debug=True)
        utlv.check_result(ret, expected_match=[r"vnet\d+\s+clean-traffic"])
        utlv.check_result(ret, expected_match=[r"vnet\d+\s+allow-dhcp-server"])
        # detach a interface
        option = "--type network" + " --mac " + new_iface_1.mac_address
        ret = virsh.detach_interface(vm_name, option, debug=True)
        time.sleep(time_wait)
        utlv.check_exit_status(ret, status_error)
        logging.debug("check nwfilter binding after detach one interface:")
        time.sleep(3)
        ret = virsh.nwfilter_binding_list(debug=True)
        if re.search(r'vnet\d+\s+clean-traffic.*', ret.stdout):
            test.fail(
                "vnet binding clean-traffic still exists after detach the interface!"
            )
        utlv.check_result(ret, expected_match=[r"vnet\d+\s+allow-dhcp-server"])

        # update_device to delete the filter
        iface_dict = {'del_filter': True}
        new_xml = utlv.modify_vm_iface(vm_name, 'get_xml', iface_dict)
        virsh.update_device(domainarg=vm_name, filearg=new_xml, debug=True)
        logging.debug("check nwfilter-binding after delete the only interface")
        ret = virsh.nwfilter_binding_list(debug=True)
        if re.search(r'vnet\d+\s+allow-dhcp-server.*', ret.stdout):
            test.fail(
                "vnet binding allow-dhcp-server still exists after detach the interface!"
            )
        utlv.check_exit_status(ret, status_error)

        # attach new interface
        attach_new_device()
        ret = virsh.nwfilter_binding_list(debug=True)
        logging.debug("Check nwfilter-binding exists after attach device")
        utlv.check_result(ret, expected_match=[r"vnet\d+\s+clean-traffic"])

    finally:
        if vm.is_alive():
            vm.destroy(gracefully=False)
        vmxml_backup.sync()
Ejemplo n.º 8
0
def run(test, params, env):
    """
    Test virsh nwfilter-binding-list

    1)Prepare parameters
    2)Run nwfilter_binding_list command
    3)check result
    4)Clean env
    """
    vm_name = params.get("main_vm")
    vm = env.get_vm(vm_name)
    status_error = "yes" == params.get("status_error")
    new_filter_1 = params.get("newfilter_1")
    new_filter_2 = params.get("newfilter_2")
    time_wait = params.get("time_wait", 10)
    option = params.get("option")
    vmxml_backup = libvirt_xml.vm_xml.VMXML.new_from_inactive_dumpxml(vm_name)
    # prepare vm filterrfer parameters dict list
    filter_param_list_1 = []
    params_key_1 = []
    filter_param_list_2 = []
    params_key_2 = []
    for i in params.keys():
        if 'parameters_name_' in i:
            params_key_1.append(i)
    params_key_1.sort()
    for i in range(len(params_key_1)):
        params_dict = {}
        params_dict['name'] = params[params_key_1[i]]
        params_dict['value'] = params['parameters_value_%s' % i]
        filter_param_list_1.append(params_dict)
    filterref_dict_1 = {}
    filterref_dict_1['name'] = new_filter_1
    filterref_dict_1['parameters'] = filter_param_list_1

    for i in params.keys():
        if 'parameters_dhcp_' in i:
            params_key_2.append(i)
    params_key_2.sort()
    for i in range(len(params_key_2)):
        params_dict = {}
        params_dict['name'] = params[params_key_2[i]]
        params_dict['value'] = params['dhcp_value_%s' % i]
        filter_param_list_2.append(params_dict)
    filterref_dict_2 = {}
    filterref_dict_2['name'] = new_filter_2
    filterref_dict_2['parameters'] = filter_param_list_2

    def env_setting(filterref_dict_1, filterref_dict_2):
        ret = virsh.attach_interface(vm_name, option)
        utlv.check_exit_status(ret, status_error)
        vmxml = libvirt_xml.VMXML.new_from_dumpxml(vm_name)
        devices = vmxml.get_devices('interface')
        iface_xml = devices[0]
        logging.debug("iface_xml : %s" % iface_xml)
        iface_xml_2 = devices[1]
        vmxml.del_device(iface_xml)
        vmxml.del_device(iface_xml_2)
        new_iface_1 = interface.Interface('network')
        logging.debug("new_iface_1 : %s" % new_iface_1)
        new_iface_2 = interface.Interface('network')
        new_iface_1.xml = iface_xml.xml
        new_iface_1.type_name = "network"
        logging.debug("new_iface_1 : %s" % new_iface_1)
        new_iface_2.xml = iface_xml_2.xml

        new_iface_1.source = {'network': "default"}
        new_filterref = new_iface_1.new_filterref(**filterref_dict_1)
        new_iface_1.filterref = new_filterref
        new_filterref = new_iface_2.new_filterref(**filterref_dict_2)
        new_iface_2.filterref = new_filterref
        logging.debug("new interface xml is: %s \n %s" %
                      (new_iface_1, new_iface_2))
        vmxml.add_device(new_iface_1)
        vmxml.add_device(new_iface_2)
        vmxml.sync()
        return new_iface_1, new_iface_2

    def attach_new_device():
        newnet_iface = interface.Interface('network')
        newnet_iface.source = {'network': "default"}
        filterref_dict = {}
        filterref_list = [{'name': "CTRL_IP_LEARNING", 'value': "dhcp"}]
        filterref_dict['name'] = "clean-traffic"
        filterref_dict['parameters'] = filterref_list
        newnet_iface.filterref = newnet_iface.new_filterref(**filterref_dict)
        ret = virsh.attach_device(domainarg=vm_name,
                                  filearg=newnet_iface.xml,
                                  debug=True)
        utlv.check_exit_status(ret, status_error)

    try:
        # set env of start vm
        new_iface_1, new_iface_2 = env_setting(filterref_dict_1,
                                               filterref_dict_2)
        # start vm
        virsh.start(vm_name, debug=True)
        # list binding port dev
        ret = virsh.nwfilter_binding_list(debug=True)
        utlv.check_exit_status(ret, status_error)
        # detach a interface
        option = "--type network" + " --mac " + new_iface_1.mac_address
        time.sleep(time_wait)
        ret = virsh.detach_interface(vm_name, option, debug=True)
        utlv.check_exit_status(ret, status_error)
        ret = virsh.nwfilter_binding_list(debug=True)
        utlv.check_exit_status(ret, status_error)

        # update_device
        vnet1_iface = interface.Interface('network')
        vnet1_iface.xml = new_iface_2.xml
        target = {'dev': "vnet1"}
        vnet1_iface.target = target
        virsh.update_device(domainarg=vm_name,
                            filearg=vnet1_iface.xml,
                            debug=True)
        ret = virsh.nwfilter_binding_list(debug=True)
        utlv.check_exit_status(ret, status_error)

        # attach new interface
        attach_new_device()
        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()