blob: 4e838148e066f25a40fafab5ffb9ebcd027c6d3c [file] [log] [blame]
import re, string, logging
from autotest_lib.client.common_lib import error
from autotest_lib.client.virt import kvm_monitor, virt_vm
def run_physical_resources_check(test, params, env):
"""
Check physical resources assigned to KVM virtual machines:
1) Log into the guest
2) Verify whether cpu counts ,memory size, nics' model,
count and drives' format & count, drive_serial, UUID
reported by the guest OS matches what has been assigned
to the VM (qemu command line)
3) Verify all MAC addresses for guest NICs
@param test: KVM test object.
@param params: Dictionary with the test parameters.
@param env: Dictionary with test environment.
"""
# Define a function for checking number of hard drivers & NICs
def check_num(devices, info_cmd, check_str):
f_fail = []
expected_num = params.objects(devices).__len__()
o = ""
try:
o = vm.monitor.info(info_cmd)
except kvm_monitor.MonitorError, e:
fail_log = e + "\n"
fail_log += "info/query monitor command failed (%s)" % info_cmd
f_fail.append(fail_log)
logging.error(fail_log)
actual_num = string.count(o, check_str)
if expected_num != actual_num:
fail_log = "%s number mismatch:\n" % str(devices)
fail_log += " Assigned to VM: %d\n" % expected_num
fail_log += " Reported by OS: %d" % actual_num
f_fail.append(fail_log)
logging.error(fail_log)
return expected_num, f_fail
# Define a function for checking hard drives & NICs' model
def chk_fmt_model(device, fmt_model, info_cmd, regexp):
f_fail = []
devices = params.objects(device)
for chk_device in devices:
expected = params.object_params(chk_device).get(fmt_model)
if not expected:
expected = "rtl8139"
o = ""
try:
o = vm.monitor.info(info_cmd)
except kvm_monitor.MonitorError, e:
fail_log = e + "\n"
fail_log += "info/query monitor command failed (%s)" % info_cmd
f_fail.append(fail_log)
logging.error(fail_log)
device_found = re.findall(regexp, o)
logging.debug("Found devices: %s", device_found)
found = False
for fm in device_found:
if expected in fm:
found = True
if not found:
fail_log = "%s model mismatch:\n" % str(device)
fail_log += " Assigned to VM: %s\n" % expected
fail_log += " Reported by OS: %s" % device_found
f_fail.append(fail_log)
logging.error(fail_log)
return f_fail
# Define a function to verify UUID & Serial number
def verify_device(expect, name, verify_cmd):
f_fail = []
if verify_cmd:
actual = session.cmd_output(verify_cmd)
if not string.upper(expect) in actual:
fail_log = "%s mismatch:\n" % name
fail_log += " Assigned to VM: %s\n" % string.upper(expect)
fail_log += " Reported by OS: %s" % actual
f_fail.append(fail_log)
logging.error(fail_log)
return f_fail
vm = env.get_vm(params["main_vm"])
vm.verify_alive()
timeout = int(params.get("login_timeout", 360))
session = vm.wait_for_login(timeout=timeout)
logging.info("Starting physical resources check test")
logging.info("Values assigned to VM are the values we expect "
"to see reported by the Operating System")
# Define a failure counter, as we want to check all physical
# resources to know which checks passed and which ones failed
n_fail = []
# We will check HDs with the image name
image_name = virt_vm.get_image_filename(params, test.bindir)
# Check cpu count
logging.info("CPU count check")
expected_cpu_nr = int(params.get("smp"))
actual_cpu_nr = vm.get_cpu_count()
if expected_cpu_nr != actual_cpu_nr:
fail_log = "CPU count mismatch:\n"
fail_log += " Assigned to VM: %s \n" % expected_cpu_nr
fail_log += " Reported by OS: %s" % actual_cpu_nr
n_fail.append(fail_log)
logging.error(fail_log)
# Check memory size
logging.info("Memory size check")
expected_mem = int(params.get("mem"))
actual_mem = vm.get_memory_size()
if actual_mem != expected_mem:
fail_log = "Memory size mismatch:\n"
fail_log += " Assigned to VM: %s\n" % expected_mem
fail_log += " Reported by OS: %s\n" % actual_mem
n_fail.append(fail_log)
logging.error(fail_log)
logging.info("Hard drive count check")
_, f_fail = check_num("images", "block", image_name)
n_fail.extend(f_fail)
logging.info("NIC count check")
_, f_fail = check_num("nics", "network", "model=")
n_fail.extend(f_fail)
logging.info("NICs model check")
f_fail = chk_fmt_model("nics", "nic_model", "network", "model=(.*),")
n_fail.extend(f_fail)
logging.info("Drive format check")
f_fail = chk_fmt_model("images", "drive_format",
"block", "(.*)\: .*%s" % image_name)
n_fail.extend(f_fail)
logging.info("Network card MAC check")
o = ""
try:
o = vm.monitor.info("network")
except kvm_monitor.MonitorError, e:
fail_log = e + "\n"
fail_log += "info/query monitor command failed (network)"
n_fail.append(fail_log)
logging.error(fail_log)
found_mac_addresses = re.findall("macaddr=(\S+)", o)
logging.debug("Found MAC adresses: %s", found_mac_addresses)
num_nics = len(params.objects("nics"))
for nic_index in range(num_nics):
mac = vm.get_mac_address(nic_index)
if not string.lower(mac) in found_mac_addresses:
fail_log = "MAC address mismatch:\n"
fail_log += " Assigned to VM (not found): %s" % mac
n_fail.append(fail_log)
logging.error(fail_log)
logging.info("UUID check")
if vm.get_uuid():
f_fail = verify_device(vm.get_uuid(), "UUID",
params.get("catch_uuid_cmd"))
n_fail.extend(f_fail)
logging.info("Hard Disk serial number check")
catch_serial_cmd = params.get("catch_serial_cmd")
f_fail = verify_device(params.get("drive_serial"), "Serial",
catch_serial_cmd)
n_fail.extend(f_fail)
if n_fail:
session.close()
raise error.TestFail("Physical resources check test "
"reported %s failures:\n%s" %
(len(n_fail), "\n".join(n_fail)))
session.close()