Make DeepCheckResultsRenderer a MultiFormatResource

This commit is contained in:
Sajith Sasidharan 2020-06-04 17:46:06 -04:00
parent 9dcaa104c5
commit c33c0a884d

View File

@ -410,14 +410,17 @@ class CheckAndRepairResultsRendererElement(Element, CheckerBase, ResultsBase):
return "" return ""
class DeepCheckResultsRenderer(rend.Page, ResultsBase, ReloadMixin): class DeepCheckResultsRenderer(MultiFormatResource):
docFactory = getxmlfile("deep-check-results.xhtml")
formatArgument = "output"
def __init__(self, client, monitor): def __init__(self, client, monitor):
# TODO: document params
super(DeepCheckResultsRenderer, self).__init__()
self.client = client self.client = client
self.monitor = monitor self.monitor = monitor
def childFactory(self, ctx, name): def getChild(self, name, req):
if not name: if not name:
return self return self
# /operation/$OPHANDLE/$STORAGEINDEX provides detailed information # /operation/$OPHANDLE/$STORAGEINDEX provides detailed information
@ -431,13 +434,18 @@ class DeepCheckResultsRenderer(rend.Page, ResultsBase, ReloadMixin):
raise WebError("No detailed results for SI %s" % html.escape(name), raise WebError("No detailed results for SI %s" % html.escape(name),
http.NOT_FOUND) http.NOT_FOUND)
def renderHTTP(self, ctx): def render_HTML(self, req):
if self.want_json(ctx): elem = DeepCheckResultsRendererElement(self.monitor)
return self.json(ctx) return renderElement(req, elem)
return rend.Page.renderHTTP(self, ctx)
def json(self, ctx): # def renderHTTP(self, ctx):
inevow.IRequest(ctx).setHeader("content-type", "text/plain") # if self.want_json(ctx):
# return self.json(ctx)
# return rend.Page.renderHTTP(self, ctx)
def render_JSON(self, req):
# inevow.IRequest(ctx).setHeader("content-type", "text/plain")
req.setHeader("content-type", "text/plain")
data = {} data = {}
data["finished"] = self.monitor.is_finished() data["finished"] = self.monitor.is_finished()
res = self.monitor.get_status() res = self.monitor.get_status()
@ -459,28 +467,49 @@ class DeepCheckResultsRenderer(rend.Page, ResultsBase, ReloadMixin):
data["stats"] = res.get_stats() data["stats"] = res.get_stats()
return json.dumps(data, indent=1) + "\n" return json.dumps(data, indent=1) + "\n"
def render_root_storage_index(self, ctx, data):
class DeepCheckResultsRendererElement(Element, ResultsBase, ReloadMixin):
loader = XMLFile(FilePath(__file__).sibling("deep-check-results.xhtml"))
def __init__(self, monitor):
super(DeepCheckResultsRendererElement, self).__init__()
self.monitor = monitor
@renderer
def root_storage_index(self, req, tag):
return self.monitor.get_status().get_root_storage_index_string() return self.monitor.get_status().get_root_storage_index_string()
def data_objects_checked(self, ctx, data): @renderer
def objects_checked(self, req, tag):
return self.monitor.get_status().get_counters()["count-objects-checked"] return self.monitor.get_status().get_counters()["count-objects-checked"]
def data_objects_healthy(self, ctx, data):
@renderer
def objects_healthy(self, req, tag):
return self.monitor.get_status().get_counters()["count-objects-healthy"] return self.monitor.get_status().get_counters()["count-objects-healthy"]
def data_objects_unhealthy(self, ctx, data):
@renderer
def objects_unhealthy(self, req, tag):
return self.monitor.get_status().get_counters()["count-objects-unhealthy"] return self.monitor.get_status().get_counters()["count-objects-unhealthy"]
def data_objects_unrecoverable(self, ctx, data):
@renderer
def objects_unrecoverable(self, req, tag):
return self.monitor.get_status().get_counters()["count-objects-unrecoverable"] return self.monitor.get_status().get_counters()["count-objects-unrecoverable"]
def data_count_corrupt_shares(self, ctx, data): @renderer
def count_corrupt_shares(self, req, tag):
return self.monitor.get_status().get_counters()["count-corrupt-shares"] return self.monitor.get_status().get_counters()["count-corrupt-shares"]
def render_problems_p(self, ctx, data): @renderer
def problems_p(self, req, tag):
c = self.monitor.get_status().get_counters() c = self.monitor.get_status().get_counters()
if c["count-objects-unhealthy"]: if c["count-objects-unhealthy"]:
return ctx.tag return tag
return "" return ""
def data_problems(self, ctx, data): # TODO: use SlotsSequenceElement to render this.
@renderer
def problems(self, req, tag):
all_objects = self.monitor.get_status().get_all_results() all_objects = self.monitor.get_status().get_all_results()
for path in sorted(all_objects.keys()): for path in sorted(all_objects.keys()):
cr = all_objects[path] cr = all_objects[path]
@ -488,78 +517,99 @@ class DeepCheckResultsRenderer(rend.Page, ResultsBase, ReloadMixin):
if not cr.is_healthy(): if not cr.is_healthy():
yield path, cr yield path, cr
def render_problem(self, ctx, data): @renderer
def render_problem(self, req, tag):
# TODO: deal with this.
path, cr = data path, cr = data
summary_text = "" summary_text = ""
summary = cr.get_summary() summary = cr.get_summary()
if summary: if summary:
summary_text = ": " + summary summary_text = ": " + summary
summary_text += " [SI: %s]" % cr.get_storage_index_string() summary_text += " [SI: %s]" % cr.get_storage_index_string()
return ctx.tag[self._join_pathstring(path), self._html(summary_text)] return tag(self._join_pathstring(path), self._html(summary_text))
@renderer
def render_servers_with_corrupt_shares_p(self, ctx, data): def servers_with_corrupt_shares_p(self, req, tag):
if self.monitor.get_status().get_counters()["count-corrupt-shares"]: if self.monitor.get_status().get_counters()["count-corrupt-shares"]:
return ctx.tag return tag
return "" return ""
def data_servers_with_corrupt_shares(self, ctx, data): # TODO: use SlotsSequenceElement to render this.
@renderer
def servers_with_corrupt_shares(self, ctx, data):
servers = [s servers = [s
for (s, storage_index, sharenum) for (s, storage_index, sharenum)
in self.monitor.get_status().get_corrupt_shares()] in self.monitor.get_status().get_corrupt_shares()]
servers.sort(key=lambda s: s.get_longname()) servers.sort(key=lambda s: s.get_longname())
return servers return servers
def render_server_problem(self, ctx, server): @renderer
def server_problem(self, req, tag):
# def server_problem(self, ctx, server):
# TODO: where do `server` come from now?
data = [server.get_name()] data = [server.get_name()]
nickname = server.get_nickname() nickname = server.get_nickname()
if nickname: if nickname:
data.append(" (%s)" % self._html(nickname)) data.append(" (%s)" % self._html(nickname))
return ctx.tag[data] return tag(data)
@renderer
def render_corrupt_shares_p(self, ctx, data): def corrupt_shares_p(self, req, tag):
if self.monitor.get_status().get_counters()["count-corrupt-shares"]: if self.monitor.get_status().get_counters()["count-corrupt-shares"]:
return ctx.tag return tag
return "" return ""
def data_corrupt_shares(self, ctx, data):
# TODO: Probably should use SlotsSequenceElement to render this.
@renderer
def corrupt_shares(self, req, tag):
return self.monitor.get_status().get_corrupt_shares() return self.monitor.get_status().get_corrupt_shares()
def render_share_problem(self, ctx, data):
@renderer
def share_problem(self, req, tag):
# def render_share_problem(self, req, tag):
server, storage_index, sharenum = data server, storage_index, sharenum = data
nickname = server.get_nickname() nickname = server.get_nickname()
ctx.fillSlots("serverid", server.get_name()) tag.fillSlots("serverid", server.get_name())
if nickname: if nickname:
ctx.fillSlots("nickname", self._html(nickname)) tag.fillSlots("nickname", self._html(nickname))
ctx.fillSlots("si", self._render_si_link(ctx, storage_index)) tag.fillSlots("si", self._render_si_link(ctx, storage_index))
ctx.fillSlots("shnum", str(sharenum)) tag.fillSlots("shnum", str(sharenum))
return ctx.tag return tag
def render_return(self, ctx, data): @renderer
req = inevow.IRequest(ctx) def return_to(self, req, tag):
# req = inevow.IRequest(ctx)
return_to = get_arg(req, "return_to", None) return_to = get_arg(req, "return_to", None)
if return_to: if return_to:
return T.div[T.a(href=return_to)["Return to file/directory."]] return tags.div(tags.a("Return to file/directory.", href=return_to))
return "" return ""
# TODO: use SlotsSequenceElement to render this.
@renderer
def data_all_objects(self, ctx, data): def data_all_objects(self, ctx, data):
r = self.monitor.get_status().get_all_results() r = self.monitor.get_status().get_all_results()
for path in sorted(r.keys()): for path in sorted(r.keys()):
yield (path, r[path]) yield (path, r[path])
def render_object(self, ctx, data): @renderer
def object(self, ctx, data):
# def render_object(self, ctx, data):
# TODO: figure `data` out
path, r = data path, r = data
ctx.fillSlots("path", self._join_pathstring(path)) tag.fillSlots("path", self._join_pathstring(path))
ctx.fillSlots("healthy", str(r.is_healthy())) tag.fillSlots("healthy", str(r.is_healthy()))
ctx.fillSlots("recoverable", str(r.is_recoverable())) tag.fillSlots("recoverable", str(r.is_recoverable()))
storage_index = r.get_storage_index() storage_index = r.get_storage_index()
ctx.fillSlots("storage_index", self._render_si_link(ctx, storage_index)) tag.fillSlots("storage_index", self._render_si_link(req, storage_index))
ctx.fillSlots("summary", self._html(r.get_summary())) tag.fillSlots("summary", self._html(r.get_summary()))
return ctx.tag return tag
def render_runtime(self, ctx, data): @renderer
req = inevow.IRequest(ctx) def runtime(self, req, tag):
# req = inevow.IRequest(ctx)
runtime = time.time() - req.processing_started_timestamp runtime = time.time() - req.processing_started_timestamp
return ctx.tag["runtime: %s seconds" % runtime] return tag("runtime: %s seconds" % runtime)
class DeepCheckAndRepairResultsRenderer(rend.Page, ResultsBase, ReloadMixin): class DeepCheckAndRepairResultsRenderer(rend.Page, ResultsBase, ReloadMixin):
docFactory = getxmlfile("deep-check-and-repair-results.xhtml") docFactory = getxmlfile("deep-check-and-repair-results.xhtml")