]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: implement standby mode
authorJohn Spray <john.spray@redhat.com>
Tue, 22 Aug 2017 18:47:10 +0000 (14:47 -0400)
committerJohn Spray <john.spray@redhat.com>
Wed, 1 Nov 2017 12:20:21 +0000 (08:20 -0400)
Signed-off-by: John Spray <john.spray@redhat.com>
src/pybind/mgr/dashboard/module.py
src/pybind/mgr/dashboard/standby.html [new file with mode: 0644]

index 72a31de1658d2c9eff87f59118c160ae2bb7be0d..c5f362a3b6fb1360dd977e47196d4ebd1b9ae08a 100644 (file)
@@ -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 <ip>"')
+        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 (file)
index 0000000..ec706a1
--- /dev/null
@@ -0,0 +1,15 @@
+
+<html>
+    <!-- Note: this is only displayed when the standby
+         does not know an active URI to redirect to, otherwise
+         a simple redirect is returned instead -->
+    <head>
+        <title>Ceph</title>
+        <meta http-equiv="refresh" content="{{delay}}">
+    </head>
+    <body>
+        No active ceph-mgr instance is currently running
+        the dashboard.  A failover may be in progress.
+        Retrying in {{delay}} seconds...
+    </body>
+</html>