description => $d->{description} || '',
};
$item->{parent} = $d->{parent} if $d->{parent};
+ $item->{snapstate} = $d->{snapstate} if $d->{snapstate};
push @$res, $item;
}
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 => {
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);
my $snap = &$snapshot_prepare($vmid, $snapname, $comment);
+ my $drivehash = {};
+
eval {
# create internal snapshots of all drives
my $device = "drive-$ds";
qemu_volume_snapshot($vmid, $device, $storecfg, $volid, $snapname);
+ $drivehash->{$ds} = 1;
});
};
my $err = $@;
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;
}
&$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;
my $conf = load_config($vmid);
- check_lock($conf) if !$force;
+ check_lock($conf) if !$drivehash;
$snap = $conf->{snapshots}->{$snapname};
} 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);
}
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;
});