[pve-devel] [RFC storage 5/16] storage_migrate: return volume ID of migrated volume

Fabian Ebner f.ebner at proxmox.com
Wed Jan 29 14:30:03 CET 2020


Since 'pvesm import' uses a new volume ID if the requested one is already
present, callers should have a way to get the new volume ID.

Signed-off-by: Fabian Ebner <f.ebner at proxmox.com>
---
 PVE/CLI/pvesm.pm |  2 +-
 PVE/Storage.pm   | 41 +++++++++++++++++++++++++++++++++--------
 2 files changed, 34 insertions(+), 9 deletions(-)

diff --git a/PVE/CLI/pvesm.pm b/PVE/CLI/pvesm.pm
index 7d8547b..74294b4 100755
--- a/PVE/CLI/pvesm.pm
+++ b/PVE/CLI/pvesm.pm
@@ -779,7 +779,7 @@ our $cmddef = {
     export => [ __PACKAGE__, 'export', ['volume', 'format', 'filename']],
     import => [ __PACKAGE__, 'import', ['volume', 'format', 'filename'], {}, sub  {
 	my $volid = shift;
-	print "successfully imported '$volid'\n";
+	print PVE::Storage::volume_imported_message($volid);
     }],
 };
 
diff --git a/PVE/Storage.pm b/PVE/Storage.pm
index 2b292f6..57d723d 100755
--- a/PVE/Storage.pm
+++ b/PVE/Storage.pm
@@ -615,6 +615,21 @@ sub storage_migrate {
 	push @$recv, '-base', $base_snapshot;
     }
 
+    my $new_volid;
+    my $match_volid_and_log = sub {
+	my $line = shift;
+	my $pattern = volume_imported_message(undef, 1);
+
+	if ($line =~ m!$pattern!) {
+	    $new_volid = $1;
+	}
+
+	if ($logfunc) {
+	    chomp($line);
+	    $logfunc->($line);
+	}
+    };
+
     volume_snapshot($cfg, $volid, $snapshot) if $migration_snapshot;
     eval {
 	if ($insecure) {
@@ -632,13 +647,8 @@ sub storage_migrate {
 	    shutdown($socket, 1);
 
 	    # wait for the remote process to finish
-	    if ($logfunc) {
-		while (my $line = <$info>) {
-		    chomp($line);
-		    $logfunc->("[$target_sshinfo->{name}] $line");
-		}
-	    } else {
-		1 while <$info>;
+	    while (my $line = <$info>) {
+		$match_volid_and_log->("[$target_sshinfo->{name}] $line");
 	    }
 
 	    # now close the socket
@@ -648,8 +658,11 @@ sub storage_migrate {
 		die "import failed: exit code ".($?>>8)."\n";
 	    }
 	} else {
-	    run_command([$send, @cstream, $recv], logfunc => $logfunc);
+	    run_command([$send, @cstream, $recv], logfunc => $match_volid_and_log);
 	}
+
+	die "unable to get ID of the migrated volume\n"
+	    if !defined($new_volid);
     };
     my $err = $@;
     warn "send/receive failed, cleaning up snapshot(s)..\n" if $err;
@@ -658,6 +671,8 @@ sub storage_migrate {
 	warn "could not remove source snapshot: $@\n" if $@;
     }
     die $err if $err;
+
+    return $new_volid;
 }
 
 sub vdisk_clone {
@@ -1447,6 +1462,16 @@ sub volume_transfer_formats {
     return @common;
 }
 
+sub volume_imported_message {
+    my ($volid, $want_pattern) = @_;
+
+    if ($want_pattern) {
+	return "^successfully imported '([^']*)'\$";
+    } else {
+	return "successfully imported '$volid'\n";
+    }
+}
+
 # bash completion helper
 
 sub complete_storage {
-- 
2.20.1





More information about the pve-devel mailing list