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>
---

v6 -> v7: incorporate suggestions, mainly
* change key `data` to `volume_config` in return hash from
  get_backup_volumes()
* use `reason` strings as generated, avoid transforming them, reason
  strings have been adapted a bit to be easier to understand
* create $size only when actually needed

v5 -> v6: create hash with volume data directly in push call instead of
adding a new variable beforehand

v4->v5:
* use new foreach_volume call
* change $ret_volumes to $return_volumes
* use dedicated variables in PVE::VZDump::QemuServer where hash is used
  more than once
* renamed $backup_included and other variables to (IMHO) better names

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

 PVE/QemuConfig.pm        | 32 ++++++++++++++++++++++++++++++++
 PVE/VZDump/QemuServer.pm | 35 ++++++++++++++++-------------------
 2 files changed, 48 insertions(+), 19 deletions(-)

diff --git a/PVE/QemuConfig.pm b/PVE/QemuConfig.pm
index 240fc06..7f350b1 100644
--- a/PVE/QemuConfig.pm
+++ b/PVE/QemuConfig.pm
@@ -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) = 
@_;
 
diff --git a/PVE/VZDump/QemuServer.pm b/PVE/VZDump/QemuServer.pm
index 91df455..7174112 100644
--- a/PVE/VZDump/QemuServer.pm
+++ b/PVE/VZDump/QemuServer.pm
@@ -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);
 
-- 
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