exposing the two halves of a storage migration for usage across cluster boundaries.
Signed-off-by: Fabian Grünbichler <f.gruenbich...@proxmox.com> --- Notes: new in v3 PVE/Storage.pm | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/PVE/Storage.pm b/PVE/Storage.pm index 976bd63..f0c62aa 100755 --- a/PVE/Storage.pm +++ b/PVE/Storage.pm @@ -1833,6 +1833,72 @@ sub volume_imported_message { } } +# $format and $volname are requests and might be overruled depending on $opts +# $opts: +# - with-snapshots: passed to `pvesm import` and used to select import format +# - allow-rename: passed to `pvesm import` +# - export-formats: used to select common transport format +# - unix: unix socket path +sub volume_import_start { + my ($cfg, $storeid, $volname, $format, $vmid, $opts) = @_; + + my $with_snapshots = $opts->{'with-snapshots'} ? 1 : 0; + + $volname = $volname_for_storage->($cfg, $storeid, $volname, $vmid, $format); + + my $volid = "$storeid:$volname"; + + if (!defined($opts->{snapshot})) { + $opts->{migration_snapshot} = storage_migrate_snapshot($cfg, $storeid); + $opts->{snapshot} = '__migration__' if $opts->{migration_snapshot}; + } + + # find common import/export format, like volume_transfer_formats + my @import_formats = PVE::Storage::volume_import_formats($cfg, $volid, $opts->{migration_snapshot}, undef, $opts->{with_snapshots}); + my @export_formats = PVE::Tools::split_list($opts->{'export-formats'}); + my %import_hash = map { $_ => 1 } @import_formats; + my @common = grep { $import_hash{$_} } @export_formats; + die "no matching import/export format found for storage '$storeid'\n" + if !@common; + $format = $common[0]; + + my $input = IO::File->new(); + my $info = IO::File->new(); + + my $unix = $opts->{unix} // "/run/pve/storage-migrate-$vmid.$$.unix"; + my $import = $volume_import_prepare->($volid, $format, "unix://$unix", APIVER, $opts); + + unlink $unix; + my $cpid = open3($input, $info, $info, @$import) + or die "failed to spawn disk-import child - $!\n"; + + my $ready; + eval { + PVE::Tools::run_with_timeout(5, sub { $ready = <$info>; }); + }; + + die "failed to read readyness from disk import child: $@\n" if $@; + + print "$ready\n"; + + return { + fh => $info, + pid => $cpid, + socket => $unix, + format => $format, + }; +} + +sub volume_export_start { + my ($cfg, $volid, $format, $opts) = @_; + + my $run_command_params = delete $opts->{cmd} // {}; + + my @cmds = $volume_export_prepare->($cfg, $volid, $format, undef, $opts); + + PVE::Tools::run_command(@cmds, %$run_command_params); +} + # bash completion helper sub complete_storage { -- 2.30.2 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel