]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: fix for using '::' on hosts without ipv6 26750/head
authorNoah Watkins <noahwatkins@gmail.com>
Fri, 22 Feb 2019 22:13:47 +0000 (14:13 -0800)
committerNoah Watkins <noahwatkins@gmail.com>
Mon, 4 Mar 2019 19:37:20 +0000 (11:37 -0800)
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/38575

Signed-off-by: Noah Watkins <noahwatkins@gmail.com>
(cherry picked from commit 384d82a1bb1a3f0c2b1027968f03fe7834daad6a)

src/pybind/mgr/dashboard/module.py
src/pybind/mgr/prometheus/module.py

index 0b53743d7434289235a1446d13d7faa44a93591f..b0b8aec3a0771b640ef804218245a42d8d0d1b99 100644 (file)
@@ -49,6 +49,19 @@ if cherrypy is not None:
 
         HTTPConnection.__init__ = fixed_init
 
+# 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
 
 if 'COVERAGE_ENABLED' in os.environ:
     import coverage
index 4b68279533eed62b249f7d1aad4d2d8aeca69d4f..0abaa8b7f3172e566007ccb6d572c66bdb461afc 100644 (file)
@@ -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, CommandResult
 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):