[pve-devel] [PATCH v2 storage 27/28] Add volname_for_storage and print_volname helper

Fabian Grünbichler f.gruenbichler at proxmox.com
Tue Feb 25 12:34:47 CET 2020


On February 24, 2020 1:44 pm, Fabian Ebner wrote:
> Allows to convert a volume ID from the source storage to
> a valid volume name for the target storage. The original name is
> preserved, except for a possible extension and it's also checked
> whether the format is valid for the target storage.
> Example: mylvm:vm-123-disk-4 <-> mydir:123/vm-123-disk-4.raw
> 
> Signed-off-by: Fabian Ebner <f.ebner at proxmox.com>
> ---
>  PVE/Storage.pm        | 17 +++++++++++++++--
>  PVE/Storage/Plugin.pm | 19 +++++++++++++++++++
>  2 files changed, 34 insertions(+), 2 deletions(-)
> 
> diff --git a/PVE/Storage.pm b/PVE/Storage.pm
> index 8969d2e..7a76b2c 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 => 4;
> +use constant APIVER => 5;
>  # 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 => 3;
> +use constant APIAGE => 4;
>  
>  # load standard plugins
>  PVE::Storage::DirPlugin->register();
> @@ -392,6 +392,19 @@ sub parse_volname {
>      return $plugin->parse_volname($volname);
>  }
>  
> +# returns a valid volume name for the specified target storage
> +# using an existing volume ID on the source storage
> +sub volname_for_storage {
> +    my ($cfg, $volid, $target_storeid) = @_;
> +
> +    my $target_scfg = storage_config($cfg, $target_storeid);
> +    my $target_plugin = PVE::Storage::Plugin->lookup($target_scfg->{type});
> +
> +    my ($vtype, $name, $vmid, $basename, $basevmid, $isBase, $format) = parse_volname($cfg, $volid);
> +
> +    return $target_plugin->print_volname($target_scfg, $vtype, $name, $vmid, $basename, $basevmid, $isBase, $format);
> +}
> +
>  sub parse_volume_id {
>      my ($volid, $noerr) = @_;
>  
> diff --git a/PVE/Storage/Plugin.pm b/PVE/Storage/Plugin.pm
> index 59660d9..6ce73bb 100644
> --- a/PVE/Storage/Plugin.pm
> +++ b/PVE/Storage/Plugin.pm
> @@ -445,6 +445,25 @@ sub parse_volname {
>      die "unable to parse directory volume name '$volname'\n";
>  }

a comment here that this is only used and tested for volname_for_storage 
usage might be a good idea (e.g., it's not working for base images, and 
I am not sure whether all the shared exotic storages like iSCSI do the 
right thing?)

also, this is technically not really sure to work for external plugins 
derived from PVE::Storage::Plugin.pm - they might override 
parse_volname, and now get a print_volname with a default 
implementation. we could double check this by re-parsing before 
returning, if the assumption that parse_volname(print_volname($cfg, @param)) 
should return @param again is true ;)

> +sub print_volname {
> +    my ($class, $scfg, $vtype, $name, $vmid, $basename, $basevmid, $isBase, $format) = @_;
> +
> +    die "print_volname is not implemented for type '$vtype'\n" if $vtype ne 'images' && $vtype ne 'rootdir';
> +    die "print_volname is not implemented for base images or linked clones\n" if defined($basename) || $isBase;
> +
> +    my (undef, $valid_formats) = default_format($scfg);
> +    my $format_is_valid = grep {$_ eq $format } @$valid_formats;
> +    die "print_volname: unsupported format '$format' for storage type $scfg->{type}\n" if !$format_is_valid;
> +
> +    (my $name_without_extension = $name) =~ s/\.$format$//;
> +
> +    if ($scfg->{path}) {
> +	return "$vmid/$name_without_extension.$format";
> +    } else {
> +	return "$name_without_extension";
> +    }
> +}
> +
>  my $vtype_subdirs = {
>      images => 'images',
>      rootdir => 'private',
> -- 
> 2.20.1
> 
> 
> _______________________________________________
> pve-devel mailing list
> pve-devel at pve.proxmox.com
> https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
> 
> 



More information about the pve-devel mailing list