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.laute...@proxmox.com>
---

v3->v4: changed function call for `foreach_drive` to QemuServer::Drive

This can be changed to `foreach_volume` once the patches by Fabian Ebner
are through.

 PVE/QemuConfig.pm        | 31 +++++++++++++++++++++++++++++++
 PVE/VZDump/QemuServer.pm | 38 +++++++++++++++++++-------------------
 2 files changed, 50 insertions(+), 19 deletions(-)

diff --git a/PVE/QemuConfig.pm b/PVE/QemuConfig.pm
index 6322089..0ab7dff 100644
--- a/PVE/QemuConfig.pm
+++ b/PVE/QemuConfig.pm
@@ -160,6 +160,37 @@ sub get_replicatable_volumes {
     return $volhash;
 }
 
+sub get_backup_volumes {
+    my ($class, $conf) = @_;
+
+    my $ret_volumes = [];
+
+    my $test_volume = sub {
+       my ($key, $drive) = @_;
+
+       return if PVE::QemuServer::drive_is_cdrom($drive);
+
+       my $volume = {};
+       my $included = $drive->{backup} // 1;;
+       my $reason = defined($drive->{backup}) ? 'disabled' : 'enabled';
+
+       if ($key =~ m/^efidisk/ && (!defined($conf->{bios}) || $conf->{bios} ne 
'ovmf')) {
+           $included = 0;
+           $reason = "efidisk with non omvf bios";
+       }
+       $volume->{key} = $key;
+       $volume->{included} = $included;
+       $volume->{reason} = $reason;
+       $volume->{data} = $drive;
+
+       push @$ret_volumes, $volume;
+    };
+
+    PVE::QemuServer::Drive::foreach_drive($conf, $test_volume);
+
+    return $ret_volumes;
+}
+
 sub __snapshot_save_vmstate {
     my ($class, $vmid, $conf, $snapname, $storecfg, $statestorage, $suspend) = 
@_;
 
diff --git a/PVE/VZDump/QemuServer.pm b/PVE/VZDump/QemuServer.pm
index 35a5d21..ecb0db6 100644
--- a/PVE/VZDump/QemuServer.pm
+++ b/PVE/VZDump/QemuServer.pm
@@ -68,37 +68,37 @@ sub prepare {
 
     my $vollist = [];
     my $drivehash = {};
-    PVE::QemuServer::foreach_drive($conf, sub {
-       my ($ds, $drive) = @_;
+    my $backup_included = PVE::QemuConfig->get_backup_volumes($conf);
 
-       return if PVE::QemuServer::drive_is_cdrom($drive);
+    foreach my $volume(@{$backup_included}) {
+       my $volid = $volume->{data}->{file};
+       my $name = $volume->{key};
 
-       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}) {
+           if ($volume->{reason} eq 'efidisk with non omvf bios') {
+               $self->loginfo("excluding '$name' (efidisks can only be backed 
up when BIOS is set to 'ovmf')");
+               next;
+           }
+           $self->loginfo("exclude disk '$name' '$volid' (backup=no)");
+           next;
+       } elsif ($self->{vm_was_running} && $volume->{data}->{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 $volume->{data}->{size}) {
+               my $readable_size = 
PVE::JSONSchema::format_size($volume->{data}->{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->{data};
+    }
 
     PVE::Storage::activate_volumes($self->{storecfg}, $vollist);
 
-- 
2.20.1


_______________________________________________
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to