From 366a309795c3fedd97b50a7ce57919834eb25cfa Mon Sep 17 00:00:00 2001 From: Brian Warner Date: Thu, 26 Nov 2009 15:27:31 -0800 Subject: [PATCH] webapi: fix t=check for DIR2-LIT (i.e. empty immutable directories) --- src/allmydata/test/test_web.py | 14 ++++++++++++++ src/allmydata/web/directory.py | 12 +++++++++--- src/allmydata/web/filenode.py | 12 +++++++----- 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/allmydata/test/test_web.py b/src/allmydata/test/test_web.py index c96a8196..9d0aad0e 100644 --- a/src/allmydata/test/test_web.py +++ b/src/allmydata/test/test_web.py @@ -2782,6 +2782,8 @@ class Grid(GridTestMixin, WebErrorMixin, unittest.TestCase, ShouldFailMixin): d.addCallback(lambda ign: c0.upload(upload.Data("literal", convergence=""))) d.addCallback(_stash_uri, "small") + d.addCallback(lambda ign: c0.create_immutable_dirnode({})) + d.addCallback(_stash_mutable_uri, "smalldir") def _compute_fileurls(ignored): self.fileurls = {} @@ -2844,6 +2846,18 @@ class Grid(GridTestMixin, WebErrorMixin, unittest.TestCase, ShouldFailMixin): self.failUnless(r["results"]["healthy"]) d.addCallback(_got_json_small) + d.addCallback(self.CHECK, "smalldir", "t=check") + def _got_html_smalldir(res): + self.failUnless("Literal files are always healthy" in res, res) + self.failIf("Not Healthy" in res, res) + d.addCallback(_got_html_smalldir) + d.addCallback(self.CHECK, "smalldir", "t=check&output=json") + def _got_json_smalldir(res): + r = simplejson.loads(res) + self.failUnlessEqual(r["storage-index"], "") + self.failUnless(r["results"]["healthy"]) + d.addCallback(_got_json_smalldir) + d.addCallback(self.CHECK, "sick", "t=check") def _got_html_sick(res): self.failUnless("Not Healthy" in res, res) diff --git a/src/allmydata/web/directory.py b/src/allmydata/web/directory.py index 2c8a609d..a25f8cc4 100644 --- a/src/allmydata/web/directory.py +++ b/src/allmydata/web/directory.py @@ -26,7 +26,8 @@ from allmydata.web.common import text_plain, WebError, \ from allmydata.web.filenode import ReplaceMeMixin, \ FileNodeHandler, PlaceHolderNodeHandler from allmydata.web.check_results import CheckResults, \ - CheckAndRepairResults, DeepCheckResults, DeepCheckAndRepairResults + CheckAndRepairResults, DeepCheckResults, DeepCheckAndRepairResults, \ + LiteralCheckResults from allmydata.web.info import MoreInfo from allmydata.web.operations import ReloadMixin from allmydata.web.check_results import json_check_results, \ @@ -397,6 +398,11 @@ class DirectoryNodeHandler(RenderMixin, rend.Page, ReplaceMeMixin): d.addCallback(lambda res: "thing renamed") return d + def _maybe_literal(self, res, Results_Class): + if res: + return Results_Class(self.client, res) + return LiteralCheckResults(self.client) + def _POST_check(self, req): # check this directory verify = boolean_of_arg(get_arg(req, "verify", "false")) @@ -404,10 +410,10 @@ class DirectoryNodeHandler(RenderMixin, rend.Page, ReplaceMeMixin): add_lease = boolean_of_arg(get_arg(req, "add-lease", "false")) if repair: d = self.node.check_and_repair(Monitor(), verify, add_lease) - d.addCallback(lambda res: CheckAndRepairResults(self.client, res)) + d.addCallback(self._maybe_literal, CheckAndRepairResults) else: d = self.node.check(Monitor(), verify, add_lease) - d.addCallback(lambda res: CheckResults(self.client, res)) + d.addCallback(self._maybe_literal, CheckResults) return d def _start_operation(self, monitor, renderer, ctx): diff --git a/src/allmydata/web/filenode.py b/src/allmydata/web/filenode.py index 9b2c4535..daf3d43f 100644 --- a/src/allmydata/web/filenode.py +++ b/src/allmydata/web/filenode.py @@ -9,7 +9,6 @@ from nevow.inevow import IRequest from allmydata.interfaces import ExistingChildError, CannotPackUnknownNodeError from allmydata.monitor import Monitor from allmydata.immutable.upload import FileHandle -from allmydata.immutable.filenode import LiteralFileNode from allmydata.unknown import UnknownNode from allmydata.util import log, base32 @@ -260,18 +259,21 @@ class FileNodeHandler(RenderMixin, rend.Page, ReplaceMeMixin): d.addCallback(lambda res: url.URL.fromString(when_done)) return d + def _maybe_literal(self, res, Results_Class): + if res: + return Results_Class(self.client, res) + return LiteralCheckResults(self.client) + def _POST_check(self, req): verify = boolean_of_arg(get_arg(req, "verify", "false")) repair = boolean_of_arg(get_arg(req, "repair", "false")) add_lease = boolean_of_arg(get_arg(req, "add-lease", "false")) - if isinstance(self.node, LiteralFileNode): - return defer.succeed(LiteralCheckResults(self.client)) if repair: d = self.node.check_and_repair(Monitor(), verify, add_lease) - d.addCallback(lambda res: CheckAndRepairResults(self.client, res)) + d.addCallback(self._maybe_literal, CheckAndRepairResults) else: d = self.node.check(Monitor(), verify, add_lease) - d.addCallback(lambda res: CheckResults(self.client, res)) + d.addCallback(self._maybe_literal, CheckResults) return d def render_DELETE(self, ctx): -- 2.45.2