parse_config: optional strict mode

when passing a config from one cluster to another, we want to be strict
when parsing - it's better to fail the migration early and upgrade the
target node instead of failing the migration later (when significant
work for transferring disks and/or state has already been done) or not
at all, but silently lose config settings that the target doesn't
understand.

this also might be helpful in other cases - e.g. when restoring from a
backup.

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
This commit is contained in:
Fabian Grünbichler 2022-02-09 14:07:39 +01:00 committed by Thomas Lamprecht
parent dbdcc5cde0
commit ad5812d8fb

View File

@ -2312,7 +2312,7 @@ sub destroy_vm {
}
sub parse_vm_config {
my ($filename, $raw) = @_;
my ($filename, $raw, $strict) = @_;
return if !defined($raw);
@ -2322,6 +2322,16 @@ sub parse_vm_config {
pending => {},
};
my $handle_error = sub {
my ($msg) = @_;
if ($strict) {
die $msg;
} else {
warn $msg;
}
};
$filename =~ m|/qemu-server/(\d+)\.conf$|
|| die "got strange filename '$filename'";
@ -2376,14 +2386,14 @@ sub parse_vm_config {
if ($section eq 'pending') {
$conf->{delete} = $value; # we parse this later
} else {
warn "vm $vmid - propertry 'delete' is only allowed in [PENDING]\n";
$handle_error->("vm $vmid - property 'delete' is only allowed in [PENDING]\n");
}
} elsif ($line =~ m/^([a-z][a-z_]*\d*):\s*(.+?)\s*$/) {
my $key = $1;
my $value = $2;
eval { $value = check_type($key, $value); };
if ($@) {
warn "vm $vmid - unable to parse value of '$key' - $@";
$handle_error->("vm $vmid - unable to parse value of '$key' - $@");
} else {
$key = 'ide2' if $key eq 'cdrom';
my $fmt = $confdesc->{$key}->{format};
@ -2393,7 +2403,7 @@ sub parse_vm_config {
$v->{file} = $volid;
$value = print_drive($v);
} else {
warn "vm $vmid - unable to parse value of '$key'\n";
$handle_error->("vm $vmid - unable to parse value of '$key'\n");
next;
}
}
@ -2401,7 +2411,7 @@ sub parse_vm_config {
$conf->{$key} = $value;
}
} else {
warn "vm $vmid - unable to parse config: $line\n";
$handle_error->("vm $vmid - unable to parse config: $line\n");
}
}