]> git.proxmox.com Git - pve-storage.git/commitdiff
fix #1611: implement import of base-images for LVM-thin Storage
authorHannes Duerr <h.duerr@proxmox.com>
Tue, 19 Dec 2023 14:03:06 +0000 (15:03 +0100)
committerFabian Grünbichler <f.gruenbichler@proxmox.com>
Thu, 18 Apr 2024 13:05:59 +0000 (15:05 +0200)
for base images we call the volume_import of the parent plugin and pass
it as vm-image instead of base-image, then convert it back as base-image

Signed-off-by: Hannes Duerr <h.duerr@proxmox.com>
src/PVE/Storage/LvmThinPlugin.pm

index 1d2e37c571389a5faa34933a8bd41723f1c76a16..96f619bf84f8bcd8b1911faf8a4750d45355f57b 100644 (file)
@@ -383,6 +383,56 @@ sub volume_has_feature {
     return undef;
 }
 
+sub volume_import {
+    my ($class, $scfg, $storeid, $fh, $volname, $format, $snapshot, $base_snapshot, $with_snapshots, $allow_rename) = @_;
+
+    my ($vtype, $name, $vmid, $basename, $basevmid, $isBase, $file_format) =
+       $class->parse_volname($volname);
+
+    if (!$isBase) {
+       return $class->SUPER::volume_import(
+           $scfg,
+           $storeid,
+           $fh,
+           $volname,
+           $format,
+           $snapshot,
+           $base_snapshot,
+           $with_snapshots,
+           $allow_rename
+       );
+    } else {
+       my $tempname;
+       my $vg = $scfg->{vgname};
+       my $lvs = PVE::Storage::LVMPlugin::lvm_list_volumes($vg);
+       if ($lvs->{$vg}->{$volname}) {
+           die "volume $vg/$volname already exists\n" if !$allow_rename;
+           warn "volume $vg/$volname already exists - importing with a different name\n";
+
+           $tempname = $class->find_free_diskname($storeid, $scfg, $vmid);
+       } else {
+           $tempname = $volname;
+           $tempname =~ s/base/vm/;
+       }
+
+       ($storeid,my $newname) = PVE::Storage::parse_volume_id($class->SUPER::volume_import(
+           $scfg,
+           $storeid,
+           $fh,
+           $tempname,
+           $format,
+           $snapshot,
+           $base_snapshot,
+           $with_snapshots,
+           $allow_rename
+       ));
+
+       $volname = $class->create_base($storeid, $scfg, $newname);
+    }
+
+    return "$storeid:$volname";
+}
+
 # used in LVMPlugin->volume_import
 sub volume_import_write {
     my ($class, $input_fh, $output_file) = @_;