With the option valid_target_formats it's possible to let the caller specify possible formats for the target of an operation. [0]: If the option is not set, assume that every format is valid.
In most cases the format of the the target and the format of the source will agree (and therefore assumption [0] is not actually assuming very much and ensures backwards compatability). But when cloning a volume on a storage using Plugin.pm's implementation (e.g. directory based storages), the result is always a qcow2 image. When cloning containers, the new option can be used to detect that qcow2 is not valid and hence the clone feature is not available. Signed-off-by: Fabian Ebner <f.eb...@proxmox.com> --- Changes from v2: * Use new options parameter instead of adding more dependency to PVE::Cluster * storage API bump and now there is an inter-package dependency: #2 container depends on #1 storage PVE/Storage.pm | 8 ++++---- PVE/Storage/Plugin.pm | 7 ++++++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/PVE/Storage.pm b/PVE/Storage.pm index a46550c..fcfc6af 100755 --- a/PVE/Storage.pm +++ b/PVE/Storage.pm @@ -39,11 +39,11 @@ use PVE::Storage::DRBDPlugin; use PVE::Storage::PBSPlugin; # Storage API version. Icrement it on changes in storage API interface. -use constant APIVER => 3; +use constant APIVER => 4; # Age is the number of versions we're backward compatible with. # This is like having 'current=APIVER' and age='APIAGE' in libtool, # see https://www.gnu.org/software/libtool/manual/html_node/Libtool-versioning.html -use constant APIAGE => 2; +use constant APIAGE => 3; # load standard plugins PVE::Storage::DirPlugin->register(); @@ -286,13 +286,13 @@ sub volume_snapshot_delete { } sub volume_has_feature { - my ($cfg, $feature, $volid, $snap, $running) = @_; + my ($cfg, $feature, $volid, $snap, $running, $opts) = @_; my ($storeid, $volname) = parse_volume_id($volid, 1); if ($storeid) { my $scfg = storage_config($cfg, $storeid); my $plugin = PVE::Storage::Plugin->lookup($scfg->{type}); - return $plugin->volume_has_feature($scfg, $feature, $storeid, $volname, $snap, $running); + return $plugin->volume_has_feature($scfg, $feature, $storeid, $volname, $snap, $running, $opts); } elsif ($volid =~ m|^(/.+)$| && -e $volid) { return undef; } else { diff --git a/PVE/Storage/Plugin.pm b/PVE/Storage/Plugin.pm index 2232261..8c0dae1 100644 --- a/PVE/Storage/Plugin.pm +++ b/PVE/Storage/Plugin.pm @@ -828,7 +828,7 @@ sub storage_can_replicate { } sub volume_has_feature { - my ($class, $scfg, $feature, $storeid, $volname, $snapname, $running) = @_; + my ($class, $scfg, $feature, $storeid, $volname, $snapname, $running, $opts) = @_; my $features = { snapshot => { current => { qcow2 => 1}, snap => { qcow2 => 1} }, @@ -841,6 +841,11 @@ sub volume_has_feature { current => {qcow2 => 1, raw => 1, vmdk => 1} }, }; + # clone_image creates a qcow2 volume + return 0 if $feature eq 'clone' && + defined($opts->{valid_target_formats}) && + !(grep { $_ eq 'qcow2' } @{$opts->{valid_target_formats}}); + my ($vtype, $name, $vmid, $basename, $basevmid, $isBase, $format) = $class->parse_volname($volname); -- 2.20.1 _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel