]> git.apps.os.sepia.ceph.com Git - teuthology.git/commitdiff
Fix ipv4 and ipv6 address logging for Remote.run 1231/head
authorKyrylo Shatskyy <kyrylo.shatskyy@gmail.com>
Sun, 28 Oct 2018 17:56:14 +0000 (18:56 +0100)
committerKyrylo Shatskyy <kyrylo.shatskyy@gmail.com>
Mon, 29 Oct 2018 00:20:09 +0000 (01:20 +0100)
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 <kyrylo.shatskyy@suse.de>
teuthology/misc.py
teuthology/orchestra/remote.py
teuthology/orchestra/run.py

index a01677a57f8adb2b3cad4c565e84da810789733a..9f9e059212c0e008db2bf2e0306a372bc8f6c517 100644 (file)
@@ -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<user>.*@)?(?P<shortname>.*)\.{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 ''
index a93a9a208bd2fba005824ae7255986de187dd391..027ab503447231f513bc5f1bd2bcfee8c87eeb50 100644 (file)
@@ -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):
index 7a0fe160658621eed0c9363665ce7884d65a21a0..f98668afe43c993902a47ae4bfcf667d7b4e160f 100644 (file)
@@ -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: