]> git.proxmox.com Git - pve-storage.git/commitdiff
zfs: move and refactor code
authorWolfgang Link <w.link@proxmox.com>
Fri, 23 Jan 2015 09:32:45 +0000 (10:32 +0100)
committerDietmar Maurer <dietmar@proxmox.com>
Fri, 23 Jan 2015 11:57:38 +0000 (12:57 +0100)
copy and modify create_base and refactor clone_image

Signed-off-by: Wolfgang Link <w.link@proxmox.com>
PVE/Storage/ZFSDirPlugin.pm
PVE/Storage/ZFSPlugin.pm

index cac6a72cc59c8ca68f76c0b04e77561a701cb614..9138d2fb240e35fc5287e74a54e79af25070d672 100644 (file)
@@ -429,6 +429,49 @@ sub deactivate_volume {
     return 1;
 }
 
+sub clone_image {
+    my ($class, $scfg, $storeid, $volname, $vmid, $snap) = @_;
+
+    $snap ||= '__base__';
+
+    my ($vtype, $basename, $basevmid, undef, undef, $isBase) =
+        $class->parse_volname($volname);
+
+    die "clone_image only works on base images\n" if !$isBase;
+
+    my $name = $class->zfs_find_free_diskname($storeid, $scfg, $vmid);
+
+    warn "clone $volname: $basename to $name\n";
+
+    $class->zfs_request($scfg, undef, 'clone', "$scfg->{pool}/$basename\@$snap", "$scfg->{pool}/$name");
+
+    return $name;
+}
+
+sub create_base {
+    my ($class, $storeid, $scfg, $volname) = @_;
+
+    my $snap = '__base__';
+
+    my ($vtype, $name, $vmid, $basename, $basevmid, $isBase) =
+        $class->parse_volname($volname);
+
+    die "create_base not possible with base image\n" if $isBase;
+
+    my $newname = $name;
+    $newname =~ s/^vm-/base-/;
+
+    my $newvolname = $basename ? "$basename/$newname" : "$newname";
+
+    $class->zfs_request($scfg, undef, 'rename', "$scfg->{pool}/$name", "$scfg->{pool}/$newname");
+
+    my $running  = undef; #fixme : is create_base always offline ?
+
+    $class->volume_snapshot($scfg, $storeid, $newname, $snap, $running);
+
+    return $newvolname;
+}
+
 sub volume_has_feature {
     my ($class, $scfg, $feature, $storeid, $volname, $snapname, $running) = @_;
 
index 22d8ccaa2ae9ba137c2a122c018ebbc58f591172..fab68cb79c9ef2dbb44d3ebac3586b2118523372 100644 (file)
@@ -254,18 +254,7 @@ sub create_base {
 sub clone_image {
     my ($class, $scfg, $storeid, $volname, $vmid, $snap) = @_;
 
-    $snap ||= '__base__';
-
-    my ($vtype, $basename, $basevmid, undef, undef, $isBase) =
-        $class->parse_volname($volname);
-
-    die "clone_image only works on base images\n" if !$isBase;
-
-    my $name = $class->zfs_find_free_diskname($storeid, $scfg, $vmid);
-
-    warn "clone $volname: $basename to $name\n";
-
-    $class->zfs_request($scfg, undef, 'clone', "$scfg->{pool}/$basename\@$snap", "$scfg->{pool}/$name");
+    my $name  = $class->SUPER::clone_image($scfg, $storeid, $volname, $vmid, $snap);
 
     my $guid = $class->zfs_create_lu($scfg, $name);
     $class->zfs_add_lun_mapping_entry($scfg, $name, $guid);