* [PATCH qemu-server] remote migration: validate custom CPU configs
@ 2026-06-18 8:08 Erik Fastermann
0 siblings, 0 replies; only message in thread
From: Erik Fastermann @ 2026-06-18 8:08 UTC (permalink / raw)
To: pve-devel; +Cc: Erik Fastermann
Previously, a remote migration would fail with a cryptic error message
if a custom CPU model was selected that did not exist on the target
server. Furthermore, no validation was performed to ensure that the
custom CPU definitions matched between the source and target.
Fix this by comparing the CPU configurations before initiating the
migration and aborting early if they do not match.
Reported-by: Walter Hoos <w.hoos@proxmox.com>
Suggested-by: Fiona Ebner <f.ebner@proxmox.com>
Signed-off-by: Erik Fastermann <e.fastermann@proxmox.com>
---
src/PVE/API2/Qemu.pm | 48 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 48 insertions(+)
diff --git a/src/PVE/API2/Qemu.pm b/src/PVE/API2/Qemu.pm
index 54883f1e..3f1362c6 100644
--- a/src/PVE/API2/Qemu.pm
+++ b/src/PVE/API2/Qemu.pm
@@ -5745,6 +5745,54 @@ __PACKAGE__->register_method({
$param->{online} = 0;
}
+ if (defined($conf->{cpu})) {
+ my $cpu = PVE::JSONSchema::parse_property_string('pve-vm-cpu-conf', $conf->{cpu});
+ my $cputype = $cpu->{cputype};
+ if (defined($cputype) && PVE::QemuServer::CPUConfig::is_custom_model($cputype)) {
+ my $custom_cpu = PVE::QemuServer::CPUConfig::get_custom_model($cputype);
+
+ my $remote_custom_cpu = eval {
+ $api_client->get("/cluster/qemu/custom-cpu-models/"
+ . URI::Escape::uri_escape_utf8($cputype));
+ };
+ if (my $err = $@) {
+ die "cpu $cputype config mismatch: $err\n";
+ }
+
+ my $cpu_fmt = PVE::QemuServer::CPUConfig->options();
+ eval { PVE::JSONSchema::validate($remote_custom_cpu, $cpu_fmt); };
+ if (my $err = $@) {
+ die "cpu $cputype config mismatch: $err\n";
+ }
+
+ my @custom_cpu_flags = sort split /;/, ($custom_cpu->{flags} // '');
+ my @remote_custom_cpu_flags = sort split /;/,
+ ($remote_custom_cpu->{flags} // '');
+
+ my $cpu_flags_mismatch_error =
+ "cpu $cputype config mismatch for flags: local="
+ . $custom_cpu->{flags}
+ . ",remote="
+ . $remote_custom_cpu->{flags} . "\n";
+
+ die $cpu_flags_mismatch_error
+ if @custom_cpu_flags != @remote_custom_cpu_flags;
+
+ for my $i (0 .. $#custom_cpu_flags) {
+ die $cpu_flags_mismatch_error
+ if $custom_cpu_flags[$i] ne $remote_custom_cpu_flags[$i];
+ }
+
+ for my $key (sort keys %$cpu_fmt) {
+ next if $key eq 'flags';
+ my $v1 = $custom_cpu->{$key} // '';
+ my $v2 = $remote_custom_cpu->{$key} // '';
+ die "cpu $cputype config mismatch for $key: local=$v1,remote=$v2\n"
+ if $v1 ne $v2;
+ }
+ }
+ }
+
my $storecfg = PVE::Storage::config();
my $target_storage = extract_param($param, 'target-storage');
my $storagemap =
--
2.47.3
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2026-06-18 8:08 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-18 8:08 [PATCH qemu-server] remote migration: validate custom CPU configs Erik Fastermann
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.