From 157a7b4183dbd888f106c613a758409d7e07b917 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 25 May 2021 13:00:35 -0400 Subject: [PATCH] mgr/dashboard,prometheus: new method of getting mgr IP - 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 --- src/pybind/mgr/dashboard/module.py | 5 +++-- src/pybind/mgr/mgr_module.py | 31 +++++++++++++++++++++++++++++ src/pybind/mgr/prometheus/module.py | 8 +++----- 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/pybind/mgr/dashboard/module.py b/src/pybind/mgr/dashboard/module.py index 4fa6d8163d3..7159458621a 100644 --- a/src/pybind/mgr/dashboard/module.py +++ b/src/pybind/mgr/dashboard/module.py @@ -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 ) diff --git a/src/pybind/mgr/mgr_module.py b/src/pybind/mgr/mgr_module.py index 07ed288199e..3d03e37d124 100644 --- a/src/pybind/mgr/mgr_module.py +++ b/src/pybind/mgr/mgr_module.py @@ -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) diff --git a/src/pybind/mgr/prometheus/module.py b/src/pybind/mgr/prometheus/module.py index 5c00e9db6a9..bc6c4eed2b9 100644 --- a/src/pybind/mgr/prometheus/module.py +++ b/src/pybind/mgr/prometheus/module.py @@ -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, -- 2.39.5