Setup HTTP lease APIs for immutables too.

This commit is contained in:
Itamar Turner-Trauring 2022-05-11 12:00:27 -04:00
parent b8735c79da
commit f3cf13154d
5 changed files with 31 additions and 36 deletions

View File

@ -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,

View File

@ -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.

View File

@ -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

View File

@ -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",
}

View File

@ -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):
"""