From: Noah Watkins Date: Fri, 22 Feb 2019 22:13:47 +0000 (-0800) Subject: mgr/dashboard: fix for using '::' on hosts without ipv6 X-Git-Tag: v12.2.12~15^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=4c4bf59249753655189904ab6fb67b9f276b3607;p=ceph.git mgr/dashboard: fix for using '::' on hosts without ipv6 CherryPy throws an uncaught exception using '::' when the host does not have an ipv6 loopback address. This is currently the case in kubernetes. This patch disables the routine in cherrypy that performs the validation that requested server ports are actually bound. fixes: http://tracker.ceph.com/issues/38576 Signed-off-by: Noah Watkins (cherry picked from commit 384d82a1bb1a3f0c2b1027968f03fe7834daad6a) Conflicts: src/pybind/mgr/dashboard/module.py Contextual conflict as >luminous had nearby SSL code that was never backported. --- diff --git a/src/pybind/mgr/dashboard/module.py b/src/pybind/mgr/dashboard/module.py index 39add806393..c52ff530500 100644 --- a/src/pybind/mgr/dashboard/module.py +++ b/src/pybind/mgr/dashboard/module.py @@ -27,6 +27,7 @@ import socket import cherrypy import jinja2 import urlparse +from distutils.version import StrictVersion from mgr_module import MgrModule, MgrStandbyModule, CommandResult @@ -46,6 +47,20 @@ log = logging.getLogger("dashboard") # python module for the convenience of the GUI? LOG_BUFFER_SIZE = 30 +# When the CherryPy server in 3.2.2 (and later) starts it attempts to verify +# that the ports its listening on are in fact bound. When using the any address +# "::" it tries both ipv4 and ipv6, and in some environments (e.g. kubernetes) +# ipv6 isn't yet configured / supported and CherryPy throws an uncaught +# exception. +if cherrypy is not None: + v = StrictVersion(cherrypy.__version__) + # the issue was fixed in 3.2.3. it's present in 3.2.2 (current version on + # centos:7) and back to at least 3.0.0. + if StrictVersion("3.1.2") <= v < StrictVersion("3.2.3"): + # https://github.com/cherrypy/cherrypy/issues/1100 + from cherrypy.process import servers + servers.wait_for_occupied_port = lambda host, port: None + # cherrypy likes to sys.exit on error. don't let it take us down too! def os_exit_noop(*args, **kwargs): pass diff --git a/src/pybind/mgr/prometheus/module.py b/src/pybind/mgr/prometheus/module.py index fc013fb8591..16abd079245 100644 --- a/src/pybind/mgr/prometheus/module.py +++ b/src/pybind/mgr/prometheus/module.py @@ -1,4 +1,5 @@ import cherrypy +from distutils.version import StrictVersion import json import errno import math @@ -15,6 +16,19 @@ from mgr_module import MgrModule, MgrStandbyModule DEFAULT_ADDR = '::' DEFAULT_PORT = 9283 +# When the CherryPy server in 3.2.2 (and later) starts it attempts to verify +# that the ports its listening on are in fact bound. When using the any address +# "::" it tries both ipv4 and ipv6, and in some environments (e.g. kubernetes) +# ipv6 isn't yet configured / supported and CherryPy throws an uncaught +# exception. +if cherrypy is not None: + v = StrictVersion(cherrypy.__version__) + # the issue was fixed in 3.2.3. it's present in 3.2.2 (current version on + # centos:7) and back to at least 3.0.0. + if StrictVersion("3.1.2") <= v < StrictVersion("3.2.3"): + # https://github.com/cherrypy/cherrypy/issues/1100 + from cherrypy.process import servers + servers.wait_for_occupied_port = lambda host, port: None # cherrypy likes to sys.exit on error. don't let it take us down too! def os_exit_noop(*args, **kwargs):