[#261] Update nested test to check keys
Some checks reported warnings
DCO check / Commits Check (pull_request) Has been cancelled
Some checks reported warnings
DCO check / Commits Check (pull_request) Has been cancelled
Signed-off-by: a.berezin <a.berezin@yadro.com>
This commit is contained in:
parent
5ec844417a
commit
cc440f9c12
3 changed files with 36 additions and 23 deletions
|
@ -62,10 +62,10 @@ class TestS3GateBucket:
|
||||||
|
|
||||||
s3_client.head_bucket(bucket_1)
|
s3_client.head_bucket(bucket_1)
|
||||||
|
|
||||||
with reporter.step(f"Delete empty bucket {bucket_2}"):
|
with reporter.step("Delete empty bucket_2"):
|
||||||
s3_client.delete_bucket(bucket_2)
|
s3_client.delete_bucket(bucket_2)
|
||||||
|
|
||||||
with reporter.step(f"Check bucket {bucket_2} deleted"):
|
with reporter.step("Check bucket_2 is deleted"):
|
||||||
with pytest.raises(Exception, match=r".*Not Found.*"):
|
with pytest.raises(Exception, match=r".*Not Found.*"):
|
||||||
s3_client.head_bucket(bucket_2)
|
s3_client.head_bucket(bucket_2)
|
||||||
|
|
||||||
|
@ -73,14 +73,14 @@ class TestS3GateBucket:
|
||||||
assert bucket_1 in buckets, f"Expected bucket {bucket_1} is in the list"
|
assert bucket_1 in buckets, f"Expected bucket {bucket_1} is in the list"
|
||||||
assert bucket_2 not in buckets, f"Expected bucket {bucket_2} is not in the list"
|
assert bucket_2 not in buckets, f"Expected bucket {bucket_2} is not in the list"
|
||||||
|
|
||||||
with reporter.step(f"Delete object from {bucket_1}"):
|
with reporter.step("Delete object from bucket_1"):
|
||||||
s3_client.delete_object(bucket_1, file_name, version_id)
|
s3_client.delete_object(bucket_1, file_name, version_id)
|
||||||
s3_helper.check_objects_in_bucket(s3_client, bucket_1, expected_objects=[])
|
s3_helper.check_objects_in_bucket(s3_client, bucket_1, expected_objects=[])
|
||||||
|
|
||||||
with reporter.step(f"Delete bucket {bucket_1}"):
|
with reporter.step("Delete bucket_1"):
|
||||||
s3_client.delete_bucket(bucket_1)
|
s3_client.delete_bucket(bucket_1)
|
||||||
|
|
||||||
with reporter.step(f"Check bucket {bucket_1} deleted"):
|
with reporter.step("Check bucket_1 deleted"):
|
||||||
with pytest.raises(Exception, match=r".*Not Found.*"):
|
with pytest.raises(Exception, match=r".*Not Found.*"):
|
||||||
s3_client.head_bucket(bucket_1)
|
s3_client.head_bucket(bucket_1)
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,7 @@ from frostfs_testlib.steps.s3 import s3_helper
|
||||||
from frostfs_testlib.storage.dataclasses.object_size import ObjectSize
|
from frostfs_testlib.storage.dataclasses.object_size import ObjectSize
|
||||||
from frostfs_testlib.storage.dataclasses.wallet import WalletInfo
|
from frostfs_testlib.storage.dataclasses.wallet import WalletInfo
|
||||||
from frostfs_testlib.testing.cluster_test_base import ClusterTestBase
|
from frostfs_testlib.testing.cluster_test_base import ClusterTestBase
|
||||||
|
from frostfs_testlib.testing.test_control import wait_for_success
|
||||||
from frostfs_testlib.utils.file_utils import generate_file, get_file_hash, split_file
|
from frostfs_testlib.utils.file_utils import generate_file, get_file_hash, split_file
|
||||||
|
|
||||||
PART_SIZE = 5 * 1024 * 1024
|
PART_SIZE = 5 * 1024 * 1024
|
||||||
|
@ -68,11 +69,11 @@ class TestS3GateMultipart(ClusterTestBase):
|
||||||
with reporter.step("Delete the object"):
|
with reporter.step("Delete the object"):
|
||||||
s3_client.delete_object(bucket, object_key, version_id)
|
s3_client.delete_object(bucket, object_key, version_id)
|
||||||
|
|
||||||
with reporter.step("List objects in the bucket, expect to be empty"):
|
with reporter.step("There should be no objects in bucket"):
|
||||||
objects_list = s3_client.list_objects(bucket)
|
objects_list = s3_client.list_objects(bucket)
|
||||||
assert not objects_list, f"Expected empty bucket, got {objects_list}"
|
assert not objects_list, f"Expected empty bucket, got {objects_list}"
|
||||||
|
|
||||||
with reporter.step("List objects in the container via rpc, expect to be empty"):
|
with reporter.step("There should be no objects in container"):
|
||||||
objects = list_objects(default_wallet, self.shell, container_id, self.cluster.default_rpc_endpoint)
|
objects = list_objects(default_wallet, self.shell, container_id, self.cluster.default_rpc_endpoint)
|
||||||
assert len(objects) == 0, f"Expected no objects in container, got\n{objects}"
|
assert len(objects) == 0, f"Expected no objects in container, got\n{objects}"
|
||||||
|
|
||||||
|
@ -92,7 +93,7 @@ class TestS3GateMultipart(ClusterTestBase):
|
||||||
files_count = len(to_upload)
|
files_count = len(to_upload)
|
||||||
upload_key = "multipart_abort"
|
upload_key = "multipart_abort"
|
||||||
|
|
||||||
with reporter.step(f"Get related container_id for bucket '{bucket}'"):
|
with reporter.step("Get related container_id for bucket"):
|
||||||
for cluster_node in self.cluster.cluster_nodes:
|
for cluster_node in self.cluster.cluster_nodes:
|
||||||
container_id = search_container_by_name(bucket, cluster_node)
|
container_id = search_container_by_name(bucket, cluster_node)
|
||||||
if container_id:
|
if container_id:
|
||||||
|
@ -101,15 +102,15 @@ class TestS3GateMultipart(ClusterTestBase):
|
||||||
with reporter.step("Create multipart upload"):
|
with reporter.step("Create multipart upload"):
|
||||||
upload_id = s3_client.create_multipart_upload(bucket, upload_key)
|
upload_id = s3_client.create_multipart_upload(bucket, upload_key)
|
||||||
|
|
||||||
with reporter.step(f"Upload {files_count} files to multipart upload"):
|
with reporter.step(f"Upload {files_count} parts to multipart upload"):
|
||||||
for i, file in enumerate(to_upload, 1):
|
for i, file in enumerate(to_upload, 1):
|
||||||
s3_client.upload_part(bucket, upload_key, upload_id, i, file)
|
s3_client.upload_part(bucket, upload_key, upload_id, i, file)
|
||||||
|
|
||||||
with reporter.step(f"Check that we have {files_count} files in bucket"):
|
with reporter.step(f"There should be {files_count} objects in bucket"):
|
||||||
parts = s3_client.list_parts(bucket, upload_key, upload_id)
|
parts = s3_client.list_parts(bucket, upload_key, upload_id)
|
||||||
assert len(parts) == files_count, f"Expected {files_count} parts, got\n{parts}"
|
assert len(parts) == files_count, f"Expected {files_count} parts, got\n{parts}"
|
||||||
|
|
||||||
with reporter.step(f"Check that we have {files_count} files in container '{container_id}'"):
|
with reporter.step(f"There should be {files_count} objects in container"):
|
||||||
objects = list_objects(default_wallet, self.shell, container_id, self.cluster.default_rpc_endpoint)
|
objects = list_objects(default_wallet, self.shell, container_id, self.cluster.default_rpc_endpoint)
|
||||||
assert len(objects) == files_count, f"Expected {files_count} objects in container, got\n{objects}"
|
assert len(objects) == files_count, f"Expected {files_count} objects in container, got\n{objects}"
|
||||||
|
|
||||||
|
@ -118,14 +119,19 @@ class TestS3GateMultipart(ClusterTestBase):
|
||||||
uploads = s3_client.list_multipart_uploads(bucket)
|
uploads = s3_client.list_multipart_uploads(bucket)
|
||||||
assert not uploads, f"Expected no uploads in bucket {bucket}"
|
assert not uploads, f"Expected no uploads in bucket {bucket}"
|
||||||
|
|
||||||
with reporter.step("Check that we have no files in bucket since upload was aborted"):
|
with reporter.step("There should be no objects in bucket"):
|
||||||
with pytest.raises(Exception, match=self.NO_SUCH_UPLOAD):
|
with pytest.raises(Exception, match=self.NO_SUCH_UPLOAD):
|
||||||
s3_client.list_parts(bucket, upload_key, upload_id)
|
s3_client.list_parts(bucket, upload_key, upload_id)
|
||||||
|
|
||||||
with reporter.step("Check that we have no files in container since upload was aborted"):
|
with reporter.step("There should be no objects in container"):
|
||||||
|
|
||||||
|
@wait_for_success(120, 10)
|
||||||
|
def check_no_objects():
|
||||||
objects = list_objects(default_wallet, self.shell, container_id, self.cluster.default_rpc_endpoint)
|
objects = list_objects(default_wallet, self.shell, container_id, self.cluster.default_rpc_endpoint)
|
||||||
assert len(objects) == 0, f"Expected no objects in container, got\n{objects}"
|
assert len(objects) == 0, f"Expected no objects in container, got\n{objects}"
|
||||||
|
|
||||||
|
check_no_objects()
|
||||||
|
|
||||||
@allure.title("Upload Part Copy (s3_client={s3_client})")
|
@allure.title("Upload Part Copy (s3_client={s3_client})")
|
||||||
@pytest.mark.parametrize("versioning_status", [VersioningStatus.ENABLED], indirect=True)
|
@pytest.mark.parametrize("versioning_status", [VersioningStatus.ENABLED], indirect=True)
|
||||||
def test_s3_multipart_copy(self, s3_client: S3ClientWrapper, bucket: str):
|
def test_s3_multipart_copy(self, s3_client: S3ClientWrapper, bucket: str):
|
||||||
|
@ -159,6 +165,6 @@ class TestS3GateMultipart(ClusterTestBase):
|
||||||
s3_client.complete_multipart_upload(bucket, object_key, upload_id, parts)
|
s3_client.complete_multipart_upload(bucket, object_key, upload_id, parts)
|
||||||
assert len(got_parts) == len(part_files), f"Expected {parts_count} parts, got\n{got_parts}"
|
assert len(got_parts) == len(part_files), f"Expected {parts_count} parts, got\n{got_parts}"
|
||||||
|
|
||||||
with reporter.step("Check we can get whole object from bucket"):
|
with reporter.step("Get whole object from bucket"):
|
||||||
got_object = s3_client.get_object(bucket, object_key)
|
got_object = s3_client.get_object(bucket, object_key)
|
||||||
assert get_file_hash(got_object) == get_file_hash(file_name_large)
|
assert get_file_hash(got_object) == get_file_hash(file_name_large)
|
||||||
|
|
|
@ -884,17 +884,24 @@ class TestS3GateObject:
|
||||||
self,
|
self,
|
||||||
s3_client: S3ClientWrapper,
|
s3_client: S3ClientWrapper,
|
||||||
bucket: str,
|
bucket: str,
|
||||||
temp_directory,
|
|
||||||
simple_object_size: ObjectSize,
|
simple_object_size: ObjectSize,
|
||||||
):
|
):
|
||||||
path = "/".join(["".join(random.choices(string.ascii_letters, k=3)) for _ in range(10)])
|
key_characters_sample = string.ascii_letters + string.digits + "._-"
|
||||||
file_path_1 = TestFile(os.path.join(temp_directory, path, "test_file_1"))
|
|
||||||
generate_file_with_content(simple_object_size.value, file_path=file_path_1)
|
|
||||||
file_name = s3_helper.object_key_from_file_path(file_path_1)
|
|
||||||
|
|
||||||
with reporter.step("Put object"):
|
with reporter.step("Put object"):
|
||||||
s3_client.put_object(bucket, file_path_1)
|
test_file = generate_file(simple_object_size.value)
|
||||||
s3_helper.check_objects_in_bucket(s3_client, bucket, [file_name])
|
obj_key = (
|
||||||
|
"/"
|
||||||
|
+ "/".join(["".join(random.choices(key_characters_sample, k=5)) for _ in range(10)])
|
||||||
|
+ "/test_file_1"
|
||||||
|
)
|
||||||
|
s3_client.put_object(bucket, test_file, obj_key)
|
||||||
|
|
||||||
|
with reporter.step("Check object can be downloaded"):
|
||||||
|
s3_client.get_object(bucket, obj_key)
|
||||||
|
|
||||||
|
with reporter.step("Check object listing"):
|
||||||
|
s3_helper.check_objects_in_bucket(s3_client, bucket, [obj_key])
|
||||||
|
|
||||||
@allure.title("Delete non-existing object from empty bucket (s3_client={s3_client})")
|
@allure.title("Delete non-existing object from empty bucket (s3_client={s3_client})")
|
||||||
def test_s3_delete_non_existing_object(self, s3_client: S3ClientWrapper, bucket: str):
|
def test_s3_delete_non_existing_object(self, s3_client: S3ClientWrapper, bucket: str):
|
||||||
|
|
Loading…
Reference in a new issue