Try connecting using SSH configuration before using IP addresses
Change-Id: I9b929cca126a45b323d28c8cdc20d4e3e8e80488
This commit is contained in:
parent
e19cd01377
commit
17fc43f3d5
|
@ -22,7 +22,6 @@ import netaddr
|
|||
from oslo_log import log
|
||||
|
||||
import tobiko
|
||||
from tobiko.shell import ssh
|
||||
|
||||
|
||||
LOG = log.getLogger(__name__)
|
||||
|
@ -87,9 +86,6 @@ def list_host_addresses(host: str,
|
|||
addresses.extend(resolv_host_addresses(host=host,
|
||||
port=port,
|
||||
ip_version=ip_version))
|
||||
if ssh_config:
|
||||
# get additional socket addresses from SSH configuration
|
||||
hosts.extend(list_ssh_hostconfig_hostnames(host))
|
||||
|
||||
if [host] != [str(address) for address in addresses]:
|
||||
LOG.debug(f"Host '{host}' addresses resolved as: {addresses}")
|
||||
|
@ -182,17 +178,3 @@ def resolv_host_addresses(host: str,
|
|||
LOG.debug(f"Host name '{host}' resolved to any IP address.")
|
||||
|
||||
return addresses
|
||||
|
||||
|
||||
def list_ssh_hostconfig_hostnames(host: str) -> typing.List[str]:
|
||||
hosts: typing.List[str] = [host]
|
||||
hostnames: typing.List[str] = []
|
||||
while hosts:
|
||||
hostname = ssh.ssh_host_config(hosts.pop()).hostname
|
||||
if (hostname is not None and
|
||||
host != hostname and
|
||||
hostname not in hostnames):
|
||||
LOG.debug(f"Found hostname '{hostname}' for '{host}' in SSH "
|
||||
"configuration")
|
||||
hostnames.append(hostname)
|
||||
return hostnames
|
||||
|
|
|
@ -156,6 +156,7 @@ class SSHConnectionManager(tobiko.SharedFixture):
|
|||
port = port or self.config.conf.port
|
||||
key_filename = key_filename or self.config.conf.key_file
|
||||
return ssh.ssh_client(host=str(address),
|
||||
port=port,
|
||||
username=username,
|
||||
key_filename=key_filename,
|
||||
**ssh_parameters)
|
||||
|
|
|
@ -427,19 +427,14 @@ class OpenStackTopology(tobiko.SharedFixture):
|
|||
if address:
|
||||
# add manually configure addresses first
|
||||
addresses.extend(self._list_addresses(address))
|
||||
if hostname:
|
||||
# detect more addresses from the hostname
|
||||
addresses.extend(self._list_addresses(hostname))
|
||||
addresses = tobiko.select(remove_duplications(addresses))
|
||||
|
||||
try:
|
||||
node = self.get_node(name=name, address=addresses)
|
||||
except _exception.NoSuchOpenStackTopologyNode:
|
||||
node = None
|
||||
|
||||
node = node or self._add_node(addresses=addresses,
|
||||
hostname=hostname,
|
||||
ssh_client=ssh_client)
|
||||
node = self._add_node(addresses=addresses,
|
||||
hostname=hostname,
|
||||
ssh_client=ssh_client)
|
||||
|
||||
if group:
|
||||
# Add group anyway even if the node hasn't been added
|
||||
|
@ -455,7 +450,8 @@ class OpenStackTopology(tobiko.SharedFixture):
|
|||
hostname: str = None,
|
||||
ssh_client: typing.Optional[ssh.SSHClientFixture] = None):
|
||||
if ssh_client is None:
|
||||
ssh_client = self._ssh_connect(addresses=addresses)
|
||||
ssh_client = self._ssh_connect(hostname=hostname,
|
||||
addresses=addresses)
|
||||
addresses.extend(self._list_addresses_from_host(ssh_client=ssh_client))
|
||||
addresses = tobiko.select(remove_duplications(addresses))
|
||||
hostname = hostname or sh.get_hostname(ssh_client=ssh_client)
|
||||
|
@ -476,8 +472,8 @@ class OpenStackTopology(tobiko.SharedFixture):
|
|||
for address in addresses:
|
||||
address_node = self._addresses.setdefault(address, node)
|
||||
if address_node is not node:
|
||||
LOG.error(f"Address '{address}' of node '{name}' is already "
|
||||
f"used by node '{address_node.name}'")
|
||||
LOG.warning(f"Address '{address}' of node '{name}' is already "
|
||||
f"used by node '{address_node.name}'")
|
||||
return node
|
||||
|
||||
def get_node(self,
|
||||
|
@ -552,11 +548,21 @@ class OpenStackTopology(tobiko.SharedFixture):
|
|||
def groups(self) -> typing.List[str]:
|
||||
return list(self._groups)
|
||||
|
||||
def _ssh_connect(self, addresses: typing.List[netaddr.IPAddress],
|
||||
def _ssh_connect(self,
|
||||
addresses: typing.List[netaddr.IPAddress],
|
||||
hostname: str = None,
|
||||
**connect_params) -> ssh.SSHClientFixture:
|
||||
if hostname is not None:
|
||||
try:
|
||||
return tobiko.setup_fixture(
|
||||
ssh.ssh_client(hostname, **connect_params))
|
||||
except Exception:
|
||||
LOG.debug(f'Unable to connect to {hostname} using regular '
|
||||
'SSH configuration')
|
||||
|
||||
try:
|
||||
return _connection.ssh_connect(addresses, **connect_params)
|
||||
return _connection.ssh_connect(addresses,
|
||||
**connect_params)
|
||||
except _connection.UreachableSSHServer:
|
||||
for proxy_node in self.nodes:
|
||||
proxy_client = proxy_node.ssh_client
|
||||
|
|
Loading…
Reference in New Issue