use the pvecm mtunnel command to get remote migration ip

Ask the pvecm mtunnel command (was earlier in qm) if the remote side
has an IP configured in a given migration_network denoted by a CIDR.

If such a IP is available reset the nodeip and rem_ssh variables
and check if we can connect to the other side with ssh public key
authentication.

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
This commit is contained in:
Thomas Lamprecht 2016-10-31 09:42:32 +01:00 committed by Dietmar Maurer
parent 77b2b96ffc
commit 35f8fae2c8

View File

@ -82,6 +82,28 @@ sub cmd_logerr {
return &$run_command_quiet_full($self, $cmd, 1, %param);
}
sub get_remote_migration_ip {
my ($self) = @_;
my $ip;
my $cmd = [@{$self->{rem_ssh}}, 'pvecm', 'mtunnel', '--get_migration_ip'];
push @$cmd, '--migration_network', $self->{opts}->{migration_network}
if defined($self->{opts}->{migration_network});
PVE::Tools::run_command($cmd, outfunc => sub {
my $line = shift;
# use non-restrictive regex for ip, its already checked by the remote side
if ($line =~ m/^ip: '(\S+)'$/) {
$ip = $1;
}
});
return $ip;
}
my $eval_int = sub {
my ($self, $func, @param) = @_;
@ -146,6 +168,26 @@ sub migrate {
&$eval_int($self, sub { $self->{running} = $self->prepare($self->{vmid}); });
die $@ if $@;
# get dedicated migration address from remote node, if set.
# as a side effect this checks also if the other node can be accessed
# through ssh and that it has quorum
my $remote_migration_ip = $self->get_remote_migration_ip();
if (defined($remote_migration_ip)) {
$nodeip = $remote_migration_ip;
$self->{nodeip} = $remote_migration_ip;
$self->{rem_ssh} = [ @ssh_cmd, "root\@$nodeip" ];
$self->log('info', "use dedicated network address for sending " .
"migration traffic ($self->{nodeip})");
# test if we can connect to new IP
my $cmd = [ @{$self->{rem_ssh}}, '/bin/true' ];
eval { $self->cmd_quiet($cmd); };
die "Can't connect to destination address ($self->{nodeip}) using " .
"public key authentication\n" if $@;
}
&$eval_int($self, sub { $self->phase1($self->{vmid}); });
my $err = $@;
if ($err) {