Skip to content

Commit

Permalink
Support to specify virtio-win's version range
Browse files Browse the repository at this point in the history
Add a checkpoint here to check the virtio-win version,
if the version is in the specified range, test will
continue, if not, cancel the test.

Signed-off-by: Leidong Wang <[email protected]>
  • Loading branch information
leidwang committed Jan 16, 2024
1 parent 71382b8 commit 73667e8
Show file tree
Hide file tree
Showing 23 changed files with 289 additions and 133 deletions.
3 changes: 2 additions & 1 deletion avocado_vt/test.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
from virttest import funcatexit
from virttest import utils_env
from virttest import utils_params
from virttest import utils_logfile
from virttest import utils_misc
from virttest import version
from virttest._wrappers import load_source
Expand Down Expand Up @@ -111,7 +112,7 @@ def __init__(self, **kwargs):
self.__vt_params = vt_params
self.debugdir = self.logdir
self.resultsdir = self.logdir
utils_misc.set_log_file_dir(self.logdir)
utils_logfile.set_log_file_dir(self.logdir)
self.__status = None
self.__exc_info = None

Expand Down
2 changes: 1 addition & 1 deletion virttest/cpu.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@
"Opteron_G1": "",
"SapphireRapids": ("serialize,tsxldtrk|tsx-ldtrk,amx_bf16,"
"amx_tile,amx_int8,avx512_bf16,avx_vnni,"
"avx512_fp16"),
"avx512_fp16,hle,rtm,taa-no"),
"Snowridge": "split_lock_detect,gfni,movdiri,movdiri64b,cldemote",
"Cooperlake": "avx512_bf16,stibp,arch_capabilities,hle,rtm",
"Icelake-Server": "avx512_vnni,la57,clflushopt,hle,rtm",
Expand Down
38 changes: 37 additions & 1 deletion virttest/env_process.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
from virttest import migration
from virttest import utils_kernel_module
from virttest import arch
from virttest import utils_logfile
from virttest.utils_conn import SSHConnection
from virttest.utils_version import VersionInterval
from virttest.staging import service
Expand Down Expand Up @@ -630,6 +631,8 @@ def postprocess_vm(test, params, env, name):
except Exception:
pass

utils_logfile.close_log_file()

if params.get("vm_extra_dump_paths") is not None:
vm_extra_dumps = os.path.join(test.outputdir, "vm_extra_dumps")
if not os.path.exists(vm_extra_dumps):
Expand Down Expand Up @@ -1156,6 +1159,7 @@ def preprocess(test, params, env):
# leave them untouched if they have to be disregarded only for this test
requested_vms = params.objects("vms")
keep_unrequested_vms = params.get_boolean("keep_unrequested_vms", False)
kill_unrequested_vms_gracefully = params.get_boolean("kill_unrequested_vms_gracefully", True)
for key in list(env.keys()):
vm = env[key]
if not isinstance(vm, virt_vm.BaseVM):
Expand All @@ -1165,7 +1169,7 @@ def preprocess(test, params, env):
LOG.debug("The vm %s is registered in the env and disregarded "
"in the current test", vm.name)
else:
vm.destroy()
vm.destroy(gracefully=kill_unrequested_vms_gracefully)
del env[key]

global KVM_MODULE_HANDLERS
Expand Down Expand Up @@ -1240,6 +1244,38 @@ def preprocess(test, params, env):
test.cancel("Got host qemu version:%s, which is not in %s" %
(host_qemu, required_qemu))

# Checking required virtio-win version, if not satisfied, cancel test
if params.get("required_virtio_win"):
if params.get("cdrom_virtio"):
required_virtio_win = params["required_virtio_win"]
LOG.info("Checking required virtio-win version: %s" % required_virtio_win)
cdrom_virtio = params["cdrom_virtio"]
cdrom_virtio_path = os.path.join(data_dir.get_data_dir(), cdrom_virtio)
cdrom_virtio_path = os.path.realpath(cdrom_virtio_path)
if re.search('prewhql', cdrom_virtio_path):
match = re.search("\d+.\d+-\d+", cdrom_virtio_path)
else:
match = re.search("\d+.\d+\d+-\d+", cdrom_virtio_path)
if match is None:
test.error("Can not get virtio-win version from \"cdrom_virtio\": %s" % cdrom_virtio)
cdrom_virtio_version = re.sub('-', '.', match.group(0))
if cdrom_virtio_version not in VersionInterval(required_virtio_win):
test.cancel("Got virtio-win version:%s, which is not in %s" %
(cdrom_virtio_version, required_virtio_win))
else:
LOG.warning("required_virtio_win can not take effect without cdrom_virtio")

# Get the version of bootloader
vm_bootloader_ver_cmd = params.get("vm_bootloader_ver_cmd", "")
if vm_bootloader_ver_cmd:
try:
vm_bootloader_ver = a_process.run(
vm_bootloader_ver_cmd, shell=True).stdout_text.strip()
except a_process.CmdError:
vm_bootloader_ver = "Unkown"
version_info["vm_bootloader_version"] = str(vm_bootloader_ver)
LOG.debug("vm bootloader version: %s", vm_bootloader_ver)

# Get the Libvirt version
if vm_type == "libvirt":
libvirt_ver_cmd = params.get("libvirt_ver_cmd", "libvirtd -V|awk -F' ' '{print $3}'")
Expand Down
2 changes: 1 addition & 1 deletion virttest/ip_sniffing.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

import six

from virttest.utils_misc import log_line
from virttest.utils_logfile import log_line
from virttest.utils_version import VersionInterval

LOG = logging.getLogger('avocado.' + __name__)
Expand Down
12 changes: 7 additions & 5 deletions virttest/libvirt_vm.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
from avocado.core import exceptions

from virttest import error_context
from virttest import utils_logfile
from virttest import utils_misc
from virttest import cpu
from virttest import virt_vm
Expand Down Expand Up @@ -1455,9 +1456,10 @@ def _create_serial_console(self):
cmd += (" console %s %s" % (self.name, self.serial_ports[0]))
except IndexError:
raise virt_vm.VMConfigMissingError(self.name, "serial")
output_func = utils_misc.log_line # Because qemu-kvm uses this
output_func = utils_logfile.log_line # Because qemu-kvm uses this
port = self.serial_ports[0]
# Because qemu-kvm hard-codes this
output_filename = self.get_serial_console_filename(self.serial_ports[0])
output_filename = self.get_serial_console_filename(port)
output_params = (output_filename,)
prompt = self.params.get("shell_prompt", "[\#\$]")
LOG.debug("Command used to create serial console: %s", cmd)
Expand All @@ -1467,10 +1469,10 @@ def _create_serial_console(self):
prompt=prompt)
if not self.serial_console.is_alive():
LOG.error("Failed to create serial_console")
# Cause serial_console.close() to close open log file
self.serial_console.set_log_file(output_filename)
self.serial_console_log = os.path.join(utils_misc.get_log_file_dir(),
self.serial_console_log = os.path.join(utils_logfile.get_log_file_dir(),
output_filename)
# Cause serial_console.close() to close open log file
self.serial_console.close_hooks += [utils_logfile.close_own_log_file(self.serial_console_log)]

def set_root_serial_console(self, device, remove=False):
"""
Expand Down
8 changes: 7 additions & 1 deletion virttest/libvirt_xml/devices/memory.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,8 @@ class Target(base.base.LibvirtXMLBase):
__slots__ = ('size', 'size_unit', 'node', 'label',
'requested_size', 'requested_unit',
'current_size', 'current_unit',
'block_size', 'block_unit', 'readonly')
'block_size', 'block_unit', 'readonly',
'address')

def __init__(self, virsh_instance=base.base.virsh):
accessors.XMLElementInt('size',
Expand Down Expand Up @@ -113,6 +114,11 @@ def __init__(self, virsh_instance=base.base.virsh):
'virsh_instance': virsh_instance})
accessors.XMLElementBool('readonly', self, parent_xpath='/',
tag_name='readonly')
accessors.XMLElementNest('address', self, parent_xpath='/',
tag_name='address', subclass=Memory.Address,
subclass_dargs={
'type_name': 'pci',
'virsh_instance': virsh_instance})
super(self.__class__, self).__init__(virsh_instance=virsh_instance)
self.xml = '<target/>'

Expand Down
3 changes: 2 additions & 1 deletion virttest/migration.py
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,7 @@ def _run_complex_func(vm, one_func, virsh_event_session=None):
after_event = one_func.get('after_event')
before_event = one_func.get('before_event')
func = one_func.get('func')
wait_for_after_event_timeout = one_func.get('wait_for_after_event_timeout', '30')
if after_event and not virsh_event_session:
raise exceptions.TestError("virsh session for collecting domain "
"events is not provided")
Expand All @@ -421,7 +422,7 @@ def _run_complex_func(vm, one_func, virsh_event_session=None):
"%s", virsh_event_session.get_stripped_output())
if not utils_misc.wait_for(
lambda: re.findall(after_event,
virsh_event_session.get_stripped_output()), 30):
virsh_event_session.get_stripped_output()), wait_for_after_event_timeout):
raise exceptions.TestError("Unable to find "
"event {}".format(after_event))
LOG.debug("Receive the event '{}'".format(after_event))
Expand Down
3 changes: 2 additions & 1 deletion virttest/qemu_devices/qcontainer.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
# Internal imports
from virttest import vt_iothread
from virttest import utils_qemu
from virttest import utils_logfile
from virttest import utils_misc
from virttest import arch, storage, data_dir, virt_vm
from virttest import qemu_storage
Expand Down Expand Up @@ -3193,7 +3194,7 @@ def tpm_define_by_params(self, name, params):

def _handle_log(line):
try:
utils_misc.log_line('%s_swtpm_setup.log' % name, line)
utils_logfile.log_line('%s_swtpm_setup.log' % name, line)
except Exception as e:
LOG.warn("Can't log %s_swtpm_setup output: %s.", name, e)

Expand Down
5 changes: 3 additions & 2 deletions virttest/qemu_devices/qdevices.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import aexpect

from virttest import qemu_monitor, utils_numeric
from virttest import utils_logfile
from virttest import utils_misc
from virttest.qemu_devices.utils import DeviceError
from virttest.qemu_devices.utils import none_or_int
Expand Down Expand Up @@ -2082,7 +2083,7 @@ def _handle_log(self, line):
"""Handle the log of virtiofs daemon."""
name = self.get_param('name')
try:
utils_misc.log_line('%s-%s.log' % (self.get_qid(), name), line)
utils_logfile.log_line('%s-%s.log' % (self.get_qid(), name), line)
except Exception as e:
LOG.warn("Can't log %s-%s, output: '%s'.", self.get_qid(), name, e)

Expand Down Expand Up @@ -2155,7 +2156,7 @@ def start_daemon(self):
if self.get_param('version') in ('2.0', ):
tpm_cmd += ' --tpm2'

log_dir = utils_misc.get_log_file_dir()
log_dir = utils_logfile.get_log_file_dir()
log_file = os.path.join(log_dir, '%s_swtpm.log' % self.get_qid())
Path(log_file).touch(mode=0o644, exist_ok=True)
tpm_cmd += ' --log file=%s' % log_file
Expand Down
3 changes: 2 additions & 1 deletion virttest/qemu_io.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import aexpect
from avocado.utils import process

from virttest import utils_logfile
from virttest import utils_misc
from virttest import error_context

Expand All @@ -27,7 +28,7 @@ def __init__(self, test, params, image_name, blkdebug_cfg="",
self.type = ""
if log_filename:
log_filename += "-" + utils_misc.generate_random_string(4)
self.output_func = utils_misc.log_line
self.output_func = utils_logfile.log_line
self.output_params = (log_filename,)
else:
self.output_func = None
Expand Down
4 changes: 2 additions & 2 deletions virttest/qemu_monitor.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

import six

from . import utils_logfile
from . import utils_misc
from . import cartesian_config
from . import data_dir
Expand Down Expand Up @@ -449,8 +450,7 @@ def _log_lines(self, log_str):
raise MonitorLockError("Could not acquire exclusive lock to access"
" %s" % self.open_log_files)
try:
log_file_dir = utils_misc.get_log_file_dir()
log = utils_misc.get_path(log_file_dir, self.log_file)
log = utils_logfile.get_log_filename(self.log_file)
timestr = time.strftime("%Y-%m-%d %H:%M:%S")
try:
if log not in self.open_log_files:
Expand Down
13 changes: 9 additions & 4 deletions virttest/qemu_vm.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import six
from six.moves import xrange

from virttest import utils_logfile
from virttest import utils_misc
from virttest import utils_qemu
from virttest import cpu
Expand Down Expand Up @@ -936,6 +937,9 @@ def add_pcidevice(devices, host, params, device_driver="pci-assign",
pci_bus='pci.0'):
if devices.has_device(device_driver):
dev = QDevice(device_driver, parent_bus=pci_bus)
set_cmdline_format_by_cfg(dev,
self._get_cmdline_format_cfg(),
'nics')
else:
dev = qdevices.QCustomDevice('pcidevice', parent_bus=pci_bus)
help_cmd = "%s -device %s,\? 2>&1" % (qemu_binary, device_driver)
Expand Down Expand Up @@ -2918,7 +2922,7 @@ def _create_serial_console(self):
self.serial_console = aexpect.ShellSession(
"nc -U %s" % file_name,
auto_close=False,
output_func=utils_misc.log_line,
output_func=utils_logfile.log_line,
output_params=(log_name,),
prompt=self.params.get("shell_prompt", "[\#\$]"),
status_test_command=self.params.get("status_test_command",
Expand Down Expand Up @@ -3517,13 +3521,14 @@ def create(self, name=None, params=None, root_dir=None,
self.create_serial_console()

for key, value in list(self.logs.items()):
outfile = "%s-%s.log" % (key, name)
outfile = os.path.join(utils_logfile.get_log_file_dir(),
"%s-%s.log" % (key, name))
self.logsessions[key] = aexpect.Tail(
"nc -U %s" % value,
auto_close=False,
output_func=utils_misc.log_line,
output_func=utils_logfile.log_line,
output_params=(outfile,))
self.logsessions[key].set_log_file(outfile)
self.logsessions[key].close_hooks += [utils_logfile.close_own_log_file(outfile)]

# Wait for IO channels setting up completely,
# such as serial console.
Expand Down
2 changes: 1 addition & 1 deletion virttest/remote.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ def remote_commander(client, host, port, username, password, prompt,
log_file = utils_logfile.get_log_filename(log_filename)
session.set_output_func(utils_logfile.log_line)
session.set_output_params((log_file,))
session.set_log_file(os.path.basename(log_file))
session.close_hooks += [utils_logfile.close_own_log_file(log_file)]

session.send_ctrl("raw")
# Wrap io interfaces.
Expand Down
7 changes: 7 additions & 0 deletions virttest/shared/cfg/base.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -1087,3 +1087,10 @@ uuid_dimm = ""

# Set image_extent_size_hint, displayed in qemu-img info extend_size_hint field.
#image_extent_size_hint = 1G #To set extent_size_hint to 1G

#
#VM bootloader params
#
#Notes: please make sure the corresponding firmware before you set this value!
#eg. for x86_64
#vm_bootloader_ver_cmd = "rpm -qa|grep ^sea"
18 changes: 12 additions & 6 deletions virttest/staging/utils_memory.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,28 +13,34 @@


# Returns total memory in kb
def read_from_meminfo(key, session=None):
def read_from_meminfo(key, session=None, node_id=''):
"""
wrapper to return value from /proc/meminfo using key
:param key: filter based on the key
:param session: ShellSession Object of remote host / guest
:param node_id: str, numa node id
:return: value mapped to the key of type int
"""
func = process.getoutput
if session:
func = session.cmd_output
meminfo = func('grep %s /proc/meminfo' % key)
return int(re.search(r'\d+', meminfo).group(0))
search_file = '/sys/devices/system/node/node%s/meminfo' % node_id \
if node_id else '/proc/meminfo'

meminfo = func('grep %s %s' % (key, search_file))
return int(re.findall(r'%s:\s+(\d+)' % key, meminfo)[0])

def memtotal(session=None):

def memtotal(session=None, node_id=''):
"""
Method to get the memtotal from /proc/meminfo
Method to get the memtotal from /proc/meminfo or
/sys/devices/system/node/nodexx/meminfo
:param session: ShellSession Object of remote host / guest
:param node_id: str, numa node id
"""
return read_from_meminfo('MemTotal', session=session)
return read_from_meminfo('MemTotal', session=session, node_id=node_id)


def freememtotal(session=None):
Expand Down
3 changes: 2 additions & 1 deletion virttest/test_setup/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
from virttest import data_dir
from virttest import error_context
from virttest import cpu
from virttest import utils_logfile
from virttest import utils_misc
from virttest import versionable_class
from virttest import openvswitch
Expand Down Expand Up @@ -1647,7 +1648,7 @@ def sr_iov_setup(self):
file_name = "host_dmesg_after_load_%s.txt" % self.driver
LOG.info("Log dmesg after loading '%s' to '%s'.", self.driver,
file_name)
utils_misc.log_line(file_name, dmesg)
utils_logfile.log_line(file_name, dmesg)
self.setup = None
return True

Expand Down
Loading

0 comments on commit 73667e8

Please sign in to comment.