move meta information handling to its own module

Like this, it can be used by modules that cannot depend on
QemuServer.pm without creating a cyclic dependency.

Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
This commit is contained in:
Fiona Ebner 2025-01-17 15:24:23 +01:00 committed by Thomas Lamprecht
parent db528966c9
commit 8c4f436b3c
4 changed files with 53 additions and 40 deletions

View File

@ -35,6 +35,7 @@ use PVE::QemuServer::ImportDisk;
use PVE::QemuServer::Monitor qw(mon_cmd);
use PVE::QemuServer::Machine;
use PVE::QemuServer::Memory qw(get_current_memory);
use PVE::QemuServer::MetaInfo;
use PVE::QemuServer::PCI;
use PVE::QemuServer::QMPHelpers;
use PVE::QemuServer::USB;
@ -1205,7 +1206,7 @@ __PACKAGE__->register_method({
assert_scsi_feature_compatibility($opt, $conf, $storecfg, $param->{$opt});
}
$conf->{meta} = PVE::QemuServer::new_meta_info_string();
$conf->{meta} = PVE::QemuServer::MetaInfo::new_meta_info_string();
my $vollist = [];
eval {

View File

@ -57,6 +57,7 @@ use PVE::QemuServer::CPUConfig qw(print_cpu_device get_cpu_options get_cpu_bitne
use PVE::QemuServer::Drive qw(is_valid_drivename checked_volume_format drive_is_cloudinit drive_is_cdrom drive_is_read_only parse_drive print_drive);
use PVE::QemuServer::Machine;
use PVE::QemuServer::Memory qw(get_current_memory);
use PVE::QemuServer::MetaInfo;
use PVE::QemuServer::Monitor qw(mon_cmd);
use PVE::QemuServer::PCI qw(print_pci_addr print_pcie_addr print_pcie_root_port parse_hostpci);
use PVE::QemuServer::QMPHelpers qw(qemu_deviceadd qemu_devicedel qemu_objectadd qemu_objectdel);
@ -281,21 +282,6 @@ my $rng_fmt = {
},
};
my $meta_info_fmt = {
'ctime' => {
type => 'integer',
description => "The guest creation timestamp as UNIX epoch time",
minimum => 0,
optional => 1,
},
'creation-qemu' => {
type => 'string',
description => "The QEMU (machine) version from the time this VM was created.",
pattern => '\d+(\.\d+)+',
optional => 1,
},
};
my $confdesc = {
onboot => {
optional => 1,
@ -729,7 +715,7 @@ EODESCR
},
meta => {
type => 'string',
format => $meta_info_fmt,
format => $PVE::QemuServer::MetaInfo::meta_info_fmt,
description => "Some (read-only) meta-information about this guest.",
optional => 1,
},
@ -2058,32 +2044,10 @@ sub parse_rng {
return $res;
}
sub parse_meta_info {
my ($value) = @_;
return if !$value;
my $res = eval { parse_property_string($meta_info_fmt, $value) };
warn $@ if $@;
return $res;
}
sub new_meta_info_string {
my () = @_; # for now do not allow to override any value
return PVE::JSONSchema::print_property_string(
{
'creation-qemu' => kvm_user_version(),
ctime => "". int(time()),
},
$meta_info_fmt
);
}
sub qemu_created_version_fixups {
my ($conf, $forcemachine, $kvmver) = @_;
my $meta = parse_meta_info($conf->{meta}) // {};
my $meta = PVE::QemuServer::MetaInfo::parse_meta_info($conf->{meta}) // {};
my $forced_vers = PVE::QemuServer::Machine::extract_version($forcemachine);
# check if we need to apply some handling for VMs that always use the latest machine version but

View File

@ -7,6 +7,7 @@ SOURCES=PCI.pm \
Helpers.pm \
Monitor.pm \
Machine.pm \
MetaInfo.pm \
CPUConfig.pm \
CGroup.pm \
Drive.pm \

View File

@ -0,0 +1,47 @@
package PVE::QemuServer::MetaInfo;
use strict;
use warnings;
use PVE::JSONSchema;
use PVE::QemuServer::Helpers;
our $meta_info_fmt = {
'ctime' => {
type => 'integer',
description => "The guest creation timestamp as UNIX epoch time",
minimum => 0,
optional => 1,
},
'creation-qemu' => {
type => 'string',
description => "The QEMU (machine) version from the time this VM was created.",
pattern => '\d+(\.\d+)+',
optional => 1,
},
};
sub parse_meta_info {
my ($value) = @_;
return if !$value;
my $res = eval { PVE::JSONSchema::parse_property_string($meta_info_fmt, $value) };
warn $@ if $@;
return $res;
}
sub new_meta_info_string {
my () = @_; # for now do not allow to override any value
return PVE::JSONSchema::print_property_string(
{
'creation-qemu' => PVE::QemuServer::Helpers::kvm_user_version(),
ctime => "". int(time()),
},
$meta_info_fmt,
);
}
1;