move kvm_user_version() function to helpers module

Add an export, since the function is rather commonly used (in
particular inlined in function calls, where prefixing with the module
name would hurt readability) and there won't be much potential for
confusion name-wise.

This was the only user of stat(), so remove the File::stat include.

Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
This commit is contained in:
Fiona Ebner 2025-01-17 15:24:17 +01:00 committed by Thomas Lamprecht
parent 0050aa8735
commit 1715febd33
4 changed files with 34 additions and 33 deletions

View File

@ -854,7 +854,7 @@ sub assert_scsi_feature_compatibility {
my $machine_type = PVE::QemuServer::get_vm_machine($conf, undef, $conf->{arch});
my $machine_version = PVE::QemuServer::Machine::extract_version(
$machine_type, PVE::QemuServer::kvm_user_version());
$machine_type, PVE::QemuServer::Helpers::kvm_user_version());
my $drivetype = PVE::QemuServer::Drive::get_scsi_device_type(
$drive, $storecfg, $machine_version);

View File

@ -10,7 +10,6 @@ use Fcntl;
use File::Basename;
use File::Copy qw(copy);
use File::Path;
use File::stat;
use Getopt::Long;
use IO::Dir;
use IO::File;
@ -51,7 +50,7 @@ use PVE::Tools qw(run_command file_read_firstline file_get_contents dir_glob_for
use PVE::QMPClient;
use PVE::QemuConfig;
use PVE::QemuServer::Helpers qw(config_aware_timeout min_version windows_version);
use PVE::QemuServer::Helpers qw(config_aware_timeout min_version kvm_user_version windows_version);
use PVE::QemuServer::Cloudinit;
use PVE::QemuServer::CGroup;
use PVE::QemuServer::CPUConfig qw(print_cpu_device get_cpu_options get_cpu_bitness is_native_arch get_amd_sev_object);
@ -1193,35 +1192,6 @@ sub kvm_version {
return $kvm_api_version;
}
my $kvm_user_version = {};
my $kvm_mtime = {};
sub kvm_user_version {
my ($binary) = @_;
$binary //= PVE::QemuServer::Helpers::get_command_for_arch(get_host_arch()); # get the native arch by default
my $st = stat($binary);
my $cachedmtime = $kvm_mtime->{$binary} // -1;
return $kvm_user_version->{$binary} if $kvm_user_version->{$binary} &&
$cachedmtime == $st->mtime;
$kvm_user_version->{$binary} = 'unknown';
$kvm_mtime->{$binary} = $st->mtime;
my $code = sub {
my $line = shift;
if ($line =~ m/^QEMU( PC)? emulator version (\d+\.\d+(\.\d+)?)(\.\d+)?[,\s]/) {
$kvm_user_version->{$binary} = $2;
}
};
eval { run_command([$binary, '--version'], outfunc => $code); };
warn $@ if $@;
return $kvm_user_version->{$binary};
}
my sub extract_version {
my ($machine_type, $version) = @_;
$version = kvm_user_version() if !defined($version);

View File

@ -14,6 +14,7 @@ use base 'Exporter';
our @EXPORT_OK = qw(
min_version
config_aware_timeout
kvm_user_version
parse_number_sets
windows_version
);
@ -33,6 +34,35 @@ sub get_command_for_arch($) {
return $cmd;
}
my $kvm_user_version = {};
my $kvm_mtime = {};
sub kvm_user_version {
my ($binary) = @_;
$binary //= get_command_for_arch(get_host_arch()); # get the native arch by default
my $st = stat($binary);
my $cachedmtime = $kvm_mtime->{$binary} // -1;
return $kvm_user_version->{$binary} if $kvm_user_version->{$binary} &&
$cachedmtime == $st->mtime;
$kvm_user_version->{$binary} = 'unknown';
$kvm_mtime->{$binary} = $st->mtime;
my $code = sub {
my $line = shift;
if ($line =~ m/^QEMU( PC)? emulator version (\d+\.\d+(\.\d+)?)(\.\d+)?[,\s]/) {
$kvm_user_version->{$binary} = $2;
}
};
eval { PVE::Tools::run_command([$binary, '--version'], outfunc => $code); };
warn $@ if $@;
return $kvm_user_version->{$binary};
}
# Paths and directories
our $var_run_tmpdir = "/var/run/qemu-server";

View File

@ -15,6 +15,7 @@ use PVE::SysFSTools;
use PVE::QemuConfig;
use PVE::QemuServer;
use PVE::QemuServer::Helpers;
use PVE::QemuServer::Monitor;
use PVE::QemuServer::QMPHelpers;
use PVE::QemuServer::CPUConfig;
@ -72,7 +73,7 @@ my $base_env = {
}
},
vmid => 8006,
real_qemu_version => PVE::QemuServer::kvm_user_version(), # not yet mocked
real_qemu_version => PVE::QemuServer::Helpers::kvm_user_version(), # not yet mocked
};
my $pci_devs = [