From 07c439a7f294711f843d4522b6f4483e56610f2c Mon Sep 17 00:00:00 2001 From: Yaroslava Lukoyanova Date: Tue, 8 Aug 2023 14:33:26 +0300 Subject: [PATCH] Moved deprecated HTTP GW test cases to separate directory --- .../services/http_gw}/test_http_bearer.py | 0 .../services/http_gw/test_http_gate.py | 350 ++++++++++++++++++ .../services/http_gw}/test_http_headers.py | 3 +- .../services/http_gw}/test_http_streaming.py | 2 +- .../http_gw}/test_http_system_header.py | 0 .../services/http_gate/test_http_gate.py | 306 --------------- 6 files changed, 352 insertions(+), 309 deletions(-) rename pytest_tests/{testsuites/services/http_gate => deprecated_testsuites/services/http_gw}/test_http_bearer.py (100%) create mode 100644 pytest_tests/deprecated_testsuites/services/http_gw/test_http_gate.py rename pytest_tests/{testsuites/services/http_gate => deprecated_testsuites/services/http_gw}/test_http_headers.py (98%) rename pytest_tests/{testsuites/services/http_gate => deprecated_testsuites/services/http_gw}/test_http_streaming.py (97%) rename pytest_tests/{testsuites/services/http_gate => deprecated_testsuites/services/http_gw}/test_http_system_header.py (100%) diff --git a/pytest_tests/testsuites/services/http_gate/test_http_bearer.py b/pytest_tests/deprecated_testsuites/services/http_gw/test_http_bearer.py similarity index 100% rename from pytest_tests/testsuites/services/http_gate/test_http_bearer.py rename to pytest_tests/deprecated_testsuites/services/http_gw/test_http_bearer.py diff --git a/pytest_tests/deprecated_testsuites/services/http_gw/test_http_gate.py b/pytest_tests/deprecated_testsuites/services/http_gw/test_http_gate.py new file mode 100644 index 00000000..aecc897b --- /dev/null +++ b/pytest_tests/deprecated_testsuites/services/http_gw/test_http_gate.py @@ -0,0 +1,350 @@ +import os + +import allure +import pytest +from frostfs_testlib.resources.wellknown_acl import PUBLIC_ACL +from frostfs_testlib.steps.cli.container import create_container +from frostfs_testlib.steps.cli.object import put_object_to_random_node +from frostfs_testlib.steps.epoch import get_epoch +from frostfs_testlib.steps.http.http_gate import ( + attr_into_header, + get_object_by_attr_and_verify_hashes, + get_via_http_curl, + get_via_http_gate, + get_via_zip_http_gate, + try_to_get_object_and_expect_error, + upload_via_http_gate, + upload_via_http_gate_curl, + verify_object_hash, +) +from frostfs_testlib.storage.dataclasses.object_size import ObjectSize +from frostfs_testlib.testing.cluster_test_base import ClusterTestBase +from frostfs_testlib.utils.file_utils import generate_file, get_file_hash + +from pytest_tests.helpers.utility import wait_for_gc_pass_on_storage_nodes + +OBJECT_NOT_FOUND_ERROR = "not found" + + +@allure.link( + "https://github.com/TrueCloudLab/frostfs-http-gw#frostfs-http-gateway", + name="frostfs-http-gateway", +) +@allure.link("https://github.com/TrueCloudLab/frostfs-http-gw#uploading", name="uploading") +@allure.link("https://github.com/TrueCloudLab/frostfs-http-gw#downloading", name="downloading") +@pytest.mark.sanity +@pytest.mark.http_gate +class TestHttpGate(ClusterTestBase): + PLACEMENT_RULE_1 = "REP 1 IN X CBF 1 SELECT 1 FROM * AS X" + PLACEMENT_RULE_2 = "REP 2 IN X CBF 2 SELECT 2 FROM * AS X" + + @pytest.fixture(scope="class", autouse=True) + @allure.title("[Class/Autouse]: Prepare wallet and deposit") + def prepare_wallet(self, default_wallet): + TestHttpGate.wallet = default_wallet + + @allure.link("https://github.com/TrueCloudLab/frostfs-http-gw#uploading", name="uploading") + @allure.link("https://github.com/TrueCloudLab/frostfs-http-gw#downloading", name="downloading") + @allure.title("Put over HTTP, Get over HTTP") + @pytest.mark.skip("Skipped due to deprecated PUT via http") + @pytest.mark.smoke + def test_put_http_get_http( + self, complex_object_size: ObjectSize, simple_object_size: ObjectSize + ): + """ + Test that object can be put and get using HTTP interface. + + Steps: + 1. Create simple and large objects. + 2. Upload objects using HTTP (https://github.com/TrueCloudLab/frostfs-http-gw#uploading). + 3. Download objects using HTTP gate (https://github.com/TrueCloudLab/frostfs-http-gw#downloading). + 4. Compare hashes for got and original objects. + + Expected result: + Hashes must be the same. + """ + cid = create_container( + self.wallet, + shell=self.shell, + endpoint=self.cluster.default_rpc_endpoint, + rule=self.PLACEMENT_RULE_2, + basic_acl=PUBLIC_ACL, + ) + file_path_simple = generate_file(simple_object_size.value) + file_path_large = generate_file(complex_object_size.value) + + with allure.step("Put objects using HTTP"): + oid_simple = upload_via_http_gate( + cid=cid, path=file_path_simple, endpoint=self.cluster.default_http_gate_endpoint + ) + oid_large = upload_via_http_gate( + cid=cid, path=file_path_large, endpoint=self.cluster.default_http_gate_endpoint + ) + + for oid, file_path in ((oid_simple, file_path_simple), (oid_large, file_path_large)): + verify_object_hash( + oid=oid, + file_name=file_path, + wallet=self.wallet, + cid=cid, + shell=self.shell, + nodes=self.cluster.storage_nodes, + endpoint=self.cluster.default_http_gate_endpoint, + hostname=self.cluster.default_http_hostname, + ) + + @allure.link( + "https://github.com/TrueCloudLab/frostfs-http-gw#by-attributes", + name="download by attributes", + ) + @pytest.mark.skip("Skipped due to deprecated PUT via http") + @allure.title("Put over HTTP, Get over HTTP with header") + @pytest.mark.parametrize( + "attributes", + [ + {"fileName": "simple_obj_filename"}, + {"file-Name": "simple obj filename"}, + {"cat%jpeg": "cat%jpeg"}, + ], + ids=["simple", "hyphen", "percent"], + ) + def test_put_http_get_http_with_headers( + self, attributes: dict, simple_object_size: ObjectSize, request: pytest.FixtureRequest + ): + """ + Test that object can be downloaded using different attributes in HTTP header. + + Steps: + 1. Create simple and large objects. + 2. Upload objects using HTTP with particular attributes in the header. + 3. Download objects by attributes using HTTP gate (https://github.com/TrueCloudLab/frostfs-http-gw#by-attributes). + 4. Compare hashes for got and original objects. + + Expected result: + Hashes must be the same. + """ + allure.dynamic.title(f"Put over HTTP, Get over HTTP with {request.node.callspec.id} header") + cid = create_container( + self.wallet, + shell=self.shell, + endpoint=self.cluster.default_rpc_endpoint, + rule=self.PLACEMENT_RULE_2, + basic_acl=PUBLIC_ACL, + ) + file_path = generate_file(simple_object_size.value) + + with allure.step("Put objects using HTTP with attribute"): + headers = attr_into_header(attributes) + oid = upload_via_http_gate( + cid=cid, + path=file_path, + headers=headers, + endpoint=self.cluster.default_http_gate_endpoint, + ) + + get_object_by_attr_and_verify_hashes( + oid=oid, + file_name=file_path, + cid=cid, + attrs=attributes, + endpoint=self.cluster.default_http_gate_endpoint, + http_hostname=self.cluster.default_http_hostname, + ) + + @pytest.mark.skip("Skipped due to deprecated PUT via http") + @allure.title("Test Expiration-Epoch in HTTP header with epoch_gap={epoch_gap}") + @pytest.mark.parametrize("epoch_gap", [0, 1]) + def test_expiration_epoch_in_http(self, simple_object_size: ObjectSize, epoch_gap: int): + endpoint = self.cluster.default_rpc_endpoint + http_endpoint = self.cluster.default_http_gate_endpoint + min_valid_epoch = get_epoch(self.shell, self.cluster) + epoch_gap + + cid = create_container( + self.wallet, + shell=self.shell, + endpoint=endpoint, + rule=self.PLACEMENT_RULE_2, + basic_acl=PUBLIC_ACL, + ) + file_path = generate_file(simple_object_size.value) + oids_to_be_expired = [] + oids_to_be_valid = [] + + for gap_until in (0, 1, 2, 100): + valid_until = min_valid_epoch + gap_until + headers = {"X-Attribute-System-Expiration-Epoch": str(valid_until)} + + with allure.step("Put objects using HTTP with attribute Expiration-Epoch"): + oid = upload_via_http_gate( + cid=cid, + path=file_path, + headers=headers, + endpoint=http_endpoint, + http_hostname=self.cluster.default_http_hostname, + ) + if get_epoch(self.shell, self.cluster) + 1 <= valid_until: + oids_to_be_valid.append(oid) + else: + oids_to_be_expired.append(oid) + with allure.step("This object can be got"): + get_via_http_gate( + cid=cid, + oid=oid, + endpoint=http_endpoint, + http_hostname=self.cluster.default_http_hostname, + ) + + self.tick_epoch() + + # Wait for GC, because object with expiration is counted as alive until GC removes it + wait_for_gc_pass_on_storage_nodes() + + for oid in oids_to_be_expired: + with allure.step(f"{oid} shall be expired and cannot be got"): + try_to_get_object_and_expect_error( + cid=cid, + oid=oid, + error_pattern=OBJECT_NOT_FOUND_ERROR, + endpoint=self.cluster.default_http_gate_endpoint, + http_hostname=self.cluster.default_http_hostname, + ) + for oid in oids_to_be_valid: + with allure.step(f"{oid} shall be valid and can be got"): + get_via_http_gate( + cid=cid, + oid=oid, + endpoint=http_endpoint, + http_hostname=self.cluster.default_http_hostname, + ) + + @pytest.mark.skip("Skipped due to deprecated PUT via http") + @allure.title("Test Zip in HTTP header") + def test_zip_in_http(self, complex_object_size: ObjectSize, simple_object_size: ObjectSize): + cid = create_container( + self.wallet, + shell=self.shell, + endpoint=self.cluster.default_rpc_endpoint, + rule=self.PLACEMENT_RULE_2, + basic_acl=PUBLIC_ACL, + ) + file_path_simple = generate_file(simple_object_size.value) + file_path_large = generate_file(complex_object_size.value) + common_prefix = "my_files" + + headers1 = {"X-Attribute-FilePath": f"{common_prefix}/file1"} + headers2 = {"X-Attribute-FilePath": f"{common_prefix}/file2"} + + upload_via_http_gate( + cid=cid, + path=file_path_simple, + headers=headers1, + endpoint=self.cluster.default_http_gate_endpoint, + ) + upload_via_http_gate( + cid=cid, + path=file_path_large, + headers=headers2, + endpoint=self.cluster.default_http_gate_endpoint, + ) + + dir_path = get_via_zip_http_gate( + cid=cid, + prefix=common_prefix, + endpoint=self.cluster.default_http_gate_endpoint, + http_hostname=self.cluster.default_http_hostname, + ) + + with allure.step("Verify hashes"): + assert get_file_hash(f"{dir_path}/file1") == get_file_hash(file_path_simple) + assert get_file_hash(f"{dir_path}/file2") == get_file_hash(file_path_large) + + @pytest.mark.long + @pytest.mark.skip("Skipped due to deprecated PUT via http") + @allure.title("Put over HTTP/Curl, Get over HTTP/Curl for large object") + def test_put_http_get_http_large_file(self, complex_object_size: ObjectSize): + """ + This test checks upload and download using curl with 'large' object. + Large is object with size up to 20Mb. + """ + cid = create_container( + self.wallet, + shell=self.shell, + endpoint=self.cluster.default_rpc_endpoint, + rule=self.PLACEMENT_RULE_2, + basic_acl=PUBLIC_ACL, + ) + + file_path = generate_file(complex_object_size.value) + + with allure.step("Put objects using HTTP"): + oid_gate = upload_via_http_gate( + cid=cid, path=file_path, endpoint=self.cluster.default_http_gate_endpoint + ) + oid_curl = upload_via_http_gate_curl( + cid=cid, + filepath=file_path, + endpoint=self.cluster.default_http_gate_endpoint, + ) + + verify_object_hash( + oid=oid_gate, + file_name=file_path, + wallet=self.wallet, + cid=cid, + shell=self.shell, + nodes=self.cluster.storage_nodes, + endpoint=self.cluster.default_http_gate_endpoint, + hostname=self.cluster.default_http_hostname, + ) + verify_object_hash( + oid=oid_curl, + file_name=file_path, + wallet=self.wallet, + cid=cid, + shell=self.shell, + nodes=self.cluster.storage_nodes, + endpoint=self.cluster.default_http_gate_endpoint, + http_hostname=self.cluster.default_http_hostname, + object_getter=get_via_http_curl, + ) + + @pytest.mark.skip("Skipped due to deprecated PUT via http") + @allure.title("Put/Get over HTTP using Curl utility") + def test_put_http_get_http_curl( + self, complex_object_size: ObjectSize, simple_object_size: ObjectSize + ): + """ + Test checks upload and download over HTTP using curl utility. + """ + cid = create_container( + self.wallet, + shell=self.shell, + endpoint=self.cluster.default_rpc_endpoint, + rule=self.PLACEMENT_RULE_2, + basic_acl=PUBLIC_ACL, + ) + file_path_simple = generate_file(simple_object_size.value) + file_path_large = generate_file(complex_object_size.value) + + with allure.step("Put objects using curl utility"): + oid_simple = upload_via_http_gate_curl( + cid=cid, filepath=file_path_simple, endpoint=self.cluster.default_http_gate_endpoint + ) + oid_large = upload_via_http_gate_curl( + cid=cid, + filepath=file_path_large, + endpoint=self.cluster.default_http_gate_endpoint, + ) + + for oid, file_path in ((oid_simple, file_path_simple), (oid_large, file_path_large)): + verify_object_hash( + oid=oid, + file_name=file_path, + wallet=self.wallet, + cid=cid, + shell=self.shell, + nodes=self.cluster.storage_nodes, + endpoint=self.cluster.default_http_gate_endpoint, + http_hostname=self.cluster.default_http_hostname, + object_getter=get_via_http_curl, + ) diff --git a/pytest_tests/testsuites/services/http_gate/test_http_headers.py b/pytest_tests/deprecated_testsuites/services/http_gw/test_http_headers.py similarity index 98% rename from pytest_tests/testsuites/services/http_gate/test_http_headers.py rename to pytest_tests/deprecated_testsuites/services/http_gw/test_http_headers.py index 4d10085e..88248f90 100644 --- a/pytest_tests/testsuites/services/http_gate/test_http_headers.py +++ b/pytest_tests/deprecated_testsuites/services/http_gw/test_http_headers.py @@ -30,6 +30,7 @@ logger = logging.getLogger("NeoLogger") @pytest.mark.sanity @pytest.mark.http_gate +@pytest.mark.skip("Skipped due to deprecated PUT via http") class Test_http_headers(ClusterTestBase): PLACEMENT_RULE = "REP 2 IN X CBF 1 SELECT 4 FROM * AS X" obj1_keys = ["Writer", "Chapter1", "Chapter2"] @@ -85,7 +86,6 @@ class Test_http_headers(ClusterTestBase): yield storage_objects - @pytest.mark.skip("Skipped due to deprecated PUT via http") @allure.title("Get object1 by attribute") def test_object1_can_be_get_by_attr( self, storage_objects_with_attributes: list[StorageObjectInfo] @@ -175,7 +175,6 @@ class Test_http_headers(ClusterTestBase): ) @allure.title("[NEGATIVE] Put object and get right after container is deleted") - @pytest.mark.skip("Skipped due to deprecated PUT via http") def test_negative_put_and_get_object3( self, storage_objects_with_attributes: list[StorageObjectInfo] ): diff --git a/pytest_tests/testsuites/services/http_gate/test_http_streaming.py b/pytest_tests/deprecated_testsuites/services/http_gw/test_http_streaming.py similarity index 97% rename from pytest_tests/testsuites/services/http_gate/test_http_streaming.py rename to pytest_tests/deprecated_testsuites/services/http_gw/test_http_streaming.py index fdd94773..38f75a20 100644 --- a/pytest_tests/testsuites/services/http_gate/test_http_streaming.py +++ b/pytest_tests/deprecated_testsuites/services/http_gw/test_http_streaming.py @@ -14,6 +14,7 @@ logger = logging.getLogger("NeoLogger") @pytest.mark.sanity @pytest.mark.http_gate +@pytest.mark.skip("Skipped due to deprecated PUT via http") class Test_http_streaming(ClusterTestBase): PLACEMENT_RULE = "REP 2 IN X CBF 1 SELECT 4 FROM * AS X" @@ -28,7 +29,6 @@ class Test_http_streaming(ClusterTestBase): [pytest.lazy_fixture("complex_object_size")], ids=["complex object size"], ) - @pytest.mark.skip("Skipped due to deprecated PUT via http") def test_object_can_be_put_get_by_streaming(self, object_size: ObjectSize): """ Test that object can be put using gRPC interface and get using HTTP. diff --git a/pytest_tests/testsuites/services/http_gate/test_http_system_header.py b/pytest_tests/deprecated_testsuites/services/http_gw/test_http_system_header.py similarity index 100% rename from pytest_tests/testsuites/services/http_gate/test_http_system_header.py rename to pytest_tests/deprecated_testsuites/services/http_gw/test_http_system_header.py diff --git a/pytest_tests/testsuites/services/http_gate/test_http_gate.py b/pytest_tests/testsuites/services/http_gate/test_http_gate.py index 6e7653d8..9625a11d 100644 --- a/pytest_tests/testsuites/services/http_gate/test_http_gate.py +++ b/pytest_tests/testsuites/services/http_gate/test_http_gate.py @@ -98,309 +98,3 @@ class TestHttpGate(ClusterTestBase): endpoint=self.cluster.default_http_gate_endpoint, http_hostname=self.cluster.default_http_hostname, ) - - @allure.link("https://github.com/TrueCloudLab/frostfs-http-gw#uploading", name="uploading") - @allure.link("https://github.com/TrueCloudLab/frostfs-http-gw#downloading", name="downloading") - @allure.title("Put over HTTP, Get over HTTP") - @pytest.mark.skip("Skipped due to deprecated PUT via http") - @pytest.mark.smoke - def test_put_http_get_http( - self, complex_object_size: ObjectSize, simple_object_size: ObjectSize - ): - """ - Test that object can be put and get using HTTP interface. - - Steps: - 1. Create simple and large objects. - 2. Upload objects using HTTP (https://github.com/TrueCloudLab/frostfs-http-gw#uploading). - 3. Download objects using HTTP gate (https://github.com/TrueCloudLab/frostfs-http-gw#downloading). - 4. Compare hashes for got and original objects. - - Expected result: - Hashes must be the same. - """ - cid = create_container( - self.wallet, - shell=self.shell, - endpoint=self.cluster.default_rpc_endpoint, - rule=self.PLACEMENT_RULE_2, - basic_acl=PUBLIC_ACL, - ) - file_path_simple = generate_file(simple_object_size.value) - file_path_large = generate_file(complex_object_size.value) - - with allure.step("Put objects using HTTP"): - oid_simple = upload_via_http_gate( - cid=cid, path=file_path_simple, endpoint=self.cluster.default_http_gate_endpoint - ) - oid_large = upload_via_http_gate( - cid=cid, path=file_path_large, endpoint=self.cluster.default_http_gate_endpoint - ) - - for oid, file_path in ((oid_simple, file_path_simple), (oid_large, file_path_large)): - verify_object_hash( - oid=oid, - file_name=file_path, - wallet=self.wallet, - cid=cid, - shell=self.shell, - nodes=self.cluster.storage_nodes, - endpoint=self.cluster.default_http_gate_endpoint, - hostname=self.cluster.default_http_hostname, - ) - - @allure.link( - "https://github.com/TrueCloudLab/frostfs-http-gw#by-attributes", - name="download by attributes", - ) - @pytest.mark.skip("Skipped due to deprecated PUT via http") - @allure.title("Put over HTTP, Get over HTTP with header") - @pytest.mark.parametrize( - "attributes", - [ - {"fileName": "simple_obj_filename"}, - {"file-Name": "simple obj filename"}, - {"cat%jpeg": "cat%jpeg"}, - ], - ids=["simple", "hyphen", "percent"], - ) - def test_put_http_get_http_with_headers( - self, attributes: dict, simple_object_size: ObjectSize, request: pytest.FixtureRequest - ): - """ - Test that object can be downloaded using different attributes in HTTP header. - - Steps: - 1. Create simple and large objects. - 2. Upload objects using HTTP with particular attributes in the header. - 3. Download objects by attributes using HTTP gate (https://github.com/TrueCloudLab/frostfs-http-gw#by-attributes). - 4. Compare hashes for got and original objects. - - Expected result: - Hashes must be the same. - """ - allure.dynamic.title(f"Put over HTTP, Get over HTTP with {request.node.callspec.id} header") - cid = create_container( - self.wallet, - shell=self.shell, - endpoint=self.cluster.default_rpc_endpoint, - rule=self.PLACEMENT_RULE_2, - basic_acl=PUBLIC_ACL, - ) - file_path = generate_file(simple_object_size.value) - - with allure.step("Put objects using HTTP with attribute"): - headers = attr_into_header(attributes) - oid = upload_via_http_gate( - cid=cid, - path=file_path, - headers=headers, - endpoint=self.cluster.default_http_gate_endpoint, - ) - - get_object_by_attr_and_verify_hashes( - oid=oid, - file_name=file_path, - cid=cid, - attrs=attributes, - endpoint=self.cluster.default_http_gate_endpoint, - http_hostname=self.cluster.default_http_hostname, - ) - - @pytest.mark.skip("Skipped due to deprecated PUT via http") - @allure.title("Test Expiration-Epoch in HTTP header with epoch_gap={epoch_gap}") - @pytest.mark.parametrize("epoch_gap", [0, 1]) - def test_expiration_epoch_in_http(self, simple_object_size: ObjectSize, epoch_gap: int): - endpoint = self.cluster.default_rpc_endpoint - http_endpoint = self.cluster.default_http_gate_endpoint - min_valid_epoch = get_epoch(self.shell, self.cluster) + epoch_gap - - cid = create_container( - self.wallet, - shell=self.shell, - endpoint=endpoint, - rule=self.PLACEMENT_RULE_2, - basic_acl=PUBLIC_ACL, - ) - file_path = generate_file(simple_object_size.value) - oids_to_be_expired = [] - oids_to_be_valid = [] - - for gap_until in (0, 1, 2, 100): - valid_until = min_valid_epoch + gap_until - headers = {"X-Attribute-System-Expiration-Epoch": str(valid_until)} - - with allure.step("Put objects using HTTP with attribute Expiration-Epoch"): - oid = upload_via_http_gate( - cid=cid, - path=file_path, - headers=headers, - endpoint=http_endpoint, - http_hostname=self.cluster.default_http_hostname, - ) - if get_epoch(self.shell, self.cluster) + 1 <= valid_until: - oids_to_be_valid.append(oid) - else: - oids_to_be_expired.append(oid) - with allure.step("This object can be got"): - get_via_http_gate( - cid=cid, - oid=oid, - endpoint=http_endpoint, - http_hostname=self.cluster.default_http_hostname, - ) - - self.tick_epoch() - - # Wait for GC, because object with expiration is counted as alive until GC removes it - wait_for_gc_pass_on_storage_nodes() - - for oid in oids_to_be_expired: - with allure.step(f"{oid} shall be expired and cannot be got"): - try_to_get_object_and_expect_error( - cid=cid, - oid=oid, - error_pattern=OBJECT_NOT_FOUND_ERROR, - endpoint=self.cluster.default_http_gate_endpoint, - http_hostname=self.cluster.default_http_hostname, - ) - for oid in oids_to_be_valid: - with allure.step(f"{oid} shall be valid and can be got"): - get_via_http_gate( - cid=cid, - oid=oid, - endpoint=http_endpoint, - http_hostname=self.cluster.default_http_hostname, - ) - - @pytest.mark.skip("Skipped due to deprecated PUT via http") - @allure.title("Test Zip in HTTP header") - def test_zip_in_http(self, complex_object_size: ObjectSize, simple_object_size: ObjectSize): - cid = create_container( - self.wallet, - shell=self.shell, - endpoint=self.cluster.default_rpc_endpoint, - rule=self.PLACEMENT_RULE_2, - basic_acl=PUBLIC_ACL, - ) - file_path_simple = generate_file(simple_object_size.value) - file_path_large = generate_file(complex_object_size.value) - common_prefix = "my_files" - - headers1 = {"X-Attribute-FilePath": f"{common_prefix}/file1"} - headers2 = {"X-Attribute-FilePath": f"{common_prefix}/file2"} - - upload_via_http_gate( - cid=cid, - path=file_path_simple, - headers=headers1, - endpoint=self.cluster.default_http_gate_endpoint, - ) - upload_via_http_gate( - cid=cid, - path=file_path_large, - headers=headers2, - endpoint=self.cluster.default_http_gate_endpoint, - ) - - dir_path = get_via_zip_http_gate( - cid=cid, - prefix=common_prefix, - endpoint=self.cluster.default_http_gate_endpoint, - http_hostname=self.cluster.default_http_hostname, - ) - - with allure.step("Verify hashes"): - assert get_file_hash(f"{dir_path}/file1") == get_file_hash(file_path_simple) - assert get_file_hash(f"{dir_path}/file2") == get_file_hash(file_path_large) - - @pytest.mark.long - @pytest.mark.skip("Skipped due to deprecated PUT via http") - @allure.title("Put over HTTP/Curl, Get over HTTP/Curl for large object") - def test_put_http_get_http_large_file(self, complex_object_size: ObjectSize): - """ - This test checks upload and download using curl with 'large' object. - Large is object with size up to 20Mb. - """ - cid = create_container( - self.wallet, - shell=self.shell, - endpoint=self.cluster.default_rpc_endpoint, - rule=self.PLACEMENT_RULE_2, - basic_acl=PUBLIC_ACL, - ) - - file_path = generate_file(complex_object_size.value) - - with allure.step("Put objects using HTTP"): - oid_gate = upload_via_http_gate( - cid=cid, path=file_path, endpoint=self.cluster.default_http_gate_endpoint - ) - oid_curl = upload_via_http_gate_curl( - cid=cid, - filepath=file_path, - endpoint=self.cluster.default_http_gate_endpoint, - ) - - verify_object_hash( - oid=oid_gate, - file_name=file_path, - wallet=self.wallet, - cid=cid, - shell=self.shell, - nodes=self.cluster.storage_nodes, - endpoint=self.cluster.default_http_gate_endpoint, - hostname=self.cluster.default_http_hostname, - ) - verify_object_hash( - oid=oid_curl, - file_name=file_path, - wallet=self.wallet, - cid=cid, - shell=self.shell, - nodes=self.cluster.storage_nodes, - endpoint=self.cluster.default_http_gate_endpoint, - http_hostname=self.cluster.default_http_hostname, - object_getter=get_via_http_curl, - ) - - @pytest.mark.skip("Skipped due to deprecated PUT via http") - @allure.title("Put/Get over HTTP using Curl utility") - def test_put_http_get_http_curl( - self, complex_object_size: ObjectSize, simple_object_size: ObjectSize - ): - """ - Test checks upload and download over HTTP using curl utility. - """ - cid = create_container( - self.wallet, - shell=self.shell, - endpoint=self.cluster.default_rpc_endpoint, - rule=self.PLACEMENT_RULE_2, - basic_acl=PUBLIC_ACL, - ) - file_path_simple = generate_file(simple_object_size.value) - file_path_large = generate_file(complex_object_size.value) - - with allure.step("Put objects using curl utility"): - oid_simple = upload_via_http_gate_curl( - cid=cid, filepath=file_path_simple, endpoint=self.cluster.default_http_gate_endpoint - ) - oid_large = upload_via_http_gate_curl( - cid=cid, - filepath=file_path_large, - endpoint=self.cluster.default_http_gate_endpoint, - ) - - for oid, file_path in ((oid_simple, file_path_simple), (oid_large, file_path_large)): - verify_object_hash( - oid=oid, - file_name=file_path, - wallet=self.wallet, - cid=cid, - shell=self.shell, - nodes=self.cluster.storage_nodes, - endpoint=self.cluster.default_http_gate_endpoint, - http_hostname=self.cluster.default_http_hostname, - object_getter=get_via_http_curl, - )