replace volume_support_qemu_snapshot with volume_qemu_snapshot
This also changes the return values, since their meanings are rather weird from the storage point of view. For instance, "internal" meant it is *not* the storage which does the snapshot, while "external" meant a mixture of storage and qemu-server side actions. `undef` meant the storage does it all... ┌────────────┬───────────┐ │ previous │ new │ ├────────────┼───────────┤ │ "internal" │ "qemu" │ │ "external" │ "mixed" │ │ undef │ "storage" │ └────────────┴───────────┘ Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
This commit is contained in:
28
ApiChangeLog
28
ApiChangeLog
@ -25,13 +25,27 @@ 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
|
* Introduce volume_qemu_snapshot_method() plugin method
|
||||||
This method is used to known if the a snapshot need to be done by qemu
|
This method declares how snapshots should be handled for *running* VMs.
|
||||||
or by the storage api.
|
This should return one of the following:
|
||||||
returned values are :
|
'qemu':
|
||||||
'internal' : support snapshot with qemu internal snapshot
|
Qemu must perform the snapshot. The storage plugin does nothing.
|
||||||
'external' : support snapshot with qemu external snapshot
|
'storage':
|
||||||
undef : don't support qemu snapshot
|
The storage plugin *transparently* performs the snapshot and the running VM does not need to
|
||||||
|
do anything.
|
||||||
|
'mixed':
|
||||||
|
For taking a snapshot: The storage performs an offline snapshot and qemu then has to reopen
|
||||||
|
the volume.
|
||||||
|
For removing a snapshot: One of 2 things will happen (both must be supported):
|
||||||
|
a) Qemu will "unhook" the snapshot by moving its data into the child snapshot, and then call
|
||||||
|
`volume_snapshot_delete` with `running` set, in which case the storage should delete only
|
||||||
|
the snapshot without touching the surrounding snapshots.
|
||||||
|
b) Qemu will "commit" the child snapshot to the one which is being removed, then call
|
||||||
|
`volume_snapshot_delete()` on the child snapshot, then call `rename_snapshot()` to move the
|
||||||
|
merged snapshot into place.
|
||||||
|
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.
|
||||||
|
|
||||||
|
|
||||||
## Version 11:
|
## Version 11:
|
||||||
|
|
||||||
|
|||||||
@ -2370,7 +2370,7 @@ sub rename_snapshot {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
sub volume_support_qemu_snapshot {
|
sub volume_qemu_snapshot_method {
|
||||||
my ($cfg, $volid) = @_;
|
my ($cfg, $volid) = @_;
|
||||||
|
|
||||||
my ($storeid, $volname) = parse_volume_id($volid, 1);
|
my ($storeid, $volname) = parse_volume_id($volid, 1);
|
||||||
@ -2380,7 +2380,7 @@ sub volume_support_qemu_snapshot {
|
|||||||
|
|
||||||
my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
|
my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
|
||||||
|
|
||||||
return $plugin->volume_support_qemu_snapshot($storeid, $scfg, $volname);
|
return $plugin->volume_qemu_snapshot_method($storeid, $scfg, $volname);
|
||||||
}
|
}
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -315,14 +315,13 @@ sub get_import_metadata {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
sub volume_support_qemu_snapshot {
|
sub volume_qemu_snapshot_method {
|
||||||
my ($class, $storeid, $scfg, $volname) = @_;
|
my ($class, $storeid, $scfg, $volname) = @_;
|
||||||
|
|
||||||
my $format = ($class->parse_volname($volname))[6];
|
my $format = ($class->parse_volname($volname))[6];
|
||||||
return if $format ne 'qcow2';
|
return 'storage' if $format ne 'qcow2';
|
||||||
|
|
||||||
my $type = $scfg->{'external-snapshots'} ? 'external' : 'internal';
|
return $scfg->{'external-snapshots'} ? 'mixed' : 'qemu';
|
||||||
return $type;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|||||||
@ -1301,11 +1301,12 @@ sub rename_snapshot {
|
|||||||
lvrename($scfg, $source_snap_volname, $target_snap_volname);
|
lvrename($scfg, $source_snap_volname, $target_snap_volname);
|
||||||
}
|
}
|
||||||
|
|
||||||
sub volume_support_qemu_snapshot {
|
sub volume_qemu_snapshot_method {
|
||||||
my ($class, $storeid, $scfg, $volname) = @_;
|
my ($class, $storeid, $scfg, $volname) = @_;
|
||||||
|
|
||||||
my $format = ($class->parse_volname($volname))[6];
|
my $format = ($class->parse_volname($volname))[6];
|
||||||
return 'external' if $format eq 'qcow2';
|
return 'mixed' if $format eq 'qcow2';
|
||||||
|
return 'storage';
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|||||||
@ -2428,9 +2428,9 @@ sub new_backup_provider {
|
|||||||
|
|
||||||
=pod
|
=pod
|
||||||
|
|
||||||
=head3 volume_support_qemu_snapshot
|
=head3 volume_qemu_snapshot_method
|
||||||
|
|
||||||
$blockdev = $plugin->volume_support_qemu_snapshot($storeid, $scfg, $volname)
|
$blockdev = $plugin->volume_qemu_snapshot_method($storeid, $scfg, $volname)
|
||||||
|
|
||||||
Returns a string with the type of snapshot that qemu can do for a specific volume
|
Returns a string with the type of snapshot that qemu can do for a specific volume
|
||||||
|
|
||||||
@ -2439,11 +2439,12 @@ Returns a string with the type of snapshot that qemu can do for a specific volum
|
|||||||
undef : don't support qemu snapshot
|
undef : don't support qemu snapshot
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
sub volume_support_qemu_snapshot {
|
sub volume_qemu_snapshot_method {
|
||||||
my ($class, $storeid, $scfg, $volname) = @_;
|
my ($class, $storeid, $scfg, $volname) = @_;
|
||||||
|
|
||||||
my $format = ($class->parse_volname($volname))[6];
|
my $format = ($class->parse_volname($volname))[6];
|
||||||
return 'internal' if $format eq 'qcow2';
|
return 'qemu' if $format eq 'qcow2';
|
||||||
|
return 'storage';
|
||||||
}
|
}
|
||||||
|
|
||||||
sub config_aware_base_mkdir {
|
sub config_aware_base_mkdir {
|
||||||
|
|||||||
@ -1063,10 +1063,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 {
|
sub volume_qemu_snapshot_method {
|
||||||
my ($class, $storeid, $scfg, $volname) = @_;
|
my ($class, $storeid, $scfg, $volname) = @_;
|
||||||
|
|
||||||
return 'internal' if !$scfg->{krbd};
|
return 'qemu' if !$scfg->{krbd};
|
||||||
|
return 'storage';
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|||||||
Reference in New Issue
Block a user