From: John Spray Date: Tue, 22 Aug 2017 18:47:10 +0000 (-0400) Subject: mgr/dashboard: implement standby mode X-Git-Tag: v12.2.2~61^2~19 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=8d4512b5636eb41b2cbb50a42d071580cff728c6;p=ceph.git mgr/dashboard: implement standby mode Signed-off-by: John Spray (cherry picked from commit 4f7007d1b0226af3f0cc33627ebf5051975657ac) --- diff --git a/src/pybind/mgr/dashboard/module.py b/src/pybind/mgr/dashboard/module.py index 2da1bf912231..0cb92332837f 100644 --- a/src/pybind/mgr/dashboard/module.py +++ b/src/pybind/mgr/dashboard/module.py @@ -27,7 +27,7 @@ import socket import cherrypy import jinja2 -from mgr_module import MgrModule, CommandResult +from mgr_module import MgrModule, MgrStandbyModule, CommandResult from types import OsdMap, NotFound, Config, FsMap, MonMap, \ PgSummary, Health, MonStatus @@ -63,6 +63,50 @@ def recurse_refs(root, path): log.info("%s %d (%s)" % (path, sys.getrefcount(root), root.__class__)) +class StandbyModule(MgrStandbyModule): + def serve(self): + server_addr = self.get_localized_config('server_addr', '::') + server_port = self.get_localized_config('server_port', '7000') + if server_addr is None: + raise RuntimeError('no server_addr configured; try "ceph config-key set mgr/dashboard/server_addr "') + log.info("server_addr: %s server_port: %s" % (server_addr, server_port)) + cherrypy.config.update({ + 'server.socket_host': server_addr, + 'server.socket_port': int(server_port), + 'engine.autoreload.on': False + }) + + current_dir = os.path.dirname(os.path.abspath(__file__)) + jinja_loader = jinja2.FileSystemLoader(current_dir) + env = jinja2.Environment(loader=jinja_loader) + + module = self + + class Root(object): + @cherrypy.expose + def index(self): + active_uri = module.get_active_uri() + if active_uri: + log.info("Redirecting to active '{0}'".format(active_uri)) + raise cherrypy.HTTPRedirect(active_uri) + else: + template = env.get_template("standby.html") + return template.render(delay=5) + + cherrypy.tree.mount(Root(), "/", {}) + log.info("Starting engine...") + cherrypy.engine.start() + log.info("Waiting for engine...") + cherrypy.engine.wait(state=cherrypy.engine.states.STOPPED) + log.info("Engine done.") + + def shutdown(self): + log.info("Stopping server...") + cherrypy.engine.wait(state=cherrypy.engine.states.STARTED) + cherrypy.engine.stop() + log.info("Stopped server") + + class Module(MgrModule): def __init__(self, *args, **kwargs): super(Module, self).__init__(*args, **kwargs) @@ -838,7 +882,7 @@ 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.gethostname() if server_addr == "::" else server_addr, + socket.getfqdn() if server_addr == "::" else server_addr, server_port )) @@ -995,7 +1039,8 @@ class Module(MgrModule): cherrypy.tree.mount(Root(), "/", conf) cherrypy.tree.mount(OSDEndpoint(), "/osd", conf) - log.info("Starting engine...") + log.info("Starting engine on {0}:{1}...".format( + server_addr, server_port)) cherrypy.engine.start() log.info("Waiting for engine...") cherrypy.engine.block() diff --git a/src/pybind/mgr/dashboard/standby.html b/src/pybind/mgr/dashboard/standby.html new file mode 100644 index 000000000000..ec706a17d338 --- /dev/null +++ b/src/pybind/mgr/dashboard/standby.html @@ -0,0 +1,15 @@ + + + + + Ceph + + + + No active ceph-mgr instance is currently running + the dashboard. A failover may be in progress. + Retrying in {{delay}} seconds... + +