use PVE::Storage;
use PVE::JSONSchema qw(get_standard_option);
use PVE::RESTHandler;
+use PVE::ReplicationConfig;
+use PVE::GuestHelpers;
use PVE::QemuConfig;
use PVE::QemuServer;
use PVE::QemuMigrate;
foreach my $opt (@delete) {
$modified->{$opt} = 1;
$conf = PVE::QemuConfig->load_config($vmid); # update/reload
- if (!defined($conf->{$opt})) {
+ if (!defined($conf->{$opt}) && !defined($conf->{pending}->{$opt})) {
warn "cannot delete '$opt' - not set in current configuration!\n";
$modified->{$opt} = 0;
next;
if defined($conf->{pending}->{$opt});
&$create_disks($rpcenv, $authuser, $conf->{pending}, $storecfg, $vmid, undef, {$opt => $param->{$opt}});
- } elsif ($opt eq "replicate") {
- # check if all volumes have replicate feature
- PVE::QemuConfig->get_replicatable_volumes($storecfg, $conf);
- my $repl = PVE::JSONSchema::check_format('pve-replicate', $param->{opt});
- PVE::Cluster::check_node_exists($repl->{target});
- $conf->{$opt} = $param->{$opt};
} else {
$conf->{pending}->{$opt} = $param->{$opt};
}
die "unable to remove VM $vmid - used in HA resources\n"
if PVE::HA::Config::vm_is_ha_managed($vmid);
+ # do not allow destroy if there are replication jobs
+ my $repl_conf = PVE::ReplicationConfig->new();
+ $repl_conf->check_for_existing_jobs($vmid);
+
# early tests (repeat after locking)
die "VM $vmid is running - destroy failed\n"
if PVE::QemuServer::check_running($vmid);
$newconf->{$opt} = $value; # simply copy configuration
} else {
if ($param->{full}) {
- die "Full clone feature is not available"
+ die "Full clone feature is not supported for drive '$opt'\n"
if !PVE::Storage::volume_has_feature($storecfg, 'copy', $drive->{file}, $snapname, $running);
$fullclone->{$opt} = 1;
} else {
# not full means clone instead of copy
- die "Linked clone feature is not available"
+ die "Linked clone feature is not supported for drive '$opt'\n"
if !PVE::Storage::volume_has_feature($storecfg, 'clone', $drive->{file}, $snapname, $running);
}
$drives->{$opt} = $drive;
} else {
- my $realcmd = sub {
- my $upid = shift;
+ my $code = sub {
+ my $realcmd = sub {
+ my $upid = shift;
+
+ PVE::QemuMigrate->migrate($target, $targetip, $vmid, $param);
+ };
- PVE::QemuMigrate->migrate($target, $targetip, $vmid, $param);
+ return $rpcenv->fork_worker('qmigrate', $vmid, $authuser, $realcmd);
};
- return $rpcenv->fork_worker('qmigrate', $vmid, $authuser, $realcmd);
+ return PVE::GuestHelpers::guest_migration_lock($vmid, 10, $code);
}
}});