]> git.proxmox.com Git - qemu-server.git/commitdiff
improve snapshot delete - add force option to API
authorDietmar Maurer <dietmar@proxmox.com>
Wed, 12 Sep 2012 05:19:38 +0000 (07:19 +0200)
committerDietmar Maurer <dietmar@proxmox.com>
Wed, 12 Sep 2012 05:19:38 +0000 (07:19 +0200)
PVE/API2/Qemu.pm
PVE/QemuServer.pm

index 047b1063420a607f97751016e2c1b1cc0b4cb65a..ba54461d2bde21f68277e748df91048d67337225 100644 (file)
@@ -1925,6 +1925,7 @@ __PACKAGE__->register_method({
                description => $d->{description} || '',
            };
            $item->{parent} = $d->{parent} if $d->{parent};
+           $item->{snapstate} = $d->{snapstate} if $d->{snapstate};
            push @$res, $item;
        }
 
@@ -2185,6 +2186,11 @@ __PACKAGE__->register_method({
            node => get_standard_option('pve-node'),
            vmid => get_standard_option('pve-vmid'),
            snapname => get_standard_option('pve-snapshot-name'),
+           force => {
+               optional => 1,
+               type => 'boolean',
+               description => "For removal from config file, even if removing disk snapshots fails.",
+           },
        },
     },
     returns => {
@@ -2206,7 +2212,7 @@ __PACKAGE__->register_method({
 
        my $realcmd = sub {
            PVE::Cluster::log_msg('info', $authuser, "delete snapshot VM $vmid: $snapname");
-           PVE::QemuServer::snapshot_delete($vmid, $snapname);
+           PVE::QemuServer::snapshot_delete($vmid, $snapname, $param->{force});
        };
 
        return $rpcenv->fork_worker('qmdelsnapshot', $vmid, $authuser, $realcmd);
index c51bc6188e38a06f209dae85f822490e41fe9599..e542ed94229801d9efd2a15d494f6ac872fcf75b 100644 (file)
@@ -3755,6 +3755,8 @@ sub snapshot_create {
 
     my $snap = &$snapshot_prepare($vmid, $snapname, $comment);
 
+    my $drivehash = {};
+
     eval {
        # create internal snapshots of all drives
        
@@ -3773,6 +3775,7 @@ sub snapshot_create {
            my $device = "drive-$ds";
 
            qemu_volume_snapshot($vmid, $device, $storecfg, $volid, $snapname);
+           $drivehash->{$ds} = 1;
        });
     };
     my $err = $@;
@@ -3785,7 +3788,7 @@ sub snapshot_create {
 
     if ($err) {
        warn "snapshot create failed: starting cleanup\n";
-       eval { snapshot_delete($vmid, $snapname, 1); };
+       eval { snapshot_delete($vmid, $snapname, 0, $drivehash); };
        warn $@ if $@;
        die $err;
     }
@@ -3793,8 +3796,9 @@ sub snapshot_create {
     &$snapshot_commit($vmid, $snapname);
 }
 
+# Note: $drivehash is only set when called from snapshot_create.
 sub snapshot_delete {
-    my ($vmid, $snapname, $force) = @_;
+    my ($vmid, $snapname, $force, $drivehash) = @_;
 
     my $prepare = 1;
 
@@ -3805,7 +3809,7 @@ sub snapshot_delete {
 
        my $conf = load_config($vmid);
 
-       check_lock($conf) if !$force;
+       check_lock($conf) if !$drivehash;
 
        $snap = $conf->{snapshots}->{$snapname};
 
@@ -3829,6 +3833,7 @@ sub snapshot_delete {
        } else {
            delete $conf->{parent} if $conf->{parent} && $conf->{parent} eq $snapname;
            delete $conf->{snapshots}->{$snapname};
+           delete $conf->{lock} if $drivehash;
            foreach my $volid (@$unused) {
                add_unused_volume($conf, $volid);
            }
@@ -3847,10 +3852,16 @@ sub snapshot_delete {
        my ($ds, $drive) = @_;
 
        return if drive_is_cdrom($drive);
+       return if $drivehash && !$drivehash->{$ds};
+
        my $volid = $drive->{file};
        my $device = "drive-$ds";
 
-       qemu_volume_snapshot_delete($vmid, $device, $storecfg, $volid, $snapname);
+       eval { qemu_volume_snapshot_delete($vmid, $device, $storecfg, $volid, $snapname); };
+       if (my $err = $@) {
+           die $err if !$force;
+           warn $err;
+       }
        push @$unused, $volid;
     });