]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard,prometheus: new method of getting mgr IP
authorSage Weil <sage@newdream.net>
Tue, 25 May 2021 17:00:35 +0000 (13:00 -0400)
committerSage Weil <sage@newdream.net>
Thu, 27 May 2021 16:00:20 +0000 (12:00 -0400)
- Use a centralized method get_mgr_ip()
- Look up the hostname via DNS.  This is a bit more reliable than
getfqdn() since it will work even when podman adds the container
name to /etc/hosts.

Signed-off-by: Sage Weil <sage@newdream.net>
src/pybind/mgr/dashboard/module.py
src/pybind/mgr/mgr_module.py
src/pybind/mgr/prometheus/module.py

index 4fa6d8163d37810d7f78394e05941577ea02a1db..7159458621ad2cd641b13ae873bb1416efc62613 100644 (file)
@@ -6,7 +6,6 @@ import collections
 import errno
 import logging
 import os
-import socket
 import ssl
 import sys
 import tempfile
@@ -107,6 +106,8 @@ class CherryPyConfig(object):
         else:
             server_port = self.get_localized_module_option('ssl_server_port', 8443)  # type: ignore
 
+        if server_addr == '::':
+            server_addr = self.get_mgr_ip()  # type: ignore
         if server_addr is None:
             raise ServerConfigException(
                 'no server_addr configured; '
@@ -191,7 +192,7 @@ class CherryPyConfig(object):
 
         uri = "{0}://{1}:{2}{3}/".format(
             'https' if use_ssl else 'http',
-            socket.getfqdn(server_addr if server_addr != '::' else ''),
+            server_addr,
             server_port,
             self.url_prefix
         )
index 07ed288199eaaec4bd06812b540989f11522b846..3d03e37d12499f5976a2246065be1bae31fc5e1b 100644 (file)
@@ -19,6 +19,7 @@ from collections import defaultdict
 from enum import IntEnum
 import rados
 import re
+import socket
 import sys
 import time
 from ceph_argparse import CephArgtype
@@ -791,6 +792,21 @@ class MgrStandbyModule(ceph_module.BaseMgrStandbyModule, MgrModuleLoggingMixin):
     def get_active_uri(self) -> str:
         return self._ceph_get_active_uri()
 
+    def get_mgr_ip(self) -> str:
+        hostname = socket.gethostname()
+        try:
+            r = socket.getaddrinfo(hostname, None, flags=socket.AI_CANONNAME,
+                                   type=socket.SOCK_STREAM)
+            # pick first v4 IP, if present, as long as it is not 127.0.{0,1}.1
+            for a in r:
+                if a[4][0] in ['127.0.1.1', '127.0.0.1']:
+                    continue
+                if a[0] == socket.AF_INET:
+                    return a[4][0]
+        except socket.gaierror as e:
+            pass
+        return hostname
+
     def get_localized_module_option(self, key: str, default: OptionValue = None) -> OptionValue:
         r = self._ceph_get_module_option(key, self.get_mgr_id())
         if r is None:
@@ -1372,6 +1388,21 @@ class MgrModule(ceph_module.BaseMgrModule, MgrModuleLoggingMixin):
     def get_ceph_conf_path(self) -> str:
         return self._ceph_get_ceph_conf_path()
 
+    def get_mgr_ip(self) -> str:
+        hostname = socket.gethostname()
+        try:
+            r = socket.getaddrinfo(hostname, None, flags=socket.AI_CANONNAME,
+                                   type=socket.SOCK_STREAM)
+            # pick first v4 IP, if present, as long as it is not 127.0.{0,1}.1
+            for a in r:
+                if a[4][0] in ['127.0.1.1', '127.0.0.1']:
+                    continue
+                if a[0] == socket.AF_INET:
+                    return a[4][0]
+        except socket.gaierror as e:
+            pass
+        return hostname
+
     def get_ceph_option(self, key: str) -> OptionValue:
         return self._ceph_get_option(key)
 
index 5c00e9db6a94141942e97e33fd91969a00190b7c..bc6c4eed2b98f064d9658578d512d98d171699e7 100644 (file)
@@ -5,7 +5,6 @@ import json
 import math
 import os
 import re
-import socket
 import threading
 import time
 from mgr_module import CLIReadCommand, MgrModule, MgrStandbyModule, PG_STATES, Option, ServiceInfoT
@@ -1383,10 +1382,9 @@ class Module(MgrModule):
 
         # Publish the URI that others may use to access the service we're
         # about to start serving
-        self.set_uri('http://{0}:{1}/'.format(
-            socket.getfqdn() if server_addr in ['::', '0.0.0.0'] else server_addr,
-            server_port
-        ))
+        if server_addr in ['::', '0.0.0.0']:
+            server_addr = self.get_mgr_ip()
+        self.set_uri('http://{0}:{1}/'.format(server_addr, server_port))
 
         cherrypy.config.update({
             'server.socket_host': server_addr,