vzdump: move include logic for volumes to method

Move the logic which volumes are included in the backup job to its own
method and adapt the VZDump code accordingly. This makes it possible to
develop other features around backup jobs.

Signed-off-by: Aaron Lauterer <a.lauterer@proxmox.com>
This commit is contained in:
Aaron Lauterer 2020-06-22 16:34:36 +02:00 committed by Thomas Lamprecht
parent a4e128a9a9
commit 185df962a5
2 changed files with 48 additions and 19 deletions

View File

@ -165,6 +165,38 @@ sub get_replicatable_volumes {
return $volhash;
}
sub get_backup_volumes {
my ($class, $conf) = @_;
my $return_volumes = [];
my $test_volume = sub {
my ($key, $drive) = @_;
return if PVE::QemuServer::drive_is_cdrom($drive);
my $included = $drive->{backup} // 1;
my $reason = "backup=";
$reason .= defined($drive->{backup}) ? 'no' : 'yes';
if ($key =~ m/^efidisk/ && (!defined($conf->{bios}) || $conf->{bios} ne 'ovmf')) {
$included = 0;
$reason = "efidisk but no OMVF BIOS";
}
push @$return_volumes, {
key => $key,
included => $included,
reason => $reason,
volume_config => $drive,
};
};
PVE::QemuConfig->foreach_volume($conf, $test_volume);
return $return_volumes;
}
sub __snapshot_save_vmstate {
my ($class, $vmid, $conf, $snapname, $storecfg, $statestorage, $suspend) = @_;

View File

@ -69,37 +69,34 @@ sub prepare {
my $vollist = [];
my $drivehash = {};
PVE::QemuConfig->foreach_volume($conf, sub {
my ($ds, $drive) = @_;
my $backup_volumes = PVE::QemuConfig->get_backup_volumes($conf);
return if PVE::QemuServer::drive_is_cdrom($drive);
foreach my $volume (@{$backup_volumes}) {
my $name = $volume->{key};
my $volume_config= $volume->{volume_config};
my $volid = $volume_config->{file};
my $volid = $drive->{file};
if (defined($drive->{backup}) && !$drive->{backup}) {
$self->loginfo("exclude disk '$ds' '$volid' (backup=no)");
return;
} elsif ($self->{vm_was_running} && $drive->{iothread}) {
if (!$volume->{included}) {
$self->loginfo("exclude disk '$name' '$volid' ($volume->{reason})");
next;
} elsif ($self->{vm_was_running} && $volume_config->{iothread}) {
if (!PVE::QemuServer::Machine::runs_at_least_qemu_version($vmid, 4, 0, 1)) {
die "disk '$ds' '$volid' (iothread=on) can't use backup feature with running QEMU " .
die "disk '$name' '$volid' (iothread=on) can't use backup feature with running QEMU " .
"version < 4.0.1! Either set backup=no for this drive or upgrade QEMU and restart VM\n";
}
} elsif ($ds =~ m/^efidisk/ && (!defined($conf->{bios}) || $conf->{bios} ne 'ovmf')) {
$self->loginfo("excluding '$ds' (efidisks can only be backed up when BIOS is set to 'ovmf')");
return;
} else {
my $log = "include disk '$ds' '$volid'";
if (defined $drive->{size}) {
my $readable_size = PVE::JSONSchema::format_size($drive->{size});
my $log = "include disk '$name' '$volid'";
if (defined(my $size = $volume_config->{size})) {
my $readable_size = PVE::JSONSchema::format_size($size);
$log .= " $readable_size";
}
}
$self->loginfo($log);
}
my ($storeid, $volname) = PVE::Storage::parse_volume_id($volid, 1);
push @$vollist, $volid if $storeid;
$drivehash->{$ds} = $drive;
});
$drivehash->{$name} = $volume->{volume_config};
}
PVE::Storage::activate_volumes($self->{storecfg}, $vollist);