From: Kyrylo Shatskyy Date: Sun, 28 Oct 2018 17:56:14 +0000 (+0100) Subject: Fix ipv4 and ipv6 address logging for Remote.run X-Git-Tag: 1.1.0~291^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=fe38df6fce78ce26856ed148c803505f22bcc920;p=teuthology.git 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 --- diff --git a/teuthology/misc.py b/teuthology/misc.py index a01677a5..9f9e0592 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 a93a9a20..027ab503 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 7a0fe160..f98668af 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: