From: John Spray Date: Tue, 22 Aug 2017 18:47:10 +0000 (-0400) Subject: mgr/dashboard: implement standby mode X-Git-Tag: v13.0.1~332^2~16 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=4f7007d1b0226af3f0cc33627ebf5051975657ac;p=ceph.git mgr/dashboard: implement standby mode Signed-off-by: John Spray --- diff --git a/src/pybind/mgr/dashboard/module.py b/src/pybind/mgr/dashboard/module.py index 72a31de1658..c5f362a3b6f 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 @@ -67,6 +67,50 @@ def get_prefixed_url(url): +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) @@ -898,7 +942,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 )) @@ -1065,7 +1109,8 @@ class Module(MgrModule): cherrypy.tree.mount(Root(), get_prefixed_url("/"), conf) cherrypy.tree.mount(OSDEndpoint(), get_prefixed_url("/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 00000000000..ec706a17d33 --- /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... + +