minor nit but the whole storage side LGTM

On Mon, Jul 21, 2025 at 02:10:47PM +0200, Fiona Ebner wrote:
> The LVM plugin can only use qcow2 format when the
> 'snapshot-as-volume-chain' configuration option is set. The format
> information is currently only recorded statically in the plugin data.
> This causes issues, for example, restoring a guest volume that uses
> qcow2 as a format hint on an LVM storage without the option set will
> fail, because the plugin data indicates that qcow2 is supported.
> Introduce a dedicated method, so that plugins can indicate what
> actually is supported according to the storage configuration.
> 
> The implementation for LVM is done in a separate commit.
> 
> Remove the now unused default_format() function from Plugin.pm.
> 
> Signed-off-by: Fiona Ebner <f.eb...@proxmox.com>
> ---
>  ApiChangeLog              |  8 ++++++
>  src/PVE/Storage.pm        | 19 +++++++------
>  src/PVE/Storage/Plugin.pm | 59 ++++++++++++++++++++++++++-------------
>  3 files changed, 59 insertions(+), 27 deletions(-)
> 
> diff --git a/ApiChangeLog b/ApiChangeLog
> index 0984afb..d80bfb3 100644
> --- a/ApiChangeLog
> +++ b/ApiChangeLog
> @@ -49,6 +49,14 @@ Future changes should be documented in here.
>        NOTE: Storages must support using "current" as a special name in 
> `rename_snapshot()` to
>        cheaply convert a snapshot into the current disk state and back.
>  
> +* Introduce `get_formats()` plugin method
> +
> +  Get information about the supported formats and default format according 
> to the current storage
> +  configuration. The default implemenation is backwards-compatible with 
> previous behavior and looks
> +  at the definition given in the plugin data, as well as the `format` 
> storage configuration option,
> +  which can override the default format. Must be implemented when the 
> supported formats or default
> +  format depend on the storage configuration.
> +
>  ##  Version 11:
>  
>  * Allow declaring storage features via plugin data
> diff --git a/src/PVE/Storage.pm b/src/PVE/Storage.pm
> index 6ca9f88..1faf893 100755
> --- a/src/PVE/Storage.pm
> +++ b/src/PVE/Storage.pm
> @@ -857,10 +857,11 @@ my $volname_for_storage = sub {
>  
>      my $scfg = storage_config($cfg, $storeid);
>  
> -    my (undef, $valid_formats) = PVE::Storage::Plugin::default_format($scfg);
> -    my $format_is_valid = grep { $_ eq $format } @$valid_formats;
> +    my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
> +
> +    my $formats = $plugin->get_formats($scfg, $storeid);
>      die "unsupported format '$format' for storage type $scfg->{type}\n"
> -        if !$format_is_valid;
> +        if !$formats->{valid}->{$format};
>  
>      (my $name_without_extension = $name) =~ s/\.$format$//;
>  
> @@ -1184,14 +1185,12 @@ sub vdisk_alloc {
>  
>      $vmid = parse_vmid($vmid);
>  
> -    my $defformat = PVE::Storage::Plugin::default_format($scfg);
> +    my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
>  
> -    $fmt = $defformat if !$fmt;
> +    $fmt = $plugin->get_formats($scfg, $storeid)->{default} if !$fmt;
>  
>      activate_storage($cfg, $storeid);
>  
> -    my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
> -
>      # lock shared storage
>      return $plugin->cluster_lock_storage(
>          $storeid,
> @@ -1673,8 +1672,12 @@ sub storage_default_format {
>      my ($cfg, $storeid) = @_;
>  
>      my $scfg = storage_config($cfg, $storeid);
> +    my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
>  
> -    return PVE::Storage::Plugin::default_format($scfg);
> +    my $formats = $plugin->get_formats($scfg, $storeid);
> +
> +    return
> +        wantarray ? ($formats->{default}, [sort keys $formats->{valid}->%*]) 
> : $formats->{default};
>  }
>  
>  sub vgroup_is_used {
> diff --git a/src/PVE/Storage/Plugin.pm b/src/PVE/Storage/Plugin.pm
> index ef04cb1..c3c1b63 100644
> --- a/src/PVE/Storage/Plugin.pm
> +++ b/src/PVE/Storage/Plugin.pm
> @@ -287,23 +287,6 @@ sub storage_has_feature {
>      return;
>  }
>  
> -sub default_format {
> -    my ($scfg) = @_;
> -
> -    my $type = $scfg->{type};
> -    my $def = $defaultData->{plugindata}->{$type};
> -
> -    my $def_format = 'raw';
> -    my $valid_formats = [$def_format];
> -
> -    if (defined($def->{format})) {
> -        $def_format = $scfg->{format} || $def->{format}->[1];
> -        $valid_formats = [sort keys %{ $def->{format}->[0] }];
> -    }
> -
> -    return wantarray ? ($def_format, $valid_formats) : $def_format;
> -}
> -
>  PVE::JSONSchema::register_format('pve-storage-path', \&verify_path);
>  
>  sub verify_path {
> @@ -640,6 +623,44 @@ sub preallocation_cmd_opt {
>  
>  # Storage implementation
>  
> +=pod
> +

↑ can be dropped

> +=head3 get_formats
> +
> +    my $formats = $plugin->get_formats($scfg);

↑ misses the `$storeid` parameter

> +    my $default_format = $formats->{default};
> +    my $is_valid = $formats->{valid}->{$format} ? 1 : 0;

↑ could just use !! instead of `? 1 : 0`

> +
> +Get information about the supported formats and default format according to 
> the current storage
> +configuration C<$scfg>. The return value is a hash reference with C<default> 
> mapping to the default
> +format and C<valid> mapping to a hash reference, where each supported format 
> is present as a key
> +mapping to C<1>. For example:
> +
> +    {
> +        default => 'raw',
> +        valid => {
> +            'qcow2 => 1,
> +            'raw' => 1,
> +        },
> +    }
> +
> +=cut
> +
> +sub get_formats {
> +    my ($class, $scfg, $storeid) = @_;
> +
> +    my $type = $scfg->{type};
> +    my $plugin_data = $defaultData->{plugindata}->{$type};
> +
> +    return { default => 'raw', valid => { raw => 1 } } if 
> !defined($plugin_data->{format});
> +
> +    return {
> +        default => $scfg->{format} || $plugin_data->{format}->[1],
> +        # copy rather than passing direct reference
> +        valid => { $plugin_data->{format}->[0]->%* },
> +    };
> +}
> +
>  # called during addition of storage (before the new storage config got 
> written)
>  # die to abort addition if there are (grave) problems
>  # NOTE: runs in a storage config *locked* context
> @@ -1526,8 +1547,8 @@ sub list_images {
>  
>      my $imagedir = $class->get_subdir($scfg, 'images');
>  
> -    my ($defFmt, $vaidFmts) = default_format($scfg);
> -    my $fmts = join('|', @$vaidFmts);
> +    my $format_info = $class->get_formats($scfg, $storeid);
> +    my $fmts = join('|', sort keys $format_info->{valid}->%*);
>  
>      my $res = [];
>  
> -- 
> 2.47.2


_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to