import logging, os, signal, re, time
from autotest_lib.client.common_lib import error
from autotest_lib.client.bin import utils
from autotest_lib.client.virt import aexpect, virt_utils
def run_netstress_kill_guest(test, params, env):
"""
Try stop network interface in VM when other VM try to communicate.
@param test: kvm test object
@param params: Dictionary with the test parameters
@param env: Dictionary with test environment.
"""
def get_corespond_ip(ip):
"""
Get local ip address which is used for contact ip.
@param ip: Remote ip
@return: Local corespond IP.
"""
result = utils.run("ip route get %s" % (ip)).stdout
ip = re.search("src (.+)", result)
if ip is not None:
ip = ip.groups()[0]
return ip
def get_ethernet_driver(session):
"""
Get driver of network cards.
@param session: session to machine
"""
modules = []
out = session.cmd("ls -l --color=never "
"/sys/class/net/*/device/driver/module")
for module in out.split("\n"):
modules.append(module.split("/")[-1])
modules.remove("")
return set(modules)
def kill_and_check(vm):
vm_pid = vm.get_pid()
vm.destroy(gracefully=False)
time.sleep(2)
try:
os.kill(vm_pid, 0)
logging.error("VM is not dead")
raise error.TestFail("VM is not dead after sending signal 0 to it")
except OSError:
logging.info("VM is dead")
def netload_kill_problem(session_serial):
netperf_dir = os.path.join(os.environ['AUTODIR'], "tests/netperf2")
setup_cmd = params.get("setup_cmd")
clean_cmd = params.get("clean_cmd")
firewall_flush = "iptables -F"
try:
utils.run(firewall_flush)
except:
logging.warning("Could not flush firewall rules on guest")
try:
session_serial.cmd(firewall_flush)
except aexpect.ShellError:
logging.warning("Could not flush firewall rules on guest")
for i in params.get("netperf_files").split():
vm.copy_files_to(os.path.join(netperf_dir, i), "/tmp")
guest_ip = vm.get_address(0)
server_ip = get_corespond_ip(guest_ip)
logging.info("Setup and run netperf on host and guest")
session_serial.cmd(setup_cmd % "/tmp", timeout=200)
utils.run(setup_cmd % netperf_dir)
try:
session_serial.cmd(clean_cmd)
except:
pass
session_serial.cmd(params.get("netserver_cmd") % "/tmp")
utils.run(clean_cmd, ignore_status=True)
utils.run(params.get("netserver_cmd") % netperf_dir)
server_netperf_cmd = params.get("netperf_cmd") % (netperf_dir, "TCP_STREAM",
guest_ip, params.get("packet_size", "1500"))
quest_netperf_cmd = params.get("netperf_cmd") % ("/tmp", "TCP_STREAM",
server_ip, params.get("packet_size", "1500"))
tcpdump = env.get("tcpdump")
pid = None
if tcpdump:
# Stop the background tcpdump process
try:
pid = int(utils.system_output("pidof tcpdump"))
logging.debug("Stopping the background tcpdump")
os.kill(pid, signal.SIGSTOP)
except:
pass
try:
logging.info("Start heavy network load host <=> guest.")
session_serial.sendline(quest_netperf_cmd)
utils.BgJob(server_netperf_cmd)
#Wait for create big network usage.
time.sleep(10)
kill_and_check(vm)
finally:
utils.run(clean_cmd, ignore_status=True)
if tcpdump and pid:
logging.debug("Resuming the background tcpdump")
logging.info("pid is %s" % pid)
os.kill(pid, signal.SIGCONT)
def netdriver_kill_problem(session_serial):
modules = get_ethernet_driver(session_serial)
logging.debug(modules)
for _ in range(50):
for module in modules:
session_serial.cmd("rmmod %s" % (module))
time.sleep(0.2)
for module in modules:
session_serial.cmd("modprobe %s" % (module))
time.sleep(0.2)
kill_and_check(vm)
vm = env.get_vm(params["main_vm"])
vm.verify_alive()
login_timeout = int(params.get("login_timeout", 360))
session = vm.wait_for_login(timeout=login_timeout)
session.close()
session_serial = vm.wait_for_serial_login(timeout=login_timeout)
mode = params.get("mode")
if mode == "driver":
netdriver_kill_problem(session_serial)
elif mode == "load":
netload_kill_problem(session_serial)