import logging import allure import pytest from frostfs_testlib.resources.common import PUBLIC_ACL from pytest_tests.helpers.container import create_container from pytest_tests.helpers.file_helper import generate_file from pytest_tests.helpers.http_gate import get_object_and_verify_hashes, upload_via_http_gate_curl from pytest_tests.steps.cluster_test_base import ClusterTestBase logger = logging.getLogger("NeoLogger") @pytest.mark.sanity @pytest.mark.http_gate class Test_http_streaming(ClusterTestBase): PLACEMENT_RULE = "REP 2 IN X CBF 1 SELECT 4 FROM * AS X" @pytest.fixture(scope="class", autouse=True) @allure.title("[Class/Autouse]: Prepare wallet and deposit") def prepare_wallet(self, default_wallet): Test_http_streaming.wallet = default_wallet @allure.title("Test Put via pipe (steaming), Get over HTTP and verify hashes") @pytest.mark.parametrize( "object_size", [pytest.lazy_fixture("complex_object_size")], ids=["complex object"], ) def test_object_can_be_put_get_by_streaming(self, object_size: int): """ Test that object can be put using gRPC interface and get using HTTP. Steps: 1. Create big object; 2. Put object using curl with pipe (streaming); 3. Download object using HTTP gate (https://github.com/TrueCloudLab/frostfs-http-gw#downloading); 4. Compare hashes between original and downloaded object; Expected result: Hashes must be the same. """ with allure.step("Create public container and verify container creation"): cid = create_container( self.wallet, shell=self.shell, endpoint=self.cluster.default_rpc_endpoint, rule=self.PLACEMENT_RULE, basic_acl=PUBLIC_ACL, ) with allure.step("Allocate big object"): # Generate file file_path = generate_file(object_size) with allure.step( "Put objects using curl utility and Get object and verify hashes [ get/$CID/$OID ]" ): oid = upload_via_http_gate_curl( cid=cid, filepath=file_path, endpoint=self.cluster.default_http_gate_endpoint ) get_object_and_verify_hashes( 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, )