[pve-devel] [RFC storage 7/16] volume_import_formats: if no volume name is specified, return all formats the storage supports
Fabian Ebner
f.ebner at proxmox.com
Wed Jan 29 14:30:05 CET 2020
Like this it is possible to determine if the transfer of a volume is possible wihout already
having the name of the volume on the target storage. When doing the import, 'volume_import'
can then choose a new name automatically.
Signed-off-by: Fabian Ebner <f.ebner at proxmox.com>
---
For example, migration with a disk on an LVM storage with --targetstorage
to a filesystem-based storage should work with this.
For volume_export_formats a similar change could be made, e.g.
allow 'raw+size' as an export format for a qcow2 disk. When actually
exporting 'qemu-img convert' is used and it doesn't like when the output
is piped away, so
pvesm export myfs:103/vm-103-disk-1.qcow2 raw+size - -with-snapshots 0 | pvesm import myfs:103/vm-103-disk-1.raw raw+size - -with-snapshots 0
fails with:
qemu-img: /dev/stdout: error while converting raw: Could not resize file: Invalid argument
command 'qemu-img convert -f qcow2 -O raw /mnt/myfs/images/103/vm-103-disk-1.qcow2 /dev/stdout' failed: exit code 1
Not making such a change and preserving the original format of the volume
on export when determining a common transfer format is probably best.
PVE/Storage.pm | 10 ++++------
PVE/Storage/Plugin.pm | 18 ++++++++++++------
2 files changed, 16 insertions(+), 12 deletions(-)
diff --git a/PVE/Storage.pm b/PVE/Storage.pm
index 7d18b11..d708c03 100755
--- a/PVE/Storage.pm
+++ b/PVE/Storage.pm
@@ -589,7 +589,7 @@ sub storage_migrate {
}
}
- my @formats = volume_transfer_formats($cfg, $volid, $target_volid, $snapshot, $base_snapshot, $with_snapshots);
+ my @formats = volume_transfer_formats($cfg, $volid, $target_storeid, $target_volname, $snapshot, $base_snapshot, $with_snapshots);
die "cannot migrate from storage type '$scfg->{type}' to '$tcfg->{type}'\n" if !@formats;
my $format = $formats[0];
@@ -1441,10 +1441,8 @@ sub volume_export_formats {
}
sub volume_import_formats {
- my ($cfg, $volid, $base_snapshot, $with_snapshots) = @_;
+ my ($cfg, $storeid, $volname, $base_snapshot, $with_snapshots) = @_;
- my ($storeid, $volname) = parse_volume_id($volid, 1);
- return if !$storeid;
my $scfg = storage_config($cfg, $storeid);
my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
return $plugin->volume_import_formats($scfg, $storeid, $volname,
@@ -1452,9 +1450,9 @@ sub volume_import_formats {
}
sub volume_transfer_formats {
- my ($cfg, $src_volid, $dst_volid, $snapshot, $base_snapshot, $with_snapshots) = @_;
+ my ($cfg, $src_volid, $dst_storeid, $dst_volname, $snapshot, $base_snapshot, $with_snapshots) = @_;
my @export_formats = volume_export_formats($cfg, $src_volid, $snapshot, $base_snapshot, $with_snapshots);
- my @import_formats = volume_import_formats($cfg, $dst_volid, $base_snapshot, $with_snapshots);
+ my @import_formats = volume_import_formats($cfg, $dst_storeid, $dst_volname, $base_snapshot, $with_snapshots);
my %import_hash = map { $_ => 1 } @import_formats;
my @common = grep { $import_hash{$_} } @export_formats;
return @common;
diff --git a/PVE/Storage/Plugin.pm b/PVE/Storage/Plugin.pm
index 4e0ae8f..7d654ca 100644
--- a/PVE/Storage/Plugin.pm
+++ b/PVE/Storage/Plugin.pm
@@ -1245,13 +1245,19 @@ sub volume_import {
sub volume_import_formats {
my ($class, $scfg, $storeid, $volname, $base_snapshot, $with_snapshots) = @_;
if ($scfg->{path} && !defined($base_snapshot)) {
- my $format = ($class->parse_volname($volname))[6];
- if ($with_snapshots) {
- return ($format.'+size') if ($format eq 'qcow2' || $format eq 'vmdk');
- return ();
+ if (defined($volname)) {
+ my $format = ($class->parse_volname($volname))[6];
+ if ($with_snapshots) {
+ return ($format.'+size') if ($format eq 'qcow2' || $format eq 'vmdk');
+ return ();
+ }
+ return ('tar+size') if $format eq 'subvol';
+ return ('raw+size');
+ } else {
+ my @formats = ('qcow2+size', 'vmdk+size');
+ push @formats, 'tar+size', 'raw+size' if !$with_snapshots;
+ return @formats;
}
- return ('tar+size') if $format eq 'subvol';
- return ('raw+size');
}
return ();
}
--
2.20.1
More information about the pve-devel
mailing list