Signed-off-by: Alexandre Derumier <aderum...@odiso.com> --- PVE/QemuMigrate.pm | 122 ++++++++++++++++++++++++--------------------- 1 file changed, 66 insertions(+), 56 deletions(-)
diff --git a/PVE/QemuMigrate.pm b/PVE/QemuMigrate.pm index dca1077..6460480 100644 --- a/PVE/QemuMigrate.pm +++ b/PVE/QemuMigrate.pm @@ -546,69 +546,16 @@ sub phase1_cleanup { sub phase2 { my ($self, $vmid) = @_; + my $nodename = PVE::INotify::nodename(); + my $conf = $self->{vmconf}; $self->log('info', "starting VM $vmid on remote node '$self->{node}'"); - my $raddr; - my $rport; - my $ruri; # the whole migration dst. URI (protocol:address[:port]) - my $nodename = PVE::INotify::nodename(); - - my $spice_ticket; - if (PVE::QemuServer::vga_conf_has_spice($conf->{vga})) { - my $res = mon_cmd($vmid, 'query-spice'); - $spice_ticket = $res->{ticket}; - } - my $migration_type = $self->{opts}->{migration_type}; my $cmd = generate_migrate_start_cmd($self, $vmid, $nodename, $migration_type); - my $spice_port; - - # Note: We try to keep $spice_ticket secret (do not pass via command line parameter) - # instead we pipe it through STDIN - my $exitcode = PVE::Tools::run_command($cmd, input => $spice_ticket, outfunc => sub { - my $line = shift; - - if ($line =~ m/^migration listens on tcp:(localhost|[\d\.]+|\[[\d\.:a-fA-F]+\]):(\d+)$/) { - $raddr = $1; - $rport = int($2); - $ruri = "tcp:$raddr:$rport"; - } - elsif ($line =~ m!^migration listens on unix:(/run/qemu-server/(\d+)\.migrate)$!) { - $raddr = $1; - die "Destination UNIX sockets VMID does not match source VMID" if $vmid ne $2; - $ruri = "unix:$raddr"; - } - elsif ($line =~ m/^migration listens on port (\d+)$/) { - $raddr = "localhost"; - $rport = int($1); - $ruri = "tcp:$raddr:$rport"; - } - elsif ($line =~ m/^spice listens on port (\d+)$/) { - $spice_port = int($1); - } - elsif ($line =~ m/^storage migration listens on nbd:(localhost|[\d\.]+|\[[\d\.:a-fA-F]+\]):(\d+):exportname=(\S+) volume:(\S+)$/) { - my $drivestr = $4; - my $nbd_uri = "nbd:$1:$2:exportname=$3"; - my $targetdrive = $3; - $targetdrive =~ s/drive-//g; - - $self->{target_drive}->{$targetdrive}->{drivestr} = $drivestr; - $self->{target_drive}->{$targetdrive}->{nbd_uri} = $nbd_uri; - - } elsif ($line =~ m/^QEMU: (.*)$/) { - $self->log('info', "[$self->{node}] $1\n"); - } - }, errfunc => sub { - my $line = shift; - $self->log('info', "[$self->{node}] $line"); - }, noerr => 1); - - die "remote command failed with exit code $exitcode\n" if $exitcode; - - die "unable to detect remote migration address\n" if !$raddr; + my ($raddr, $rport, $ruri, $spice_port, $spice_ticket) = find_remote_ports($self, $vmid, $cmd); $self->log('info', "start remote tunnel"); @@ -1105,4 +1052,67 @@ sub generate_migrate_start_cmd { return $cmd; } +sub find_remote_ports { + my ($self, $vmid, $cmd) = @_; + + my $conf = $self->{vmconf}; + + my $spice_ticket; + if (PVE::QemuServer::vga_conf_has_spice($conf->{vga})) { + my $res = mon_cmd($vmid, 'query-spice'); + $spice_ticket = $res->{ticket}; + } + + my $spice_port; + my $raddr; + my $rport; + my $ruri; # the whole migration dst. URI (protocol:address[:port]) + + # Note: We try to keep $spice_ticket secret (do not pass via command line parameter) + # instead we pipe it through STDIN + my $exitcode = PVE::Tools::run_command($cmd, input => $spice_ticket, outfunc => sub { + my $line = shift; + + if ($line =~ m/^migration listens on tcp:(localhost|[\d\.]+|\[[\d\.:a-fA-F]+\]):(\d+)$/) { + $raddr = $1; + $rport = int($2); + $ruri = "tcp:$raddr:$rport"; + } + elsif ($line =~ m!^migration listens on unix:(/run/qemu-server/(\d+)\.migrate)$!) { + $raddr = $1; + die "Destination UNIX sockets VMID does not match source VMID" if $vmid ne $2; + $ruri = "unix:$raddr"; + } + elsif ($line =~ m/^migration listens on port (\d+)$/) { + $raddr = "localhost"; + $rport = int($1); + $ruri = "tcp:$raddr:$rport"; + } + elsif ($line =~ m/^spice listens on port (\d+)$/) { + $spice_port = int($1); + } + elsif ($line =~ m/^storage migration listens on nbd:(localhost|[\d\.]+|\[[\d\.:a-fA-F]+\]):(\d+):exportname=(\S+) volume:(\S+)$/) { + my $drivestr = $4; + my $nbd_uri = "nbd:$1:$2:exportname=$3"; + my $targetdrive = $3; + $targetdrive =~ s/drive-//g; + + $self->{target_drive}->{$targetdrive}->{drivestr} = $drivestr; + $self->{target_drive}->{$targetdrive}->{nbd_uri} = $nbd_uri; + + } elsif ($line =~ m/^QEMU: (.*)$/) { + $self->log('info', "[$self->{node}] $1\n"); + } + }, errfunc => sub { + my $line = shift; + $self->log('info', "[$self->{node}] $line"); + }, noerr => 1); + + die "remote command failed with exit code $exitcode\n" if $exitcode; + + die "unable to detect remote migration address\n" if !$raddr; + + return ($raddr, $rport, $ruri, $spice_port, $spice_ticket); +} + 1; -- 2.20.1 _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel