storage: add volume_support_qemu_snapshot

Returns if the volume is supporting qemu snapshot:
 'internal' : do the snapshot with qemu internal snapshot
 'external' : do the snapshot with qemu external snapshot
  undef     : does not support qemu snapshot

Signed-off-by: Alexandre Derumier <alexandre.derumier@groupe-cyllene.com>
This commit is contained in:
Alexandre Derumier
2025-07-09 18:21:58 +02:00
committed by Wolfgang Bumiller
parent 5f916079ea
commit a8d8bdf9ef
6 changed files with 66 additions and 0 deletions

View File

@ -29,6 +29,14 @@ Future changes should be documented in here.
* Introduce rename_snapshot() plugin method * Introduce rename_snapshot() plugin method
This method allow to rename a vm disk snapshot name to a different snapshot name. This method allow to rename a vm disk snapshot name to a different snapshot name.
* Introduce volume_support_qemu_snapshot() plugin method
This method is used to known if the a snapshot need to be done by qemu
or by the storage api.
returned values are :
'internal' : support snapshot with qemu internal snapshot
'external' : support snapshot with qemu external snapshot
undef : don't support qemu snapshot
## Version 11: ## Version 11:
* Allow declaring storage features via plugin data * Allow declaring storage features via plugin data

View File

@ -2370,6 +2370,21 @@ sub rename_snapshot {
); );
} }
sub volume_support_qemu_snapshot {
my ($cfg, $volid) = @_;
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_support_qemu_snapshot($storeid, $scfg, $volname);
}
return undef;
}
# Various io-heavy operations require io/bandwidth limits which can be # Various io-heavy operations require io/bandwidth limits which can be
# configured on multiple levels: The global defaults in datacenter.cfg, and # configured on multiple levels: The global defaults in datacenter.cfg, and
# per-storage overrides. When we want to do a restore from storage A to storage # per-storage overrides. When we want to do a restore from storage A to storage

View File

@ -314,4 +314,14 @@ sub get_import_metadata {
}; };
} }
sub volume_support_qemu_snapshot {
my ($class, $storeid, $scfg, $volname) = @_;
my $format = ($class->parse_volname($volname))[6];
return if $format ne 'qcow2';
my $type = $scfg->{'external-snapshots'} ? 'external' : 'internal';
return $type;
}
1; 1;

View File

@ -872,4 +872,11 @@ sub rename_snapshot {
die "rename_snapshot is not implemented for $class"; die "rename_snapshot is not implemented for $class";
} }
sub volume_support_qemu_snapshot {
my ($class, $storeid, $scfg, $volname) = @_;
my $format = ($class->parse_volname($volname))[6];
return 'external' if $format eq 'qcow2';
}
1; 1;

View File

@ -2262,6 +2262,26 @@ sub new_backup_provider {
die "implement me if enabling the feature 'backup-provider' in plugindata()->{features}\n"; die "implement me if enabling the feature 'backup-provider' in plugindata()->{features}\n";
} }
=pod
=head3 volume_support_qemu_snapshot
$blockdev = $plugin->volume_support_qemu_snapshot($storeid, $scfg, $volname)
Returns a string with the type of snapshot that qemu can do for a specific volume
'internal' : support snapshot with qemu internal snapshot
'external' : support snapshot with qemu external snapshot
undef : don't support qemu snapshot
=cut
sub volume_support_qemu_snapshot {
my ($class, $storeid, $scfg, $volname) = @_;
my $format = ($class->parse_volname($volname))[6];
return 'internal' if $format eq 'qcow2';
}
sub config_aware_base_mkdir { sub config_aware_base_mkdir {
my ($class, $scfg, $path) = @_; my ($class, $scfg, $path) = @_;

View File

@ -1063,4 +1063,10 @@ sub rename_snapshot {
die "rename_snapshot is not implemented for $class"; die "rename_snapshot is not implemented for $class";
} }
sub volume_support_qemu_snapshot {
my ($class, $storeid, $scfg, $volname) = @_;
return 'internal' if !$scfg->{krbd};
}
1; 1;