This function is intened to be used after doing a migration where some of the volume IDs changed.
Signed-off-by: Fabian Ebner <f.eb...@proxmox.com> --- PVE/AbstractConfig.pm | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/PVE/AbstractConfig.pm b/PVE/AbstractConfig.pm index f2e130c..dc788c2 100644 --- a/PVE/AbstractConfig.pm +++ b/PVE/AbstractConfig.pm @@ -457,6 +457,36 @@ sub foreach_volume { $class->foreach_unused_volume($conf, $func, @param) if $opts->{include_unused}; } +# $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, $conf) = @_; + + my $old_volid = $volume->{$volid_key}; + if (my $new_volid = $volume_map->{$old_volid}) { + $volume->{$volid_key} = $new_volid; + $conf->{$key} = $class->print_volume($key, $volume); + } + }; + + my $opts = { + 'include_unused' => 1, + 'extra_keys' => ['vmstate'], + }; + + $class->foreach_volume($conf, $opts, $do_replace, $conf); + foreach my $snap (keys %{$conf->{snapshots}}) { + my $snap_conf = $conf->{snapshots}->{$snap}; + $class->foreach_volume($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 _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel