node => get_standard_option('pve-node'),
vmid => get_standard_option('pve-vmid'),
skiplock => get_standard_option('skiplock'),
+ migratedfrom => get_standard_option('pve-node',{ optional => 1 }),
timeout => {
description => "Wait maximal timeout seconds.",
type => 'integer',
raise_param_exc({ keepActive => "Only root may use this option." })
if $keepActive && $authuser ne 'root@pam';
+ my $migratedfrom = extract_param($param, 'migratedfrom');
+ raise_param_exc({ migratedfrom => "Only root may use this option." })
+ if $migratedfrom && $authuser ne 'root@pam';
+
+
my $storecfg = PVE::Storage::config();
if (&$vm_is_ha_managed($vmid) && $rpcenv->{type} ne 'ha') {
syslog('info', "stop VM $vmid: $upid\n");
PVE::QemuServer::vm_stop($storecfg, $vmid, $skiplock, 0,
- $param->{timeout}, 0, 1, $keepActive);
+ $param->{timeout}, 0, 1, $keepActive, $migratedfrom);
return;
};
sub phase2_cleanup {
my ($self, $vmid, $err) = @_;
+ return if !$self->{errors};
+ $self->{phase2errors} = 1;
+
$self->log('info', "aborting phase 2 - cleanup resources");
my $conf = $self->{vmconf};
$self->log('err', $err);
}
- ## fixme : vm_stop_cleanup on target vm
-
-
+ # cleanup ressources on target host
+ my $nodename = PVE::INotify::nodename();
+
+ my $cmd = [@{$self->{rem_ssh}}, 'qm', 'stop', $vmid, '--skiplock', '--migratedfrom', $nodename];
+ eval{ PVE::Tools::run_command($cmd, outfunc => sub {}, errfunc => sub {}) };
+ if (my $err = $@) {
+ $self->log('err', $err);
+ $self->{errors} = 1;
+ }
}
sub phase3 {
my ($self, $vmid) = @_;
my $volids = $self->{volumes};
+ return if $self->{phase2errors};
# destroy local copies
foreach my $volid (@$volids) {
my ($self, $vmid, $err) = @_;
my $conf = $self->{vmconf};
+ return if $self->{phase2errors};
# move config to remote node
my $conffile = PVE::QemuServer::config_file($vmid);
# We need that when migration VMs to other nodes (files already moved)
# Note: we set $keepActive in vzdump stop mode - volumes need to stay active
sub vm_stop {
- my ($storecfg, $vmid, $skiplock, $nocheck, $timeout, $shutdown, $force, $keepActive) = @_;
+ my ($storecfg, $vmid, $skiplock, $nocheck, $timeout, $shutdown, $force, $keepActive, $migratedfrom) = @_;
$force = 1 if !defined($force) && !$shutdown;
+ if ($migratedfrom){
+ my $pid = check_running($vmid, $nocheck, $migratedfrom);
+ kill 15, $pid if $pid;
+ my $conf = load_config($vmid, $migratedfrom);
+ vm_stop_cleanup($storecfg, $vmid, $conf, $keepActive);
+ return;
+ }
+
lock_config($vmid, sub {
my $pid = check_running($vmid, $nocheck);