From f3cf13154da2c03e39fa3249384ec6e01ef90735 Mon Sep 17 00:00:00 2001 From: Itamar Turner-Trauring Date: Wed, 11 May 2022 12:00:27 -0400 Subject: [PATCH] Setup HTTP lease APIs for immutables too. --- src/allmydata/storage/http_client.py | 50 +++++++++++------------ src/allmydata/storage/http_server.py | 2 +- src/allmydata/storage_client.py | 2 +- src/allmydata/test/test_istorageserver.py | 6 --- src/allmydata/test/test_storage_http.py | 7 ++-- 5 files changed, 31 insertions(+), 36 deletions(-) diff --git a/src/allmydata/storage/http_client.py b/src/allmydata/storage/http_client.py index f39ed7d1a..167d2394a 100644 --- a/src/allmydata/storage/http_client.py +++ b/src/allmydata/storage/http_client.py @@ -355,6 +355,31 @@ class StorageClientGeneral(object): decoded_response = yield _decode_cbor(response, _SCHEMAS["get_version"]) returnValue(decoded_response) + @inlineCallbacks + def add_or_renew_lease( + self, storage_index: bytes, renew_secret: bytes, cancel_secret: bytes + ): + """ + Add or renew a lease. + + If the renewal secret matches an existing lease, it is renewed. + Otherwise a new lease is added. + """ + url = self._client.relative_url( + "/v1/lease/{}".format(_encode_si(storage_index)) + ) + response = yield self._client.request( + "PUT", + url, + lease_renew_secret=renew_secret, + lease_cancel_secret=cancel_secret, + ) + + if response.code == http.NO_CONTENT: + return + else: + raise ClientException(response.code) + @define class UploadProgress(object): @@ -578,31 +603,6 @@ class StorageClientImmutables(object): else: raise ClientException(response.code) - @inlineCallbacks - def add_or_renew_lease( - self, storage_index: bytes, renew_secret: bytes, cancel_secret: bytes - ): - """ - Add or renew a lease. - - If the renewal secret matches an existing lease, it is renewed. - Otherwise a new lease is added. - """ - url = self._client.relative_url( - "/v1/lease/{}".format(_encode_si(storage_index)) - ) - response = yield self._client.request( - "PUT", - url, - lease_renew_secret=renew_secret, - lease_cancel_secret=cancel_secret, - ) - - if response.code == http.NO_CONTENT: - return - else: - raise ClientException(response.code) - def advise_corrupt_share( self, storage_index: bytes, diff --git a/src/allmydata/storage/http_server.py b/src/allmydata/storage/http_server.py index db73b6a86..709c1fda5 100644 --- a/src/allmydata/storage/http_server.py +++ b/src/allmydata/storage/http_server.py @@ -539,7 +539,7 @@ class HTTPServer(object): ) def add_or_renew_lease(self, request, authorization, storage_index): """Update the lease for an immutable share.""" - if not self._storage_server.get_buckets(storage_index): + if not list(self._storage_server._get_bucket_shares(storage_index)): raise _HTTPError(http.NOT_FOUND) # Checking of the renewal secret is done by the backend. diff --git a/src/allmydata/storage_client.py b/src/allmydata/storage_client.py index e8d0e003a..c529c4513 100644 --- a/src/allmydata/storage_client.py +++ b/src/allmydata/storage_client.py @@ -1174,7 +1174,7 @@ class _HTTPStorageServer(object): renew_secret, cancel_secret ): - immutable_client = StorageClientImmutables(self._http_client) + immutable_client = StorageClientGeneral(self._http_client) try: await immutable_client.add_or_renew_lease( storage_index, renew_secret, cancel_secret diff --git a/src/allmydata/test/test_istorageserver.py b/src/allmydata/test/test_istorageserver.py index c0dd50590..39675336f 100644 --- a/src/allmydata/test/test_istorageserver.py +++ b/src/allmydata/test/test_istorageserver.py @@ -1179,9 +1179,3 @@ class HTTPMutableAPIsTests( _HTTPMixin, IStorageServerMutableAPIsTestsMixin, AsyncTestCase ): """HTTP-specific tests for mutable ``IStorageServer`` APIs.""" - - # TODO will be implemented in later tickets - SKIP_TESTS = { - "test_add_lease_renewal", - "test_add_new_lease", - } diff --git a/src/allmydata/test/test_storage_http.py b/src/allmydata/test/test_storage_http.py index df781012e..fcc2401f2 100644 --- a/src/allmydata/test/test_storage_http.py +++ b/src/allmydata/test/test_storage_http.py @@ -448,6 +448,7 @@ class ImmutableHTTPAPITests(SyncTestCase): super(ImmutableHTTPAPITests, self).setUp() self.http = self.useFixture(HttpTestFixture()) self.imm_client = StorageClientImmutables(self.http.client) + self.general_client = StorageClientGeneral(self.http.client) def create_upload(self, share_numbers, length): """ @@ -1081,7 +1082,7 @@ class ImmutableHTTPAPITests(SyncTestCase): # We renew the lease: result_of( - self.imm_client.add_or_renew_lease( + self.general_client.add_or_renew_lease( storage_index, lease_secret, lease_secret ) ) @@ -1092,7 +1093,7 @@ class ImmutableHTTPAPITests(SyncTestCase): # We create a new lease: lease_secret2 = urandom(32) result_of( - self.imm_client.add_or_renew_lease( + self.general_client.add_or_renew_lease( storage_index, lease_secret2, lease_secret2 ) ) @@ -1108,7 +1109,7 @@ class ImmutableHTTPAPITests(SyncTestCase): storage_index = urandom(16) secret = b"A" * 32 with assert_fails_with_http_code(self, http.NOT_FOUND): - result_of(self.imm_client.add_or_renew_lease(storage_index, secret, secret)) + result_of(self.general_client.add_or_renew_lease(storage_index, secret, secret)) def test_advise_corrupt_share(self): """