[pve-devel] [PATCH v4 guest-common 16/27] Add update_volume_ids

Fabian Ebner f.ebner at proxmox.com
Thu Mar 26 09:09:46 CET 2020


This function is intened to be used after doing a migration where some
of the volume IDs changed.

Signed-off-by: Fabian Ebner <f.ebner at proxmox.com>
---
 PVE/AbstractConfig.pm | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/PVE/AbstractConfig.pm b/PVE/AbstractConfig.pm
index 88522f8..beb10c7 100644
--- a/PVE/AbstractConfig.pm
+++ b/PVE/AbstractConfig.pm
@@ -466,6 +466,36 @@ sub foreach_volume {
     return $class->foreach_volume_full($conf, undef, $func, @param);
 }
 
+# $volume_map is a hash of 'old_volid' => 'new_volid' pairs.
+# This method replaces 'old_volid' by 'new_volid' throughout
+# the config including snapshots and unused and vmstate volumes
+sub update_volume_ids {
+    my ($class, $conf, $volume_map) = @_;
+
+    my $volid_key = $class->volid_key();
+
+    my $do_replace = sub {
+	my ($key, $volume, $current_section) = @_;
+
+	my $old_volid = $volume->{$volid_key};
+	if (my $new_volid = $volume_map->{$old_volid}) {
+	    $volume->{$volid_key} = $new_volid;
+	    $current_section->{$key} = $class->print_volume($key, $volume);
+	}
+    };
+
+    my $opts = {
+	'include_unused' => 1,
+	'extra_keys' => ['vmstate'],
+    };
+
+    $class->foreach_volume_full($conf, $opts, $do_replace, $conf);
+    foreach my $snap (keys %{$conf->{snapshots}}) {
+	my $snap_conf = $conf->{snapshots}->{$snap};
+	$class->foreach_volume_full($snap_conf, $opts, $do_replace, $snap_conf);
+    }
+}
+
 # Returns whether the template parameter is set in $conf.
 sub is_template {
     my ($class, $conf) = @_;
-- 
2.20.1





More information about the pve-devel mailing list