From fe38df6fce78ce26856ed148c803505f22bcc920 Mon Sep 17 00:00:00 2001 From: Kyrylo Shatskyy Date: Sun, 28 Oct 2018 18:56:14 +0100 Subject: [PATCH] Fix ipv4 and ipv6 address logging for Remote.run The Remote class does not respect ip addresses when it comes to define shortnames. As a result, the hostname is not shown correctly in the log. For ipv4 it only shows first number of the octet. For ipv6 it even does not allow to proceed, and raises exception in orchestra.run. Signed-off-by: Kyr Shatskyy --- teuthology/misc.py | 11 ++++++++++- teuthology/orchestra/remote.py | 11 +++++------ teuthology/orchestra/run.py | 4 ++-- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/teuthology/misc.py b/teuthology/misc.py index a01677a57f..9f9e059212 100644 --- a/teuthology/misc.py +++ b/teuthology/misc.py @@ -21,6 +21,8 @@ import json import re import pprint +from netaddr.strategy.ipv4 import valid_str as _is_ipv4 +from netaddr.strategy.ipv6 import valid_str as _is_ipv6 from teuthology import safepath from teuthology.exceptions import (CommandCrashedError, CommandFailedError, ConnectionLostError) @@ -39,11 +41,18 @@ is_arm = lambda x: x.startswith('tala') or x.startswith( hostname_expr_templ = '(?P.*@)?(?P.*)\.{lab_domain}' +def host_shortname(hostname): + if _is_ipv4(hostname) or _is_ipv6(hostname): + return hostname + else: + return hostname.split('.', 1)[0] def canonicalize_hostname(hostname, user='ubuntu'): hostname_expr = hostname_expr_templ.format( lab_domain=config.lab_domain.replace('.', '\.')) match = re.match(hostname_expr, hostname) + if _is_ipv4(hostname) or _is_ipv6(hostname): + return "%s@%s" % (user, hostname) if match: match_d = match.groupdict() shortname = match_d['shortname'] @@ -52,7 +61,7 @@ def canonicalize_hostname(hostname, user='ubuntu'): else: user_ = match_d.get('user') or user else: - shortname = hostname.split('.')[0] + shortname = host_shortname(hostname) user_ = user user_at = user_.strip('@') + '@' if user_ else '' diff --git a/teuthology/orchestra/remote.py b/teuthology/orchestra/remote.py index a93a9a208b..027ab50344 100644 --- a/teuthology/orchestra/remote.py +++ b/teuthology/orchestra/remote.py @@ -7,6 +7,7 @@ from . import run from .opsys import OS import connection from teuthology import misc +from teuthology.misc import host_shortname import time import re import logging @@ -45,7 +46,7 @@ class Remote(object): # should work on any unix system self.user = pwd.getpwuid(os.getuid()).pw_name hostname = name - self._shortname = shortname or hostname.split('.')[0] + self._shortname = shortname or host_shortname(hostname) self._host_key = host_key self.keep_alive = keep_alive self._console = console @@ -149,7 +150,7 @@ class Remote(object): @property def shortname(self): if self._shortname is None: - self._shortname = self.hostname.split('.')[0] + self._shortname = host_shortname(self.hostname) return self._shortname @property @@ -468,10 +469,8 @@ def getShortName(name): """ Extract the name portion from remote name strings. """ - hn = name.split('@')[-1] - p = re.compile('([^.]+)\.?.*') - return p.match(hn).groups()[0] - + hostname = name.split('@')[-1] + return host_shortname(hostname) def getRemoteConsole(name, ipmiuser=None, ipmipass=None, ipmidomain=None, logfile=None, timeout=20): diff --git a/teuthology/orchestra/run.py b/teuthology/orchestra/run.py index 7a0fe16065..f98668afe4 100644 --- a/teuthology/orchestra/run.py +++ b/teuthology/orchestra/run.py @@ -75,7 +75,7 @@ class RemoteProcess(object): if hostname: self.hostname = hostname else: - (self.hostname, port) = client.get_transport().getpeername() + (self.hostname, port) = client.get_transport().getpeername()[0:2] self.greenlets = [] self.stdin, self.stdout, self.stderr = (None, None, None) @@ -407,7 +407,7 @@ def run( try: transport = client.get_transport() if transport: - (host, port) = transport.getpeername() + (host, port) = transport.getpeername()[0:2] else: raise ConnectionLostError(command=quote(args), node=name) except socket.error: -- 2.39.5