Signed-off-by: Alexandre Derumier <[email protected]>
---
 PVE/API2/Qemu.pm |  103 +++++++++++++++++++++++++++++-------------------------
 1 file changed, 55 insertions(+), 48 deletions(-)

diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm
index 61282d5..4c5feb8 100644
--- a/PVE/API2/Qemu.pm
+++ b/PVE/API2/Qemu.pm
@@ -171,6 +171,59 @@ my $create_disks = sub {
     return $vollist;
 };
 
+my $clone_disks = sub {
+    my ($storecfg, $storage, $vollist, $newvollist, $drives, $snapname, 
$format, $vmid, $newid, $newconf, $running) = @_;
+
+    PVE::Storage::activate_volumes($storecfg, $vollist);
+
+    foreach my $opt (keys %$drives) {
+       my $drive = $drives->{$opt};
+
+       my $newvolid;
+       if (!$drive->{full}) {
+           print "create linked clone of drive $opt ($drive->{file})\n";
+           $newvolid = PVE::Storage::vdisk_clone($storecfg,  $drive->{file}, 
$newid);
+           push @$newvollist, $newvolid;
+
+       } else {
+           my ($storeid, $volname) = 
PVE::Storage::parse_volume_id($drive->{file});
+           $storeid = $storage if $storage;
+
+           my $fmt = undef;
+           if($format){
+               $fmt = $format;
+           }else{
+               my $defformat = PVE::Storage::storage_default_format($storecfg, 
$storeid);
+               $fmt = $drive->{format} || $defformat;
+           }
+
+           my ($size) = PVE::Storage::volume_size_info($storecfg, 
$drive->{file}, 3);
+
+           print "create full clone of drive $opt ($drive->{file})\n";
+           $newvolid = PVE::Storage::vdisk_alloc($storecfg, $storeid, $newid, 
$fmt, undef, ($size/1024));
+           push @$newvollist, $newvolid;
+
+           if(!$running || $snapname){
+               PVE::QemuServer::qemu_img_convert($drive->{file}, $newvolid, 
$size, $snapname);
+           }else{
+               PVE::QemuServer::qemu_drive_mirror($vmid, $opt, $newvolid, 
$newid);
+           }
+       }
+
+       my ($size) = PVE::Storage::volume_size_info($storecfg, $newvolid, 3);
+       my $disk = $drive;
+       $disk->{full} = undef;
+       $disk->{format} = undef;
+       $disk->{file} = $newvolid;
+       $disk->{size} = $size;
+
+       $newconf->{$opt} = PVE::QemuServer::print_drive($vmid, $disk);
+
+       PVE::QemuServer::update_config_nolock($newid, $newconf, 1);
+    }
+
+};
+
 my $check_vm_modify_config_perm = sub {
     my ($rpcenv, $authuser, $vmid, $pool, $key_list) = @_;
 
@@ -2001,6 +2054,7 @@ __PACKAGE__->register_method({
            PVE::Tools::file_set_contents($conffile, "# qmclone temporary 
file\nlock: clone\n");
 
            my $realcmd = sub {
+
                my $upid = shift;
 
                my $newvollist = [];
@@ -2008,54 +2062,7 @@ __PACKAGE__->register_method({
                eval {
                    local $SIG{INT} = $SIG{TERM} = $SIG{QUIT} = $SIG{HUP} = sub 
{ die "interrupted by signal\n"; };
 
-                   PVE::Storage::activate_volumes($storecfg, $vollist);
-
-                   foreach my $opt (keys %$drives) {
-                       my $drive = $drives->{$opt};
-
-                       my $newvolid;
-                       if (!$drive->{full}) {
-                           print "create linked clone of drive $opt 
($drive->{file})\n";
-                           $newvolid = PVE::Storage::vdisk_clone($storecfg,  
$drive->{file}, $newid);
-                           push @$newvollist, $newvolid;
-
-                       } else {
-                           my ($storeid, $volname) = 
PVE::Storage::parse_volume_id($drive->{file});
-                           $storeid = $storage if $storage;
-
-                           my $fmt = undef;
-                           if($format){
-                               $fmt = $format;
-                           }else{
-                               my $defformat = 
PVE::Storage::storage_default_format($storecfg, $storeid);
-                               $fmt = $drive->{format} || $defformat;
-                           }
-
-                           my ($size) = 
PVE::Storage::volume_size_info($storecfg, $drive->{file}, 3);
-
-                           print "create full clone of drive $opt 
($drive->{file})\n";
-                           $newvolid = PVE::Storage::vdisk_alloc($storecfg, 
$storeid, $newid, $fmt, undef, ($size/1024));
-                           push @$newvollist, $newvolid;
-
-                           if(!$running || $snapname){
-                               
PVE::QemuServer::qemu_img_convert($drive->{file}, $newvolid, $size, $snapname);
-                           }else{
-                               PVE::QemuServer::qemu_drive_mirror($vmid, $opt, 
$newvolid, $newid);
-                           }
-
-                       }
-
-                       my ($size) = PVE::Storage::volume_size_info($storecfg, 
$newvolid, 3);
-                       my $disk = $drive;
-                       $disk->{full} = undef;
-                       $disk->{format} = undef;
-                       $disk->{file} = $newvolid;
-                       $disk->{size} = $size;
-
-                       $newconf->{$opt} = PVE::QemuServer::print_drive($vmid, 
$disk);
-
-                       PVE::QemuServer::update_config_nolock($newid, $newconf, 
1);
-                   }
+                   &$clone_disks($storecfg, $storage, $vollist, $newvollist, 
$drives, $snapname, $format, $vmid, $newid, $newconf, $running);
 
                    delete $newconf->{lock};
                    PVE::QemuServer::update_config_nolock($newid, $newconf, 1);
-- 
1.7.10.4

_______________________________________________
pve-devel mailing list
[email protected]
http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to