Render map update status using twisted.web.template

Fixes: ticket:3291
This commit is contained in:
Sajith Sasidharan 2020-05-05 17:38:08 -04:00
parent 3b0ace1710
commit 1602c66250
3 changed files with 113 additions and 73 deletions

0
newsfragments/3291.minor Normal file
View File

View File

@ -1,35 +1,39 @@
<html xmlns:n="http://nevow.com/ns/nevow/0.1">
<html xmlns:t="http://twistedmatrix.com/ns/twisted.web.template/0.1">
<head>
<title>Tahoe-LAFS - Mutable File Servermap Update Status</title>
<link href="/tahoe.css" rel="stylesheet" type="text/css"/>
<link href="/icon.png" rel="shortcut icon" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<h1>Mutable File Servermap Update Status</h1>
<h1>Mutable File Servermap Update Status</h1>
<ul>
<li>Started: <span n:render="started"/></li>
<li>Finished: <span n:render="finished"/></li>
<li>Storage Index: <span n:render="si"/></li>
<li>Helper?: <span n:render="helper"/></li>
<li>Progress: <span n:render="progress"/></li>
<li>Status: <span n:render="status"/></li>
</ul>
<ul>
<li>Started: <span t:render="started"/></li>
<li>Finished: <span t:render="finished"/></li>
<li>Storage Index: <span t:render="si"/></li>
<li>Helper?: <span t:render="helper"/></li>
<li>Progress: <span t:render="progress"/></li>
<li>Status: <span t:render="status"/></li>
</ul>
<h2>Update Results</h2>
<ul>
<li n:render="problems" />
<li>Total: <span n:render="time" n:data="time_total" /></li>
<ul>
<li>Initial Queries: <span n:render="time" n:data="time_initial_queries" /></li>
<li n:render="privkey_from" />
<li>Cumulative Verify: <span n:render="time" n:data="time_cumulative_verify" /></li>
</ul>
<li n:render="server_timings" />
</ul>
<h2>Update Results</h2>
<div>Return to the <a href="/">Welcome Page</a></div>
<ul>
<li t:render="problems" />
<li>Total: <span t:render="time_total" /></li>
<ul>
<li>Initial Queries: <span t:render="time_initial_queries" /></li>
<li t:render="privkey_from" />
<li>Cumulative Verify: <span t:render="time_cumulative_verify" /></li>
</ul>
<li t:render="server_timings" />
</ul>
</body></html>
<div>Return to the <a href="/">Welcome Page</a></div>
</body>
</html>

View File

@ -9,7 +9,7 @@ from twisted.web.template import (
XMLFile,
renderer,
renderElement,
tags
tags,
)
from nevow import rend, tags as T
from allmydata.util import base32, idlib
@ -868,73 +868,109 @@ class PublishStatusPage(rend.Page, RateAndTimeMixin):
l[T.li["[%s]: %s" % (server.get_name(), times_s)]]
return T.li["Per-Server Response Times: ", l]
class MapupdateStatusPage(rend.Page, RateAndTimeMixin):
docFactory = getxmlfile("map-update-status.xhtml")
def __init__(self, data):
rend.Page.__init__(self, data)
self.update_status = data
class MapupdateStatusPage(MultiFormatResource):
def render_started(self, ctx, data):
started_s = render_time(data.get_started())
return started_s
def __init__(self, update_status):
super(MapupdateStatusPage, self).__init__()
self._update_status = update_status
def render_finished(self, ctx, data):
when = data.get_finished()
def render_HTML(self, req):
elem = MapupdateStatusElement(self._update_status);
return renderElement(req, elem)
class MapupdateStatusElement(RateAndTimeMixin, Element):
loader = XMLFile(FilePath(__file__).sibling("map-update-status.xhtml"))
def __init__(self, update_status):
super(MapupdateStatusElement, self).__init__()
self._update_status = update_status
@renderer
def started(self, req, tag):
started_s = render_time(self._update_status.get_started())
return tag(started_s)
@renderer
def finished(self, req, tag):
when = self._update_status.get_finished()
if not when:
return "not yet"
started_s = render_time(data.get_finished())
return started_s
return tag("not yet")
started_s = render_time(self._update_status.get_finished())
return tag(started_s)
def render_si(self, ctx, data):
si_s = base32.b2a_or_none(data.get_storage_index())
@renderer
def si(self, req, tag):
si_s = base32.b2a_or_none(self._update_status.get_storage_index())
if si_s is None:
si_s = "(None)"
return si_s
return tag(si_s)
def render_helper(self, ctx, data):
return {True: "Yes",
False: "No"}[data.using_helper()]
@renderer
def helper(self, req, tag):
return tag({True: "Yes",
False: "No"}[self._update_status.using_helper()])
def render_progress(self, ctx, data):
progress = data.get_progress()
@renderer
def progress(self, req, tag):
progress = self._update_status.get_progress()
# TODO: make an ascii-art bar
return "%.1f%%" % (100.0 * progress)
return tag("%.1f%%" % (100.0 * progress))
def render_status(self, ctx, data):
return data.get_status()
@renderer
def status(self, req, tag):
return tag(self._update_status.get_status())
def render_problems(self, ctx, data):
problems = data.problems
@renderer
def problems(self, req, tag):
problems = self._update_status.problems
if not problems:
return ""
l = T.ul()
return tag("")
l = tags.ul()
for peerid in sorted(problems.keys()):
peerid_s = idlib.shortnodeid_b2a(peerid)
l[T.li["[%s]: %s" % (peerid_s, problems[peerid])]]
return ctx.tag["Server Problems:", l]
l(tags.li("[%s]: %s" % (peerid_s, problems[peerid])))
return tag("Server Problems:", l)
def render_privkey_from(self, ctx, data):
server = data.get_privkey_from()
@renderer
def privkey_from(self, req, tag):
server = self._update_status.get_privkey_from()
if server:
return ctx.tag["Got privkey from: [%s]" % server.get_name()]
return tag("Got privkey from: [%s]" % server.get_name())
else:
return ""
return tag("")
def data_time_total(self, ctx, data):
return self.update_status.timings.get("total")
# Helper to query update status timings.
#
# Querying `update_status.timings` can yield `None` or a numeric
# value, but twisted.web has trouble flattening the element tree
# when a node contains numeric values. Stringifying them helps.
def _get_update_status_timing(self, name, tag):
res = self._update_status.timings.get(name)
if not res:
return tag("")
return tag(str(res))
def data_time_initial_queries(self, ctx, data):
return self.update_status.timings.get("initial_queries")
@renderer
def time_total(self, req, tag):
return self._get_update_status_timing("total", tag)
def data_time_cumulative_verify(self, ctx, data):
return self.update_status.timings.get("cumulative_verify")
@renderer
def time_initial_queries(self, req, tag):
return self._get_update_status_timing("initial_queries", tag)
def render_server_timings(self, ctx, data):
per_server = self.update_status.timings.get("per_server")
@renderer
def time_cumulative_verify(self, req, tag):
return self._get_update_status_timing("cumulative_verify", tag)
@renderer
def server_timings(self, req, tag):
per_server = self._update_status.timings.get("per_server")
if not per_server:
return ""
l = T.ul()
return tag("")
l = tags.ul()
for server in sorted(per_server.keys(), key=lambda s: s.get_name()):
times = []
for op,started,t in per_server[server]:
@ -943,14 +979,14 @@ class MapupdateStatusPage(rend.Page, RateAndTimeMixin):
# self.render_time(None, started - self.update_status.get_started()),
# self.render_time(None,t)))
if op == "query":
times.append( self.render_time(None, t) )
times.append(self.render_time(None, t))
elif op == "late":
times.append( "late(" + self.render_time(None, t) + ")" )
times.append("late(" + self.render_time(None, t) + ")")
else:
times.append( "privkey(" + self.render_time(None, t) + ")" )
times.append("privkey(" + self.render_time(None, t) + ")")
times_s = ", ".join(times)
l[T.li["[%s]: %s" % (server.get_name(), times_s)]]
return T.li["Per-Server Response Times: ", l]
l(tags.li("[%s]: %s" % (server.get_name(), times_s)))
return tags.li("Per-Server Response Times: ", l)
def marshal_json(s):