|
| 1 | +import os |
| 2 | + |
| 3 | +from avocado.utils import process |
| 4 | + |
| 5 | +from virttest import utils_misc |
| 6 | +from virttest import utils_net |
| 7 | +from virttest import virsh |
| 8 | +from virttest.libvirt_xml import vm_xml |
| 9 | + |
| 10 | +from provider.virtual_network import pktgen_utils |
| 11 | +from provider.virtual_network import network_base |
| 12 | + |
| 13 | + |
| 14 | +def write_in_result_file(test, params): |
| 15 | + """ |
| 16 | + Write some qemu, kvm version info and write them into pktgen test result. |
| 17 | +
|
| 18 | + :params, params |
| 19 | + :return result_file, pktgen test result file. |
| 20 | + """ |
| 21 | + kvm_ver_chk_cmd = params.get("kvm_ver_chk_cmd") |
| 22 | + |
| 23 | + result_path = utils_misc.get_path(test.resultsdir, "pktgen_perf.RHS") |
| 24 | + result_file = open(result_path, "w") |
| 25 | + kvm_ver = process.system_output(kvm_ver_chk_cmd, shell=True).decode() |
| 26 | + host_ver = os.uname()[2] |
| 27 | + result_file.write("### kvm-userspace-ver : %s\n" % kvm_ver) |
| 28 | + result_file.write("### kvm_version : %s\n" % host_ver) |
| 29 | + |
| 30 | + return result_file |
| 31 | + |
| 32 | + |
| 33 | +def run(test, params, env): |
| 34 | + """ |
| 35 | + Pktgen tests with burst mode. |
| 36 | + """ |
| 37 | + def setup_test(): |
| 38 | + """ |
| 39 | + Prepare the test environment with required guest type and interface. |
| 40 | +
|
| 41 | + """ |
| 42 | + utils_net.create_linux_bridge_tmux(bridge_name, host_iface) |
| 43 | + if params.get_boolean("pre_tap") : |
| 44 | + network_base.create_tap(tap_name, bridge_name, 'root', flag=tap_flag) |
| 45 | + |
| 46 | + test.log.info("TEST_SETUP: guest and interface.") |
| 47 | + network_base.prepare_single_vm(params, vm_name, iface_list) |
| 48 | + |
| 49 | + |
| 50 | + def run_test(): |
| 51 | + """ |
| 52 | + Run pktgen in burst mode for vm. |
| 53 | + """ |
| 54 | + result_file = write_in_result_file(test, params) |
| 55 | + |
| 56 | + if disable_iptables_rules_cmd: |
| 57 | + process.system(disable_iptables_rules_cmd, shell=True) |
| 58 | + |
| 59 | + pktgen_runner = pktgen_utils.PktgenRunner() |
| 60 | + if pktgen_runner.is_version_lt_rhel(process.getoutput("uname -r"), 7): |
| 61 | + if host_ver.count("64k"): |
| 62 | + pktgen_runner.install_package(host_ver, pagesize="64k") |
| 63 | + else: |
| 64 | + pktgen_runner.install_package(host_ver) |
| 65 | + |
| 66 | + test.log.debug("TEST_STEP: Test with guest: %s.", vm_name) |
| 67 | + env.create_vm(vm_type='libvirt', target="", name=vm_name, params=params, bindir=test.bindir) |
| 68 | + vm = env.get_vm(vm_name) |
| 69 | + vm.start() |
| 70 | + test.log.debug("Guest xml:%s", vm_xml.VMXML.new_from_dumpxml(vm_name)) |
| 71 | + |
| 72 | + test.log.debug("TEST_STEP: Test with guest and host connectivity") |
| 73 | + session_serial = vm.wait_for_serial_login(restart_network=True) |
| 74 | + mac = vm.get_mac_address() |
| 75 | + params.update({ |
| 76 | + 'vm_ping_host': 'pass'} |
| 77 | + ) |
| 78 | + ips = { |
| 79 | + 'vm_ip': utils_net.get_guest_ip_addr(session_serial, mac), |
| 80 | + 'host_ip': host_ip |
| 81 | + } |
| 82 | + network_base.ping_check(params, ips, session_serial, force_ipv4=True) |
| 83 | + |
| 84 | + test.log.debug("TEST_STEP: Install package and Run pktgen in burst mode.") |
| 85 | + guest_ver = session_serial.cmd_output(guest_ver_cmd) |
| 86 | + result_file.write("### guest-kernel-ver :%s" % guest_ver) |
| 87 | + if pktgen_runner.is_version_lt_rhel(session_serial.cmd("uname -r"), 7): |
| 88 | + if guest_ver.count("64k"): |
| 89 | + pktgen_runner.install_package( |
| 90 | + guest_ver.strip(), |
| 91 | + pagesize="64k", |
| 92 | + vm=vm, |
| 93 | + session_serial=session_serial) |
| 94 | + else: |
| 95 | + pktgen_runner.install_package( |
| 96 | + guest_ver.strip(), vm=vm, session_serial=session_serial) |
| 97 | + |
| 98 | + pktgen_utils.run_tests_for_category( |
| 99 | + params, result_file, test_vm, vm, session_serial) |
| 100 | + |
| 101 | + test.log.debug("TEST_STEP: Check the guest dmesg without error messages.") |
| 102 | + vm.verify_dmesg() |
| 103 | + vm.verify_kernel_crash() |
| 104 | + |
| 105 | + virsh.destroy(vm_name) |
| 106 | + virsh.undefine(vm_name, options='--nvram') |
| 107 | + |
| 108 | + result_file.close() |
| 109 | + |
| 110 | + def teardown_test(): |
| 111 | + """ |
| 112 | + Clean data. |
| 113 | + """ |
| 114 | + test.log.debug("TEST_TEARDOWN: Recover the env.") |
| 115 | + network_base.delete_tap(tap_name) |
| 116 | + utils_net.delete_linux_bridge_tmux(bridge_name, host_iface) |
| 117 | + |
| 118 | + backup_vmxml.sync() |
| 119 | + |
| 120 | + vm_name = params.get("main_vm") |
| 121 | + vmxml = vm_xml.VMXML.new_from_inactive_dumpxml(vm_name) |
| 122 | + backup_vmxml = vmxml.copy() |
| 123 | + |
| 124 | + disable_iptables_rules_cmd = params.get("disable_iptables_rules_cmd") |
| 125 | + guest_ver_cmd = params["guest_ver_cmd"] |
| 126 | + test_vm = params.get_boolean("test_vm") |
| 127 | + host_ver = os.uname()[2] |
| 128 | + |
| 129 | + rand_id = utils_misc.generate_random_string(3) |
| 130 | + bridge_name = 'br_' + rand_id |
| 131 | + tap_name = 'tap_' + rand_id |
| 132 | + host_iface = utils_net.get_default_gateway(iface_name=True, force_dhcp=True, json=True) |
| 133 | + host_ip = utils_net.get_ip_address_by_interface(host_iface, ip_ver='ipv4') |
| 134 | + |
| 135 | + iface_list = eval(params.get('iface_list', '{}')) |
| 136 | + tap_flag = params.get("tap_flag") |
| 137 | + |
| 138 | + try: |
| 139 | + setup_test() |
| 140 | + run_test() |
| 141 | + |
| 142 | + finally: |
| 143 | + teardown_test() |
0 commit comments