From d390328bfd1bd34b91fc8c1b26cdc7648122874a Mon Sep 17 00:00:00 2001 From: Wolfgang Bumiller Date: Fri, 12 May 2017 11:56:10 +0200 Subject: [PATCH] api: add import/export format querying --- PVE/Storage.pm | 31 +++++++++++++++++++++++++++++++ PVE/Storage/Plugin.pm | 10 ++++++++++ PVE/Storage/ZFSPoolPlugin.pm | 16 ++++++++++++++++ 3 files changed, 57 insertions(+) diff --git a/PVE/Storage.pm b/PVE/Storage.pm index 501494a..26215f1 100755 --- a/PVE/Storage.pm +++ b/PVE/Storage.pm @@ -1485,6 +1485,37 @@ sub volume_import { $base_snapshot, $with_snapshots); } +sub volume_export_formats { + my ($cfg, $volid, $snapshot, $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_export_formats($scfg, $storeid, $volname, + $base_snapshot, $with_snapshots); +} + +sub volume_import_formats { + my ($cfg, $volid, $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, + $base_snapshot, $with_snapshots); +} + +sub volume_transfer_formats { + my ($cfg, $src_volid, $dst_volid, $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_hash = map { $_ => 1 } @import_formats; + my @common = grep { $import_hash{$_} } @export_formats; + return @common; +} + # bash completion helper sub complete_storage { diff --git a/PVE/Storage/Plugin.pm b/PVE/Storage/Plugin.pm index b7ec261..4df6608 100644 --- a/PVE/Storage/Plugin.pm +++ b/PVE/Storage/Plugin.pm @@ -894,10 +894,20 @@ sub volume_export { die "volume export not implemented for $class"; } +sub volume_export_formats { + my ($class, $scfg, $storeid, $volname, $snapshot, $base_snapshot, $with_snapshots) = @_; + die "volume export formats not implemented for $class"; +} + # Import data from a stream, creating a new or replacing or adding to an existing volume. sub volume_import { my ($class, $scfg, $storeid, $fh, $volname, $format, $base_snapshot, $with_snapshots) = @_; die "volume import not implemented for $class"; } +sub volume_import_formats { + my ($class, $scfg, $storeid, $volname, $base_snapshot, $with_snapshots) = @_; + die "volume import formats not implemented for $class"; +} + 1; diff --git a/PVE/Storage/ZFSPoolPlugin.pm b/PVE/Storage/ZFSPoolPlugin.pm index 72da44d..bc9da23 100644 --- a/PVE/Storage/ZFSPoolPlugin.pm +++ b/PVE/Storage/ZFSPoolPlugin.pm @@ -681,6 +681,16 @@ sub volume_export { return; } +sub volume_export_formats { + my ($class, $scfg, $storeid, $volname, $snapshot, $base_snapshot, $with_snapshots) = @_; + + my @formats = ('zfs'); + # TODOs: + # push @formats, 'fies' if $volname !~ /^(?:basevol|subvol)-/; + # push @formats, 'raw' if !$base_snapshot && !$with_snapshots; + return @formats; +} + sub volume_import { my ($class, $scfg, $storeid, $fh, $volname, $format, $base_snapshot, $with_snapshots) = @_; @@ -714,4 +724,10 @@ sub volume_import { return; } +sub volume_import_formats { + my ($class, $scfg, $storeid, $volname, $base_snapshot, $with_snapshots) = @_; + + return $class->volume_export_formats($scfg, $storeid, $volname, undef, $base_snapshot, $with_snapshots); +} + 1;