未验证 提交 92f6c5c9 编写于 作者: Y YongxueHong 提交者: GitHub

Merge pull request #1470 from lolyu/1612025

nfs_corrupt: check nfs is resumed before cont vm
...@@ -14,5 +14,5 @@ ...@@ -14,5 +14,5 @@
drive_cache = none drive_cache = none
kill_vm = yes kill_vm = yes
post_command_noncritical = yes post_command_noncritical = yes
wait_paused_timeout = 120 wait_paused_timeout = 240
nfs_stat_chk_re = "running" nfs_stat_chk_re = "running"
...@@ -8,6 +8,10 @@ from virttest import utils_misc ...@@ -8,6 +8,10 @@ from virttest import utils_misc
from virttest import utils_net from virttest import utils_net
from virttest import env_process from virttest import env_process
from virttest import error_context from virttest import error_context
from virttest import utils_disk
from virttest import utils_numeric
from virttest import virt_vm
from virttest import qemu_monitor
class NFSCorruptError(Exception): class NFSCorruptError(Exception):
...@@ -21,6 +25,9 @@ class NFSCorruptConfig(object): ...@@ -21,6 +25,9 @@ class NFSCorruptConfig(object):
""" """
This class sets up nfs_corrupt test environment. This class sets up nfs_corrupt test environment.
""" """
iptables_template = ("iptables -t filter -{{op}} INPUT -d {ip} -m state"
" --state NEW,RELATED,ESTABLISHED -p tcp --dport 2049"
" -j REJECT")
def __init__(self, test, params, ip="localhost"): def __init__(self, test, params, ip="localhost"):
self.nfs_dir = os.path.join(test.tmpdir, "nfs_dir") self.nfs_dir = os.path.join(test.tmpdir, "nfs_dir")
...@@ -28,6 +35,7 @@ class NFSCorruptConfig(object): ...@@ -28,6 +35,7 @@ class NFSCorruptConfig(object):
self.chk_re = params.get("nfs_stat_chk_re", "running") self.chk_re = params.get("nfs_stat_chk_re", "running")
self.nfs_ip = ip self.nfs_ip = ip
self.required_size = params.object_params("stg").get("image_size") self.required_size = params.object_params("stg").get("image_size")
self.iptables_template = self.iptables_template.format(ip=self.nfs_ip)
cmd_list = self._get_service_cmds() cmd_list = self._get_service_cmds()
self.start_cmd = cmd_list[0] self.start_cmd = cmd_list[0]
...@@ -89,14 +97,19 @@ class NFSCorruptConfig(object): ...@@ -89,14 +97,19 @@ class NFSCorruptConfig(object):
error_context.context("Checking available space to export", error_context.context("Checking available space to export",
logging.info) logging.info)
stat = os.statvfs(self.nfs_dir) stat = os.statvfs(self.nfs_dir)
free = str(stat.f_bsize * stat.f_bfree) + 'B' free = stat.f_bsize * stat.f_bfree
available_size = float(utils_misc.normalize_data_size(free, required = float(
order_magnitude="M")) utils_misc.normalize_data_size(
required_size = float(utils_misc.normalize_data_size(self.required_size, self.required_size,
order_magnitude="M")) order_magnitude="B"
if available_size < required_size: )
raise NFSCorruptError("Space available: %fM, space needed: %fM" )
% (available_size, required_size)) if free < required:
msg = "Space available: %s, space needed: %s" % (
utils_numeric.format_size_human_readable(free),
self.required_size
)
raise NFSCorruptError(msg)
if force_start: if force_start:
self.start_service() self.start_service()
...@@ -112,12 +125,30 @@ class NFSCorruptConfig(object): ...@@ -112,12 +125,30 @@ class NFSCorruptConfig(object):
@error_context.context_aware @error_context.context_aware
def cleanup(self, force_stop=False): def cleanup(self, force_stop=False):
error_context.context("Cleaning up test NFS share", logging.info) error_context.context("Cleaning up test NFS share", logging.info)
process.run("umount %s" % self.mnt_dir, shell=True) process.run("umount -l -f %s" % self.mnt_dir, shell=True)
process.run("exportfs -u %s:%s" % (self.nfs_ip, self.nfs_dir), process.run("exportfs -u %s:%s" % (self.nfs_ip, self.nfs_dir),
shell=True) shell=True)
if force_stop: if force_stop:
self.stop_service() self.stop_service()
def is_mounted(self):
"""
Return True if nfs is mounted, otherwise False.
"""
return utils_disk.is_mount(self.mnt_dir)
def is_mounted_dir_acessible(self):
"""
Check to see if mount directory is accessible.
"""
if not self.is_mounted():
return False
try:
os.stat(self.mnt_dir)
except OSError:
return False
return True
def start_service(self): def start_service(self):
""" """
Starts the NFS server. Starts the NFS server.
...@@ -143,13 +174,18 @@ class NFSCorruptConfig(object): ...@@ -143,13 +174,18 @@ class NFSCorruptConfig(object):
:param chk_re: Regular expression that tells whether NFS is running :param chk_re: Regular expression that tells whether NFS is running
or not. or not.
""" """
status = process.system_output(self.status_cmd, ignore_status=True, out = process.run(self.status_cmd, ignore_status=True, shell=True)
shell=True) if re.findall(self.chk_re, out.stdout_text):
if re.findall(self.chk_re, status):
return True return True
else: else:
return False return False
def iptables_rule_gen(self, op='A'):
"""
Generate iptables rules to block/accept nfs connection.
"""
return self.iptables_template.format(op=op)
@error_context.context_aware @error_context.context_aware
def run(test, params, env): def run(test, params, env):
...@@ -190,7 +226,7 @@ def run(test, params, env): ...@@ -190,7 +226,7 @@ def run(test, params, env):
cmd = "ls /dev/[sh]d[a-z]" cmd = "ls /dev/[sh]d[a-z]"
cmd += " | tail -n 1" cmd += " | tail -n 1"
return session.cmd_output(cmd) return session.cmd_output(cmd).rstrip()
def check_vm_status(vm, status): def check_vm_status(vm, status):
""" """
...@@ -203,7 +239,7 @@ def run(test, params, env): ...@@ -203,7 +239,7 @@ def run(test, params, env):
""" """
try: try:
vm.verify_status(status) vm.verify_status(status)
except: except (virt_vm.VMStatusError, qemu_monitor.MonitorLockError):
return False return False
else: else:
return True return True
...@@ -225,19 +261,23 @@ def run(test, params, env): ...@@ -225,19 +261,23 @@ def run(test, params, env):
env_process.preprocess_image(test, stg_params, image_name) env_process.preprocess_image(test, stg_params, image_name)
vm = env.get_vm(params["main_vm"]) vm = env.get_vm(params["main_vm"])
vm.create(params=params) try:
vm.create(params=params)
except Exception:
config.cleanup()
test.error("failed to create VM")
session = vm.wait_for_login(timeout=int(params.get("login_timeout", 360))) session = vm.wait_for_login(timeout=int(params.get("login_timeout", 360)))
nfs_devname = get_nfs_devname(params, session) nfs_devname = get_nfs_devname(params, session)
# Write disk on NFS server # Write disk on NFS server
error_context.context("Write disk that image on NFS", logging.info) error_context.context("Write disk that image on NFS", logging.info)
write_disk_cmd = "dd if=/dev/urandom of=%s" % nfs_devname write_disk_cmd = "dd if=/dev/zero of=%s oflag=direct" % nfs_devname
logging.info("dd with command: %s", write_disk_cmd)
session.sendline(write_disk_cmd) session.sendline(write_disk_cmd)
try: try:
# Read some command output, it will timeout # Read some command output, it will timeout
session.read_up_to_prompt(timeout=30) session.read_up_to_prompt(timeout=30)
except: except Exception:
pass pass
try: try:
...@@ -247,37 +287,26 @@ def run(test, params, env): ...@@ -247,37 +287,26 @@ def run(test, params, env):
vm.verify_status("running") vm.verify_status("running")
try: try:
cmd = "iptables" error_context.context("Reject NFS connection on host",
cmd += " -t filter" logging.info)
cmd += " -A INPUT" process.system(config.iptables_rule_gen('A'))
cmd += " -d %s" % host_ip
cmd += " -m state" error_context.context("Check if VM status is 'paused'",
cmd += " --state NEW,RELATED,ESTABLISHED" logging.info)
cmd += " -p tcp"
cmd += " --dport 2049"
cmd += " -j REJECT"
error_context.context("Reject NFS connection on host", logging.info)
process.system(cmd)
error_context.context("Check if VM status is 'paused'", logging.info)
if not utils_misc.wait_for( if not utils_misc.wait_for(
lambda: check_vm_status(vm, "paused"), lambda: check_vm_status(vm, "paused"),
int(params.get('wait_paused_timeout', 120))): int(params.get('wait_paused_timeout', 240))):
test.error("Guest is not paused after stop NFS") test.error("Guest is not paused after stop NFS")
finally: finally:
error_context.context("Accept NFS connection on host", logging.info) error_context.context("Accept NFS connection on host",
cmd = "iptables" logging.info)
cmd += " -t filter" process.system(config.iptables_rule_gen('D'))
cmd += " -D INPUT"
cmd += " -d %s" % host_ip error_context.context("Ensure nfs is resumed", logging.info)
cmd += " -m state" nfs_resume_timeout = int(params.get('nfs_resume_timeout', 240))
cmd += " --state NEW,RELATED,ESTABLISHED" if not utils_misc.wait_for(config.is_mounted_dir_acessible,
cmd += " -p tcp" nfs_resume_timeout):
cmd += " --dport 2049" test.error("NFS connection does not resume")
cmd += " -j REJECT"
process.system(cmd)
error_context.context("Continue guest", logging.info) error_context.context("Continue guest", logging.info)
vm.resume() vm.resume()
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册