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

Fabian Ebner f.ebner at proxmox.com
Tue Feb 25 14:08:31 CET 2020


On 2/25/20 12:34 PM, Fabian Grünbichler wrote:
> 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?)
> 

I only focused on the plugins which can alloc_image, but it's true that 
such a general method should handle all cases.

> 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 ;)

I'm aware of this and described scenarios in the commit message of #28,
but it's true that re-parsing could be done in volname_for_storage 
directly and not give the burden to check and a possibly invalid volname 
to the callers.

Would a general print_volname be very useful? Otherwise this "guessing a 
valid ID" could also be done in (a helper for) storage_migrate without 
any API changes.

>> +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
>>
>>
> 
> _______________________________________________
> 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