diff --git a/pytest_tests/testsuites/container/test_policy.py b/pytest_tests/testsuites/container/test_policy.py index 6efa4be2..e73b9d31 100644 --- a/pytest_tests/testsuites/container/test_policy.py +++ b/pytest_tests/testsuites/container/test_policy.py @@ -1,5 +1,6 @@ import allure import pytest +from frostfs_testlib import reporter from frostfs_testlib.resources.wellknown_acl import PUBLIC_ACL from frostfs_testlib.steps.cli.container import create_container, delete_container, get_container from frostfs_testlib.steps.cli.object import delete_object, put_object_to_random_node @@ -31,7 +32,7 @@ class TestPolicy(ClusterTestBase): """ placement_rule = "REP 1 IN SPB REP 1 in MSK CBF 1 SELECT 1 FROM SPBRU AS SPB SELECT 1 FROM MSKRU AS MSK FILTER SubDivCode EQ SPE AS SPBRU FILTER NOT (Country EQ Sweden OR CountryCode EQ FI) AND Location EQ Moskva AS MSKRU" endpoint = self.cluster.default_rpc_endpoint - with allure.step(f"Create container with policy {placement_rule}"): + with reporter.step(f"Create container with policy {placement_rule}"): with pytest.raises(Exception, match=NOT_PARSE_POLICY): cid = create_container( wallet=default_wallet, @@ -48,7 +49,7 @@ class TestPolicy(ClusterTestBase): """ placement_rule = "REP 2 IN RU SELECT 2 FROM RUS AS RU FILTER Country EQ Russia AND SubDivCode EQ SPE AS RUS" endpoint = self.cluster.default_rpc_endpoint - with allure.step(f"Create container with policy {placement_rule}"): + with reporter.step(f"Create container with policy {placement_rule}"): with pytest.raises(Exception, match=NOT_ENOUGH_TO_SELECT): cid = create_container( wallet=default_wallet, @@ -65,7 +66,7 @@ class TestPolicy(ClusterTestBase): """ placement_rule = "REP 2 IN HALF CBF 1 SELECT 2 FROM GT15 AS HALF FILTER @NOTRU AND Price GT 15 AS GT15 FILTER CountryCode NE RU AS NOTRU" endpoint = self.cluster.default_rpc_endpoint - with allure.step(f"Create container with policy {placement_rule}"): + with reporter.step(f"Create container with policy {placement_rule}"): with pytest.raises(Exception, match=NOT_FOUND_FILTER): cid = create_container( wallet=default_wallet, @@ -82,7 +83,7 @@ class TestPolicy(ClusterTestBase): """ placement_rule = "REP 2 IN HALFIC CBF 1 SELECT 2 FROM GT15 AS HALF FILTER Price GT 15 AS GT15" endpoint = self.cluster.default_rpc_endpoint - with allure.step(f"Create container with policy {placement_rule}"): + with reporter.step(f"Create container with policy {placement_rule}"): with pytest.raises(Exception, match=NOT_FOUND_SELECTOR): cid = create_container( wallet=default_wallet, @@ -107,27 +108,27 @@ class TestPolicy(ClusterTestBase): expected_copies = 1 endpoint = self.cluster.default_rpc_endpoint - with allure.step(f"Create container with policy {placement_rule}"): + with reporter.step(f"Create container with policy {placement_rule}"): cid = create_container( wallet=default_wallet, rule=placement_rule, basic_acl=PUBLIC_ACL, shell=self.shell, endpoint=endpoint ) - with allure.step(f"Check container policy"): + with reporter.step(f"Check container policy"): self.validate_object_policy(default_wallet, placement_rule, cid, endpoint) - with allure.step(f"Put object in container"): + with reporter.step(f"Put object in container"): oid = put_object_to_random_node(default_wallet, file_path, cid, shell=self.shell, cluster=self.cluster) - with allure.step(f"Check object expected copies"): + with reporter.step(f"Check object expected copies"): resulting_copies = get_nodes_with_object(cid, oid, shell=self.shell, nodes=self.cluster.storage_nodes) assert ( len(resulting_copies) == expected_copies ), f"Expected {expected_copies} copies, got {len(resulting_copies)}" - with allure.step(f"Delete the object from the container"): + with reporter.step(f"Delete the object from the container"): delete_object(wallet=default_wallet, cid=cid, oid=oid, shell=self.shell, endpoint=endpoint) - with allure.step(f"Delete the container"): + with reporter.step(f"Delete the container"): delete_container(wallet=default_wallet, cid=cid, shell=self.shell, endpoint=endpoint) @allure.title("Policy with SELECT results with one node") @@ -144,27 +145,27 @@ class TestPolicy(ClusterTestBase): expected_copies = 1 endpoint = self.cluster.default_rpc_endpoint - with allure.step(f"Create container with policy {placement_rule}"): + with reporter.step(f"Create container with policy {placement_rule}"): cid = create_container( wallet=default_wallet, rule=placement_rule, basic_acl=PUBLIC_ACL, shell=self.shell, endpoint=endpoint ) - with allure.step(f"Check container policy"): + with reporter.step(f"Check container policy"): self.validate_object_policy(default_wallet, placement_rule, cid, endpoint) - with allure.step(f"Put object in container"): + with reporter.step(f"Put object in container"): oid = put_object_to_random_node(default_wallet, file_path, cid, shell=self.shell, cluster=self.cluster) - with allure.step(f"Check object expected copies"): + with reporter.step(f"Check object expected copies"): resulting_copies = get_nodes_with_object(cid, oid, shell=self.shell, nodes=self.cluster.storage_nodes) assert ( len(resulting_copies) == expected_copies ), f"Expected {expected_copies} copies, got {len(resulting_copies)}" - with allure.step(f"Delete the object from the container"): + with reporter.step(f"Delete the object from the container"): delete_object(wallet=default_wallet, cid=cid, oid=oid, shell=self.shell, endpoint=endpoint) - with allure.step(f"Delete the container"): + with reporter.step(f"Delete the container"): delete_container(wallet=default_wallet, cid=cid, shell=self.shell, endpoint=endpoint) @pytest.mark.sanity @@ -181,37 +182,38 @@ class TestPolicy(ClusterTestBase): file_path = generate_file(simple_object_size.value) expected_copies = 1 endpoint = self.cluster.default_rpc_endpoint - expected_params = {"country": "Russia"} + placement_params = {"country": "Russia"} - with allure.step(f"Create container with policy {placement_rule}"): + with reporter.step(f"Create container with policy {placement_rule}"): cid = create_container( wallet=default_wallet, rule=placement_rule, basic_acl=PUBLIC_ACL, shell=self.shell, endpoint=endpoint ) - with allure.step(f"Check container policy"): + with reporter.step(f"Check container policy"): self.validate_object_policy(default_wallet, placement_rule, cid, endpoint) - with allure.step(f"Put object in container"): + with reporter.step(f"Put object in container"): oid = put_object_to_random_node(default_wallet, file_path, cid, shell=self.shell, cluster=self.cluster) - with allure.step(f"Check object expected copies"): + with reporter.step(f"Check object expected copies"): resulting_copies = get_nodes_with_object(cid, oid, shell=self.shell, nodes=self.cluster.storage_nodes) assert ( len(resulting_copies) == expected_copies ), f"Expected {expected_copies} copies, got {len(resulting_copies)}" - with allure.step(f"Check the object appearance"): + with reporter.step(f"Check the object appearance"): netmap = parse_netmap_output(get_netmap_snapshot(node=resulting_copies[0], shell=self.shell)) netmap = self.get_netmap_param(netmap) node_address = resulting_copies[0].get_rpc_endpoint().split(":")[0] - assert ( - expected_params["country"] == netmap[node_address]["country"] - ), f"The node is selected from the wrong country. Expected {expected_params['country']} and got {netmap[node_address]['country']}" + with reporter.step(f"Check the node is selected from {placement_params['country']}"): + assert ( + placement_params["country"] == netmap[node_address]["country"] + ), f"The node is selected from the wrong country. Got {netmap[node_address]}" - with allure.step(f"Delete the object from the container"): + with reporter.step(f"Delete the object from the container"): delete_object(wallet=default_wallet, cid=cid, oid=oid, shell=self.shell, endpoint=endpoint) - with allure.step(f"Delete the container"): + with reporter.step(f"Delete the container"): delete_container(wallet=default_wallet, cid=cid, shell=self.shell, endpoint=endpoint) @allure.title("Policy with SELECT and Complex FILTER results with one node") @@ -224,44 +226,44 @@ class TestPolicy(ClusterTestBase): This test checks object's copies based on container's placement policy with SELECT and Complex FILTER results with one node. """ placement_rule = "REP 1 IN RUS REP 1 IN RUS CBF 1 SELECT 1 FROM RU AS RUS FILTER Country NE Sweden AS NotSE FILTER @NotSE AND NOT (CountryCode EQ FI) AND Country EQ 'Russia' AS RU" - expected_params = {"country": ["Russia", "Sweden"]} - unexpected_params = {"country": "Sweden", "country_code": "FI"} + placement_params = {"country": ["Russia", "Sweden"], "country_code": "FI"} file_path = generate_file(simple_object_size.value) expected_copies = 1 endpoint = self.cluster.default_rpc_endpoint - with allure.step(f"Create container with policy {placement_rule}"): + with reporter.step(f"Create container with policy {placement_rule}"): cid = create_container( wallet=default_wallet, rule=placement_rule, basic_acl=PUBLIC_ACL, shell=self.shell, endpoint=endpoint ) - with allure.step(f"Check container policy"): + with reporter.step(f"Check container policy"): self.validate_object_policy(default_wallet, placement_rule, cid, endpoint) - with allure.step(f"Put object in container"): + with reporter.step(f"Put object in container"): oid = put_object_to_random_node(default_wallet, file_path, cid, shell=self.shell, cluster=self.cluster) - with allure.step(f"Check object expected copies"): + with reporter.step(f"Check object expected copies"): resulting_copies = get_nodes_with_object(cid, oid, shell=self.shell, nodes=self.cluster.storage_nodes) assert ( len(resulting_copies) == expected_copies ), f"Expected {expected_copies} copies, got {len(resulting_copies)}" - with allure.step(f"Check the object appearance"): + with reporter.step(f"Check the object appearance"): netmap = parse_netmap_output(get_netmap_snapshot(node=resulting_copies[0], shell=self.shell)) netmap = self.get_netmap_param(netmap) node_address = resulting_copies[0].get_rpc_endpoint().split(":")[0] - assert ( - (expected_params["country"][1] == netmap[node_address]["country"]) - or not (unexpected_params["country"] == netmap[node_address]["country"]) - and not (unexpected_params["country_code"] == netmap[node_address]["country_code"]) - and (expected_params["country"][0] == netmap[node_address]["country"]) - ), f"The node is selected from the wrong country or country code. Expected {expected_params} and got {netmap[node_address]}" + with reporter.step(f"Check the node is selected from {placement_params['country'][0]}"): + assert ( + not (placement_params["country"][1] == netmap[node_address]["country"]) + or not (placement_params["country"][1] == netmap[node_address]["country"]) + and not (placement_params["country_code"] == netmap[node_address]["country_code"]) + and (placement_params["country"][0] == netmap[node_address]["country"]) + ), f"The node is selected from the wrong country or country code. Got {netmap[node_address]}" - with allure.step(f"Delete the object from the container"): + with reporter.step(f"Delete the object from the container"): delete_object(wallet=default_wallet, cid=cid, oid=oid, shell=self.shell, endpoint=endpoint) - with allure.step(f"Delete the container"): + with reporter.step(f"Delete the container"): delete_container(wallet=default_wallet, cid=cid, shell=self.shell, endpoint=endpoint) @pytest.mark.sanity @@ -275,44 +277,44 @@ class TestPolicy(ClusterTestBase): This test checks object's copies based on container's placement policy with Multi SELECTs and FILTERs results with one nodes. """ placement_rule = "REP 1 IN RU REP 1 IN EU REP 1 IN RU CBF 1 SELECT 1 FROM RUS AS RU SELECT 1 FROM EUR AS EU FILTER Country EQ Russia AS RUS FILTER NOT (@RUS) AND Country EQ Sweden OR CountryCode EQ FI AS EUR" - expected_params = {"country": ["Sweden", "Russia"], "country_code": "FI"} - unexpected_params = {"country": "Russia"} + placement_params = {"country": ["Sweden", "Russia"], "country_code": "FI"} file_path = generate_file(simple_object_size.value) expected_copies = 2 endpoint = self.cluster.default_rpc_endpoint - with allure.step(f"Create container with policy {placement_rule}"): + with reporter.step(f"Create container with policy {placement_rule}"): cid = create_container( wallet=default_wallet, rule=placement_rule, basic_acl=PUBLIC_ACL, shell=self.shell, endpoint=endpoint ) - with allure.step(f"Check container policy"): + with reporter.step(f"Check container policy"): self.validate_object_policy(default_wallet, placement_rule, cid, endpoint) - with allure.step(f"Put object in container"): + with reporter.step(f"Put object in container"): oid = put_object_to_random_node(default_wallet, file_path, cid, shell=self.shell, cluster=self.cluster) - with allure.step(f"Check object expected copies"): + with reporter.step(f"Check object expected copies"): resulting_copies = get_nodes_with_object(cid, oid, shell=self.shell, nodes=self.cluster.storage_nodes) assert ( len(resulting_copies) == expected_copies ), f"Expected {expected_copies} copies, got {len(resulting_copies)}" - with allure.step(f"Check the object appearance"): + with reporter.step(f"Check the object appearance"): netmap = parse_netmap_output(get_netmap_snapshot(node=resulting_copies[0], shell=self.shell)) netmap = self.get_netmap_param(netmap) - for node in resulting_copies: - node_address = resulting_copies[0].get_rpc_endpoint().split(":")[0] - assert (expected_params["country"][1] == netmap[node_address]["country"]) or ( - not (unexpected_params["country"][1] == netmap[node_address]["country"]) - and (expected_params["country"][0] == netmap[node_address]["country"]) - or (expected_params["country_code"] == netmap[node_address]["country_code"]) - ), f"The node is selected from the wrong country or country code. Expected {expected_params} and got {netmap[node_address]}" + with reporter.step(f"Check two nodes are selected from any country"): + for node in resulting_copies: + node_address = resulting_copies[0].get_rpc_endpoint().split(":")[0] + assert (placement_params["country"][1] == netmap[node_address]["country"]) or ( + not (placement_params["country"][1] == netmap[node_address]["country"]) + and (placement_params["country"][0] == netmap[node_address]["country"]) + or (placement_params["country_code"] == netmap[node_address]["country_code"]) + ), f"The node is selected from the wrong country or country code. Got {netmap[node_address]}" - with allure.step(f"Delete the object from the container"): + with reporter.step(f"Delete the object from the container"): delete_object(wallet=default_wallet, cid=cid, oid=oid, shell=self.shell, endpoint=endpoint) - with allure.step(f"Delete the container"): + with reporter.step(f"Delete the container"): delete_container(wallet=default_wallet, cid=cid, shell=self.shell, endpoint=endpoint) @pytest.mark.sanity @@ -326,42 +328,42 @@ class TestPolicy(ClusterTestBase): This test checks object's copies based on container's placement policy with SELECT and FILTER results with UNIQUE nodes. """ placement_rule = "UNIQUE REP 1 IN MyRussianNodes REP 1 IN MyRussianNodes CBF 1 SELECT 1 FROM RussianNodes AS MyRussianNodes FILTER Country EQ 'Russia' AS RussianNodes" + placement_params = {"country": "Russia"} file_path = generate_file(simple_object_size.value) expected_copies = 2 endpoint = self.cluster.default_rpc_endpoint - expected_params = {"country": "Russia"} - with allure.step(f"Create container with policy {placement_rule}"): + with reporter.step(f"Create container with policy {placement_rule}"): cid = create_container( wallet=default_wallet, rule=placement_rule, basic_acl=PUBLIC_ACL, shell=self.shell, endpoint=endpoint ) - with allure.step(f"Check container policy"): + with reporter.step(f"Check container policy"): self.validate_object_policy(default_wallet, placement_rule, cid, endpoint) - with allure.step(f"Put object in container"): + with reporter.step(f"Put object in container"): oid = put_object_to_random_node(default_wallet, file_path, cid, shell=self.shell, cluster=self.cluster) - with allure.step(f"Check object expected copies"): + with reporter.step(f"Check object expected copies"): resulting_copies = get_nodes_with_object(cid, oid, shell=self.shell, nodes=self.cluster.storage_nodes) assert ( len(resulting_copies) == expected_copies ), f"Expected {expected_copies} copies, got {len(resulting_copies)}" - with allure.step(f"Check the object appearance"): - self.check_for_the_uniqueness_of_the_nodes(resulting_copies) + with reporter.step(f"Check the object appearance"): netmap = parse_netmap_output(get_netmap_snapshot(node=resulting_copies[0], shell=self.shell)) netmap = self.get_netmap_param(netmap) - for node in resulting_copies: - node_address = node.get_rpc_endpoint().split(":")[0] - assert ( - expected_params["country"] == netmap[node_address]["country"] - ), f"The node is selected from the wrong country. Expected {expected_params['country']} and got {netmap[node_address]['country']}" + with reporter.step(f"Check two nodes are selected from {placement_params['country']}"): + for node in resulting_copies: + node_address = node.get_rpc_endpoint().split(":")[0] + assert ( + placement_params["country"] == netmap[node_address]["country"] + ), f"The node is selected from the wrong country. Got {netmap[node_address]['country']}" - with allure.step(f"Delete the container"): + with reporter.step(f"Delete the container"): delete_container(wallet=default_wallet, cid=cid, shell=self.shell, endpoint=endpoint) - with allure.step(f"Delete the container"): + with reporter.step(f"Delete the container"): delete_container(wallet=default_wallet, cid=cid, shell=self.shell, endpoint=endpoint) @allure.title("Simple policy results with 25% of available nodes") @@ -378,27 +380,27 @@ class TestPolicy(ClusterTestBase): expected_copies = 1 endpoint = self.cluster.default_rpc_endpoint - with allure.step(f"Create container with policy {placement_rule}"): + with reporter.step(f"Create container with policy {placement_rule}"): cid = create_container( wallet=default_wallet, rule=placement_rule, basic_acl=PUBLIC_ACL, shell=self.shell, endpoint=endpoint ) - with allure.step(f"Check container policy"): + with reporter.step(f"Check container policy"): self.validate_object_policy(default_wallet, placement_rule, cid, endpoint) - with allure.step(f"Put object in container"): + with reporter.step(f"Put object in container"): oid = put_object_to_random_node(default_wallet, file_path, cid, shell=self.shell, cluster=self.cluster) - with allure.step(f"Check object expected copies"): + with reporter.step(f"Check object expected copies"): resulting_copies = get_nodes_with_object(cid, oid, shell=self.shell, nodes=self.cluster.storage_nodes) assert ( len(resulting_copies) == expected_copies ), f"Expected {expected_copies} copies, got {len(resulting_copies)}" - with allure.step(f"Delete the object from the container"): + with reporter.step(f"Delete the object from the container"): delete_object(wallet=default_wallet, cid=cid, oid=oid, shell=self.shell, endpoint=endpoint) - with allure.step(f"Delete the container"): + with reporter.step(f"Delete the container"): delete_container(wallet=default_wallet, cid=cid, shell=self.shell, endpoint=endpoint) @allure.title("Policy with SELECT results with 25% of available nodes") @@ -415,27 +417,27 @@ class TestPolicy(ClusterTestBase): expected_copies = 1 endpoint = self.cluster.default_rpc_endpoint - with allure.step(f"Create container with policy {placement_rule}"): + with reporter.step(f"Create container with policy {placement_rule}"): cid = create_container( wallet=default_wallet, rule=placement_rule, basic_acl=PUBLIC_ACL, shell=self.shell, endpoint=endpoint ) - with allure.step(f"Check container policy"): + with reporter.step(f"Check container policy"): self.validate_object_policy(default_wallet, placement_rule, cid, endpoint) - with allure.step(f"Put object in container"): + with reporter.step(f"Put object in container"): oid = put_object_to_random_node(default_wallet, file_path, cid, shell=self.shell, cluster=self.cluster) - with allure.step(f"Check object expected copies"): + with reporter.step(f"Check object expected copies"): resulting_copies = get_nodes_with_object(cid, oid, shell=self.shell, nodes=self.cluster.storage_nodes) assert ( len(resulting_copies) == expected_copies ), f"Expected {expected_copies} copies, got {len(resulting_copies)}" - with allure.step(f"Delete the object from the container"): + with reporter.step(f"Delete the object from the container"): delete_object(wallet=default_wallet, cid=cid, oid=oid, shell=self.shell, endpoint=endpoint) - with allure.step(f"Delete the container"): + with reporter.step(f"Delete the container"): delete_container(wallet=default_wallet, cid=cid, shell=self.shell, endpoint=endpoint) @pytest.mark.skip(reason="price") @@ -449,41 +451,41 @@ class TestPolicy(ClusterTestBase): This test checks object's copies based on container's placement policy with SELECT and FILTER results with 25% of available nodes. """ placement_rule = "REP 1 IN Nodes25 SELECT 1 FROM LE10 AS Nodes25 FILTER Price LE 10 AS LE10" - expected_params = {"price": 10} + placement_params = {"price": 10} file_path = generate_file(simple_object_size.value) expected_copies = 1 endpoint = self.cluster.default_rpc_endpoint - with allure.step(f"Create container with policy {placement_rule}"): + with reporter.step(f"Create container with policy {placement_rule}"): cid = create_container( wallet=default_wallet, rule=placement_rule, basic_acl=PUBLIC_ACL, shell=self.shell, endpoint=endpoint ) - with allure.step(f"Check container policy"): + with reporter.step(f"Check container policy"): self.validate_object_policy(default_wallet, placement_rule, cid, endpoint) - with allure.step(f"Put object in container"): + with reporter.step(f"Put object in container"): oid = put_object_to_random_node(default_wallet, file_path, cid, shell=self.shell, cluster=self.cluster) - with allure.step(f"Check object expected copies"): + with reporter.step(f"Check object expected copies"): resulting_copies = get_nodes_with_object(cid, oid, shell=self.shell, nodes=self.cluster.storage_nodes) assert ( len(resulting_copies) == expected_copies ), f"Expected {expected_copies} copies, got {len(resulting_copies)}" - with allure.step(f"Check the object appearance"): + with reporter.step(f"Check the object appearance"): netmap = parse_netmap_output(get_netmap_snapshot(node=resulting_copies[0], shell=self.shell)) netmap = self.get_netmap_param(netmap) - for node in resulting_copies: - node_address = node.get_rpc_endpoint().split(":")[0] + node_address = resulting_copies[0].get_rpc_endpoint().split(":")[0] + with reporter.step(f"Check the node is selected with price <= {placement_params['price']}"): assert ( - int(netmap[node_address]["price"]) <= expected_params["price"] - ), f"The node is selected from the wrong price. Expected {expected_params} and got {netmap[node_address]}" + int(netmap[node_address]["price"]) <= placement_params["price"] + ), f"The node is selected with the wrong price. Got {netmap[node_address]}" - with allure.step(f"Delete the object from the container"): + with reporter.step(f"Delete the object from the container"): delete_object(wallet=default_wallet, cid=cid, oid=oid, shell=self.shell, endpoint=endpoint) - with allure.step(f"Delete the container"): + with reporter.step(f"Delete the container"): delete_container(wallet=default_wallet, cid=cid, shell=self.shell, endpoint=endpoint) @pytest.mark.skip(reason="price") @@ -497,46 +499,43 @@ class TestPolicy(ClusterTestBase): This test checks object's copies based on container's placement policy with SELECT and Complex FILTER results with 25% of available nodes. """ placement_rule = "REP 1 IN Nodes25 SELECT 1 FROM BET0AND10 AS Nodes25 FILTER Price LE 10 AS LE10 FILTER Price GT 0 AS GT0 FILTER @LE10 AND @GT0 AS BET0AND10" - expected_params = {"price": [10, 0]} + placement_params = {"price": [10, 0]} file_path = generate_file(simple_object_size.value) expected_copies = 1 endpoint = self.cluster.default_rpc_endpoint - with allure.step(f"Create container with policy {placement_rule}"): + with reporter.step(f"Create container with policy {placement_rule}"): cid = create_container( wallet=default_wallet, rule=placement_rule, basic_acl=PUBLIC_ACL, shell=self.shell, endpoint=endpoint ) - with allure.step(f"Check container policy"): + with reporter.step(f"Check container policy"): self.validate_object_policy(default_wallet, placement_rule, cid, endpoint) - with allure.step(f"Put object in container"): + with reporter.step(f"Put object in container"): oid = put_object_to_random_node(default_wallet, file_path, cid, shell=self.shell, cluster=self.cluster) - with allure.step(f"Check object expected copies"): + with reporter.step(f"Check object expected copies"): resulting_copies = get_nodes_with_object(cid, oid, shell=self.shell, nodes=self.cluster.storage_nodes) assert ( len(resulting_copies) == expected_copies ), f"Expected {expected_copies} copies, got {len(resulting_copies)}" - with allure.step(f"Check the object appearance"): + with reporter.step(f"Check the object appearance"): netmap = parse_netmap_output(get_netmap_snapshot(node=resulting_copies[0], shell=self.shell)) netmap = self.get_netmap_param(netmap) - for node in resulting_copies: - node_address = node.get_rpc_endpoint().split(":")[0] - assert ( - int(netmap[node_address]["price"]) > expected_params["price"][1] - or int(netmap[node_address]["price"]) <= expected_params["price"][0] - or ( - int(netmap[node_address]["price"]) > expected_params["price"][1] - and int(netmap[node_address]["price"]) <= expected_params["price"][0] - ) - ), f"The node is selected from the wrong price. Expected {expected_params} and got {netmap[node_address]}" + with reporter.step(f"Check the node is selected with price between 1 and 10"): + for node in resulting_copies: + node_address = node.get_rpc_endpoint().split(":")[0] + assert ( + int(netmap[node_address]["price"]) > placement_params["price"][1] + and int(netmap[node_address]["price"]) <= placement_params["price"][0] + ), f"The node is selected with the wrong price. Got {netmap[node_address]}" - with allure.step(f"Delete the object from the container"): + with reporter.step(f"Delete the object from the container"): delete_object(wallet=default_wallet, cid=cid, oid=oid, shell=self.shell, endpoint=endpoint) - with allure.step(f"Delete the container"): + with reporter.step(f"Delete the container"): delete_container(wallet=default_wallet, cid=cid, shell=self.shell, endpoint=endpoint) @pytest.mark.skip(reason="price") @@ -550,47 +549,43 @@ class TestPolicy(ClusterTestBase): This test checks object's copies based on container's placement policy with Multi SELECTs and FILTERs results with 25% of available nodes. """ placement_rule = "UNIQUE REP 1 IN One REP 1 IN One CBF 1 SELECT 1 FROM MINMAX AS One FILTER Price LT 15 AS LT15 FILTER Price GT 55 AS GT55 FILTER @LT15 OR @GT55 AS MINMAX" - expected_params = {"price": [15, 55]} + placement_params = {"price": [15, 55]} file_path = generate_file(simple_object_size.value) expected_copies = 2 endpoint = self.cluster.default_rpc_endpoint - with allure.step(f"Create container with policy {placement_rule}"): + with reporter.step(f"Create container with policy {placement_rule}"): cid = create_container( wallet=default_wallet, rule=placement_rule, basic_acl=PUBLIC_ACL, shell=self.shell, endpoint=endpoint ) - with allure.step(f"Check container policy"): + with reporter.step(f"Check container policy"): self.validate_object_policy(default_wallet, placement_rule, cid, endpoint) - with allure.step(f"Put object in container"): + with reporter.step(f"Put object in container"): oid = put_object_to_random_node(default_wallet, file_path, cid, shell=self.shell, cluster=self.cluster) - with allure.step(f"Check object expected copies"): + with reporter.step(f"Check object expected copies"): resulting_copies = get_nodes_with_object(cid, oid, shell=self.shell, nodes=self.cluster.storage_nodes) assert ( len(resulting_copies) == expected_copies ), f"Expected {expected_copies} copies, got {len(resulting_copies)}" - with allure.step(f"Check the object appearance"): + with reporter.step(f"Check the object appearance"): netmap = parse_netmap_output(get_netmap_snapshot(node=resulting_copies[0], shell=self.shell)) netmap = self.get_netmap_param(netmap) - for node in resulting_copies: - node_address = node.get_rpc_endpoint().split(":")[0] - assert ( - int(netmap[node_address]["price"]) > expected_params["price"][1] - or int(netmap[node_address]["price"]) < expected_params["price"][0] - or ( - int(netmap[node_address]["price"]) > expected_params["price"][1] - or int(netmap[node_address]["price"]) < expected_params["price"][0] - ) - ), f"The node is selected from the wrong price. Expected {expected_params} and got {netmap[node_address]}" - self.check_for_the_uniqueness_of_the_nodes(resulting_copies) + with reporter.step(f"Check two nodes are selected with max and min prices"): + for node in resulting_copies: + node_address = node.get_rpc_endpoint().split(":")[0] + assert ( + int(netmap[node_address]["price"]) > placement_params["price"][1] + or int(netmap[node_address]["price"]) < placement_params["price"][0] + ), f"The node is selected with the wrong price. Got {netmap[node_address]}" - with allure.step(f"Delete the object from the container"): + with reporter.step(f"Delete the object from the container"): delete_object(wallet=default_wallet, cid=cid, oid=oid, shell=self.shell, endpoint=endpoint) - with allure.step(f"Delete the container"): + with reporter.step(f"Delete the container"): delete_container(wallet=default_wallet, cid=cid, shell=self.shell, endpoint=endpoint) @allure.title("Simple policy results with 50% of available nodes") @@ -607,27 +602,27 @@ class TestPolicy(ClusterTestBase): expected_copies = 2 endpoint = self.cluster.default_rpc_endpoint - with allure.step(f"Create container with policy {placement_rule}"): + with reporter.step(f"Create container with policy {placement_rule}"): cid = create_container( wallet=default_wallet, rule=placement_rule, basic_acl=PUBLIC_ACL, shell=self.shell, endpoint=endpoint ) - with allure.step(f"Check container policy"): + with reporter.step(f"Check container policy"): self.validate_object_policy(default_wallet, placement_rule, cid, endpoint) - with allure.step(f"Put object in container"): + with reporter.step(f"Put object in container"): oid = put_object_to_random_node(default_wallet, file_path, cid, shell=self.shell, cluster=self.cluster) - with allure.step(f"Check object expected copies"): + with reporter.step(f"Check object expected copies"): resulting_copies = get_nodes_with_object(cid, oid, shell=self.shell, nodes=self.cluster.storage_nodes) assert ( len(resulting_copies) == expected_copies ), f"Expected {expected_copies} copies, got {len(resulting_copies)}" - with allure.step(f"Delete the object from the container"): + with reporter.step(f"Delete the object from the container"): delete_object(wallet=default_wallet, cid=cid, oid=oid, shell=self.shell, endpoint=endpoint) - with allure.step(f"Delete the container"): + with reporter.step(f"Delete the container"): delete_container(wallet=default_wallet, cid=cid, shell=self.shell, endpoint=endpoint) @allure.title("Policy with SELECT results with 50% of available nodes") @@ -644,27 +639,27 @@ class TestPolicy(ClusterTestBase): expected_copies = 2 endpoint = self.cluster.default_rpc_endpoint - with allure.step(f"Create container with policy {placement_rule}"): + with reporter.step(f"Create container with policy {placement_rule}"): cid = create_container( wallet=default_wallet, rule=placement_rule, basic_acl=PUBLIC_ACL, shell=self.shell, endpoint=endpoint ) - with allure.step(f"Check container policy"): + with reporter.step(f"Check container policy"): self.validate_object_policy(default_wallet, placement_rule, cid, endpoint) - with allure.step(f"Put object in container"): + with reporter.step(f"Put object in container"): oid = put_object_to_random_node(default_wallet, file_path, cid, shell=self.shell, cluster=self.cluster) - with allure.step(f"Check object expected copies"): + with reporter.step(f"Check object expected copies"): resulting_copies = get_nodes_with_object(cid, oid, shell=self.shell, nodes=self.cluster.storage_nodes) assert ( len(resulting_copies) == expected_copies ), f"Expected {expected_copies} copies, got {len(resulting_copies)}" - with allure.step(f"Delete the object from the container"): + with reporter.step(f"Delete the object from the container"): delete_object(wallet=default_wallet, cid=cid, oid=oid, shell=self.shell, endpoint=endpoint) - with allure.step(f"Delete the container"): + with reporter.step(f"Delete the container"): delete_container(wallet=default_wallet, cid=cid, shell=self.shell, endpoint=endpoint) @pytest.mark.skip(reason="price") @@ -678,41 +673,42 @@ class TestPolicy(ClusterTestBase): This test checks object's copies based on container's placement policy with SELECT and FILTER results with 50% of available nodes. """ placement_rule = "REP 2 IN HALF CBF 1 SELECT 2 FROM GT15 AS HALF FILTER Price GT 15 AS GT15" - expected_params = {"price": 15} + placement_params = {"price": 15} file_path = generate_file(simple_object_size.value) expected_copies = 2 endpoint = self.cluster.default_rpc_endpoint - with allure.step(f"Create container with policy {placement_rule}"): + with reporter.step(f"Create container with policy {placement_rule}"): cid = create_container( wallet=default_wallet, rule=placement_rule, basic_acl=PUBLIC_ACL, shell=self.shell, endpoint=endpoint ) - with allure.step(f"Check container policy"): + with reporter.step(f"Check container policy"): self.validate_object_policy(default_wallet, placement_rule, cid, endpoint) - with allure.step(f"Put object in container"): + with reporter.step(f"Put object in container"): oid = put_object_to_random_node(default_wallet, file_path, cid, shell=self.shell, cluster=self.cluster) - with allure.step(f"Check object expected copies"): + with reporter.step(f"Check object expected copies"): resulting_copies = get_nodes_with_object(cid, oid, shell=self.shell, nodes=self.cluster.storage_nodes) assert ( len(resulting_copies) == expected_copies ), f"Expected {expected_copies} copies, got {len(resulting_copies)}" - with allure.step(f"Check the object appearance"): + with reporter.step(f"Check the object appearance"): netmap = parse_netmap_output(get_netmap_snapshot(node=resulting_copies[0], shell=self.shell)) netmap = self.get_netmap_param(netmap) - for node in resulting_copies: - node_address = node.get_rpc_endpoint().split(":")[0] - assert ( - int(netmap[node_address]["price"]) > expected_params["price"] - ), f"The node is selected from the wrong price. Expected {expected_params} and got {netmap[node_address]}" + with reporter.step(f"Check two nodes are selected with price > {placement_params['price']}"): + for node in resulting_copies: + node_address = node.get_rpc_endpoint().split(":")[0] + assert ( + int(netmap[node_address]["price"]) > placement_params["price"] + ), f"The node is selected with the wrong price. Got {netmap[node_address]}" - with allure.step(f"Delete the object from the container"): + with reporter.step(f"Delete the object from the container"): delete_object(wallet=default_wallet, cid=cid, oid=oid, shell=self.shell, endpoint=endpoint) - with allure.step(f"Delete the container"): + with reporter.step(f"Delete the container"): delete_container(wallet=default_wallet, cid=cid, shell=self.shell, endpoint=endpoint) @pytest.mark.skip(reason="price") @@ -726,43 +722,46 @@ class TestPolicy(ClusterTestBase): This test checks object's copies based on container's placement policy with SELECT and Complex FILTER results with 50% of available nodes. """ placement_rule = "REP 2 IN HALF CBF 2 SELECT 2 FROM GE15 AS HALF FILTER CountryCode NE RU AS NOTRU FILTER @NOTRU AND Price GE 15 AS GE15" - expected_params = {"price": 15} - unexpected_params = {"country_code": "RU"} + placement_params = {"price": 15, "country_code": "RU"} file_path = generate_file(simple_object_size.value) expected_copies = 2 endpoint = self.cluster.default_rpc_endpoint - with allure.step(f"Create container with policy {placement_rule}"): + with reporter.step(f"Create container with policy {placement_rule}"): cid = create_container( wallet=default_wallet, rule=placement_rule, basic_acl=PUBLIC_ACL, shell=self.shell, endpoint=endpoint ) - with allure.step(f"Check container policy"): + with reporter.step(f"Check container policy"): self.validate_object_policy(default_wallet, placement_rule, cid, endpoint) - with allure.step(f"Put object in container"): + with reporter.step(f"Put object in container"): oid = put_object_to_random_node(default_wallet, file_path, cid, shell=self.shell, cluster=self.cluster) - with allure.step(f"Check object expected copies"): + with reporter.step(f"Check object expected copies"): resulting_copies = get_nodes_with_object(cid, oid, shell=self.shell, nodes=self.cluster.storage_nodes) assert ( len(resulting_copies) == expected_copies ), f"Expected {expected_copies} copies, got {len(resulting_copies)}" - with allure.step(f"Check the object appearance"): + with reporter.step(f"Check the object appearance"): netmap = parse_netmap_output(get_netmap_snapshot(node=resulting_copies[0], shell=self.shell)) netmap = self.get_netmap_param(netmap) - for node in resulting_copies: - node_address = node.get_rpc_endpoint().split(":")[0] - assert (not netmap[node_address]["country_code"] == unexpected_params["country_code"]) or ( - not netmap[node_address]["country_code"] == unexpected_params["country_code"] - and int(netmap[node_address]["price"]) >= expected_params["price"] - ), f"The node is selected from the wrong price or country_code. Expected {expected_params} and got {netmap[node_address]}" + with reporter.step( + f"Check two nodes are selected not with country code '{placement_params['country_code']}'" + ): + for node in resulting_copies: + node_address = node.get_rpc_endpoint().split(":")[0] + assert ( + not netmap[node_address]["country_code"] == placement_params["country_code"] + or not netmap[node_address]["country_code"] == placement_params["country_code"] + and int(netmap[node_address]["price"]) >= placement_params["price"] + ), f"The node is selected with the wrong price or country code. Got {netmap[node_address]}" - with allure.step(f"Delete the object from the container"): + with reporter.step(f"Delete the object from the container"): delete_object(wallet=default_wallet, cid=cid, oid=oid, shell=self.shell, endpoint=endpoint) - with allure.step(f"Delete the container"): + with reporter.step(f"Delete the container"): delete_container(wallet=default_wallet, cid=cid, shell=self.shell, endpoint=endpoint) @pytest.mark.skip(reason="price") @@ -776,50 +775,51 @@ class TestPolicy(ClusterTestBase): This test checks object's copies based on container's placement policy with Multi SELECTs and FILTERs results with 50% of available nodes. """ placement_rule = "REP 2 IN FH REP 1 IN SH CBF 2 SELECT 2 FROM LE55 AS FH SELECT 2 FROM GE15 AS SH FILTER 'UN-LOCODE' EQ RU_LED OR 'UN-LOCODE' EQ RU_MOW AS RU FILTER NOT(@RU) AS NOTRU FILTER @NOTRU AND Price GE 15 AS GE15 FILTER @RU AND Price LE 55 AS LE55" - expected_params = {"un_locode": ["RU_LED", "RU_MOW"], "price": [15, 55]} + placement_params = {"un_locode": ["RU_LED", "RU_MOW"], "price": [15, 55]} file_path = generate_file(simple_object_size.value) expected_copies = 4 endpoint = self.cluster.default_rpc_endpoint - with allure.step(f"Create container with policy {placement_rule}"): + with reporter.step(f"Create container with policy {placement_rule}"): cid = create_container( wallet=default_wallet, rule=placement_rule, basic_acl=PUBLIC_ACL, shell=self.shell, endpoint=endpoint ) - with allure.step(f"Check container policy"): + with reporter.step(f"Check container policy"): self.validate_object_policy(default_wallet, placement_rule, cid, endpoint) - with allure.step(f"Put object in container"): + with reporter.step(f"Put object in container"): oid = put_object_to_random_node(default_wallet, file_path, cid, shell=self.shell, cluster=self.cluster) - with allure.step(f"Check object expected copies"): + with reporter.step(f"Check object expected copies"): resulting_copies = get_nodes_with_object(cid, oid, shell=self.shell, nodes=self.cluster.storage_nodes) assert ( len(resulting_copies) == expected_copies ), f"Expected {expected_copies} copies, got {len(resulting_copies)}" - with allure.step(f"Check the object appearance"): + with reporter.step(f"Check the object appearance"): netmap = parse_netmap_output(get_netmap_snapshot(node=resulting_copies[0], shell=self.shell)) netmap = self.get_netmap_param(netmap) - for node in resulting_copies: - node_address = node.get_rpc_endpoint().split(":")[0] - assert ( - (netmap[node_address]["un_locode"] in expected_params["un_locode"]) - or (not netmap[node_address]["un_locode"] in expected_params["un_locode"]) - or ( - not netmap[node_address]["un_locode"] in expected_params["un_locode"] - and int(netmap[node_address]["price"]) >= expected_params["price"][0] - ) - or ( - netmap[node_address]["un_locode"] in expected_params["un_locode"] - and int(netmap[node_address]["price"]) <= expected_params["price"][1] - ) - ), f"The node is selected from the wrong price or un_locode. Expected {expected_params} and got {netmap[node_address]}" + with reporter.step(f"Check all nodes are selected"): + for node in resulting_copies: + node_address = node.get_rpc_endpoint().split(":")[0] + assert ( + netmap[node_address]["un_locode"] in placement_params["un_locode"] + or not netmap[node_address]["un_locode"] == placement_params["un_locode"][1] + or ( + not netmap[node_address]["un_locode"] == placement_params["un_locode"][1] + and int(netmap[node_address]["price"]) >= placement_params["price"][0] + ) + or ( + netmap[node_address]["un_locode"] == placement_params["un_locode"][1] + and int(netmap[node_address]["price"]) <= placement_params["price"][1] + ) + ), f"The node is selected with the wrong price or un_locode. Expected {placement_params} and got {netmap[node_address]}" - with allure.step(f"Delete the object from the container"): + with reporter.step(f"Delete the object from the container"): delete_object(wallet=default_wallet, cid=cid, oid=oid, shell=self.shell, endpoint=endpoint) - with allure.step(f"Delete the container"): + with reporter.step(f"Delete the container"): delete_container(wallet=default_wallet, cid=cid, shell=self.shell, endpoint=endpoint) @pytest.mark.sanity @@ -837,27 +837,27 @@ class TestPolicy(ClusterTestBase): expected_copies = 1 endpoint = self.cluster.default_rpc_endpoint - with allure.step(f"Create container with policy {placement_rule}"): + with reporter.step(f"Create container with policy {placement_rule}"): cid = create_container( wallet=default_wallet, rule=placement_rule, basic_acl=PUBLIC_ACL, shell=self.shell, endpoint=endpoint ) - with allure.step(f"Check container policy"): + with reporter.step(f"Check container policy"): self.validate_object_policy(default_wallet, placement_rule, cid, endpoint) - with allure.step(f"Put object in container"): + with reporter.step(f"Put object in container"): oid = put_object_to_random_node(default_wallet, file_path, cid, shell=self.shell, cluster=self.cluster) - with allure.step(f"Check object expected copies"): + with reporter.step(f"Check object expected copies"): resulting_copies = get_nodes_with_object(cid, oid, shell=self.shell, nodes=self.cluster.storage_nodes) assert ( len(resulting_copies) == expected_copies ), f"Expected {expected_copies} copies, got {len(resulting_copies)}" - with allure.step(f"Delete the object from the container"): + with reporter.step(f"Delete the object from the container"): delete_object(wallet=default_wallet, cid=cid, oid=oid, shell=self.shell, endpoint=endpoint) - with allure.step(f"Delete the container"): + with reporter.step(f"Delete the container"): delete_container(wallet=default_wallet, cid=cid, shell=self.shell, endpoint=endpoint) @allure.title("Policy with SELECT results with 75% of available nodes") @@ -874,27 +874,27 @@ class TestPolicy(ClusterTestBase): expected_copies = 2 endpoint = self.cluster.default_rpc_endpoint - with allure.step(f"Create container with policy {placement_rule}"): + with reporter.step(f"Create container with policy {placement_rule}"): cid = create_container( wallet=default_wallet, rule=placement_rule, basic_acl=PUBLIC_ACL, shell=self.shell, endpoint=endpoint ) - with allure.step(f"Check container policy"): + with reporter.step(f"Check container policy"): self.validate_object_policy(default_wallet, placement_rule, cid, endpoint) - with allure.step(f"Put object in container"): + with reporter.step(f"Put object in container"): oid = put_object_to_random_node(default_wallet, file_path, cid, shell=self.shell, cluster=self.cluster) - with allure.step(f"Check object expected copies"): + with reporter.step(f"Check object expected copies"): resulting_copies = get_nodes_with_object(cid, oid, shell=self.shell, nodes=self.cluster.storage_nodes) assert ( len(resulting_copies) == expected_copies ), f"Expected {expected_copies} copies, got {len(resulting_copies)}" - with allure.step(f"Delete the object from the container"): + with reporter.step(f"Delete the object from the container"): delete_object(wallet=default_wallet, cid=cid, oid=oid, shell=self.shell, endpoint=endpoint) - with allure.step(f"Delete the container"): + with reporter.step(f"Delete the container"): delete_container(wallet=default_wallet, cid=cid, shell=self.shell, endpoint=endpoint) @pytest.mark.skip(reason="price") @@ -908,41 +908,42 @@ class TestPolicy(ClusterTestBase): This test checks object's copies based on container's placement policy with SELECT and FILTER results with 75% of available nodes. """ placement_rule = "REP 2 IN NODES75 SELECT 2 FROM LT65 AS NODES75 FILTER Price LT 65 AS LT65" - expected_params = {"price": 65} + placement_params = {"price": 65} file_path = generate_file(simple_object_size.value) expected_copies = 2 endpoint = self.cluster.default_rpc_endpoint - with allure.step(f"Create container with policy {placement_rule}"): + with reporter.step(f"Create container with policy {placement_rule}"): cid = create_container( wallet=default_wallet, rule=placement_rule, basic_acl=PUBLIC_ACL, shell=self.shell, endpoint=endpoint ) - with allure.step(f"Check container policy"): + with reporter.step(f"Check container policy"): self.validate_object_policy(default_wallet, placement_rule, cid, endpoint) - with allure.step(f"Put object in container"): + with reporter.step(f"Put object in container"): oid = put_object_to_random_node(default_wallet, file_path, cid, shell=self.shell, cluster=self.cluster) - with allure.step(f"Check object expected copies"): + with reporter.step(f"Check object expected copies"): resulting_copies = get_nodes_with_object(cid, oid, shell=self.shell, nodes=self.cluster.storage_nodes) assert ( len(resulting_copies) == expected_copies ), f"Expected {expected_copies} copies, got {len(resulting_copies)}" - with allure.step(f"Check the object appearance"): + with reporter.step(f"Check the object appearance"): netmap = parse_netmap_output(get_netmap_snapshot(node=resulting_copies[0], shell=self.shell)) netmap = self.get_netmap_param(netmap) - for node in resulting_copies: - node_address = node.get_rpc_endpoint().split(":")[0] - assert ( - int(netmap[node_address]["price"]) < expected_params["price"] - ), f"The node is selected from the wrong price. Expected {expected_params} and got {netmap[node_address]}" + with reporter.step(f"Check two nodes are selected with price < {placement_params['price']}"): + for node in resulting_copies: + node_address = node.get_rpc_endpoint().split(":")[0] + assert ( + int(netmap[node_address]["price"]) < placement_params["price"] + ), f"The node is selected with the wrong price. Got {netmap[node_address]}" - with allure.step(f"Delete the object from the container"): + with reporter.step(f"Delete the object from the container"): delete_object(wallet=default_wallet, cid=cid, oid=oid, shell=self.shell, endpoint=endpoint) - with allure.step(f"Delete the container"): + with reporter.step(f"Delete the container"): delete_container(wallet=default_wallet, cid=cid, shell=self.shell, endpoint=endpoint) @pytest.mark.skip(reason="price") @@ -956,45 +957,45 @@ class TestPolicy(ClusterTestBase): This test checks object's copies based on container's placement policy with SELECT and Complex FILTER results with 75% of available nodes. """ placement_rule = "REP 2 IN NODES75 SELECT 2 FROM LT65 AS NODES75 FILTER Continent NE America AS NOAM FILTER @NOAM AND Price LT 65 AS LT65" - expected_params = {"price": 65} - unexpected_params = {"continent": "America"} + placement_params = {"price": 65, "continent": "America"} file_path = generate_file(simple_object_size.value) expected_copies = 3 endpoint = self.cluster.default_rpc_endpoint - with allure.step(f"Create container with policy {placement_rule}"): + with reporter.step(f"Create container with policy {placement_rule}"): cid = create_container( wallet=default_wallet, rule=placement_rule, basic_acl=PUBLIC_ACL, shell=self.shell, endpoint=endpoint ) - with allure.step(f"Check container policy"): + with reporter.step(f"Check container policy"): self.validate_object_policy(default_wallet, placement_rule, cid, endpoint) - with allure.step(f"Put object in container"): + with reporter.step(f"Put object in container"): oid = put_object_to_random_node(default_wallet, file_path, cid, shell=self.shell, cluster=self.cluster) - with allure.step(f"Check object expected copies"): + with reporter.step(f"Check object expected copies"): resulting_copies = get_nodes_with_object(cid, oid, shell=self.shell, nodes=self.cluster.storage_nodes) assert ( len(resulting_copies) == expected_copies ), f"Expected {expected_copies} copies, got {len(resulting_copies)}" - with allure.step(f"Check the object appearance"): + with reporter.step(f"Check the object appearance"): netmap = parse_netmap_output(get_netmap_snapshot(node=resulting_copies[0], shell=self.shell)) netmap = self.get_netmap_param(netmap) - for node in resulting_copies: - node_address = node.get_rpc_endpoint().split(":")[0] - assert ( - int(netmap[node_address]["price"]) < expected_params["price"] - and netmap[node_address]["continent"] == unexpected_params["continent"] - ) or ( - netmap[node_address]["continent"] == unexpected_params["continent"] - ), f"The node is selected from the wrong price or continent. Expected {expected_params} and got {netmap[node_address]}" + with reporter.step(f"Check three nodes are selected not from {placement_params['continent']}"): + for node in resulting_copies: + node_address = node.get_rpc_endpoint().split(":")[0] + assert ( + int(netmap[node_address]["price"]) < placement_params["price"] + and not netmap[node_address]["continent"] == placement_params["continent"] + ) or ( + not netmap[node_address]["continent"] == placement_params["continent"] + ), f"The node is selected with the wrong price or continent. Got {netmap[node_address]}" - with allure.step(f"Delete the object from the container"): + with reporter.step(f"Delete the object from the container"): delete_object(wallet=default_wallet, cid=cid, oid=oid, shell=self.shell, endpoint=endpoint) - with allure.step(f"Delete the container"): + with reporter.step(f"Delete the container"): delete_container(wallet=default_wallet, cid=cid, shell=self.shell, endpoint=endpoint) @pytest.mark.skip(reason="price") @@ -1008,50 +1009,50 @@ class TestPolicy(ClusterTestBase): This test checks object's copies based on container's placement policy with Multi SELECTs and FILTERs results with 75% of available nodes. """ placement_rule = "REP 2 IN EXPNSV REP 2 IN CHEAP SELECT 3 FROM GT10 AS EXPNSV SELECT 3 FROM LT65 AS CHEAP FILTER NOT(Continent EQ America) AS NOAM FILTER @NOAM AND Price LT 65 AS LT65 FILTER @NOAM AND Price GT 10 AS GT10" - expected_params = {"price": [65, 10]} - unexpected_params = {"continent": "America"} + placement_params = {"price": [65, 10], "continent": "America"} file_path = generate_file(simple_object_size.value) expected_copies = 4 endpoint = self.cluster.default_rpc_endpoint - with allure.step(f"Create container with policy {placement_rule}"): + with reporter.step(f"Create container with policy {placement_rule}"): cid = create_container( wallet=default_wallet, rule=placement_rule, basic_acl=PUBLIC_ACL, shell=self.shell, endpoint=endpoint ) - with allure.step(f"Check container policy"): + with reporter.step(f"Check container policy"): self.validate_object_policy(default_wallet, placement_rule, cid, endpoint) - with allure.step(f"Put object in container"): + with reporter.step(f"Put object in container"): oid = put_object_to_random_node(default_wallet, file_path, cid, shell=self.shell, cluster=self.cluster) - with allure.step(f"Check object expected copies"): + with reporter.step(f"Check object expected copies"): resulting_copies = get_nodes_with_object(cid, oid, shell=self.shell, nodes=self.cluster.storage_nodes) assert ( len(resulting_copies) == expected_copies ), f"Expected {expected_copies} copies, got {len(resulting_copies)}" - with allure.step(f"Check the object appearance"): + with reporter.step(f"Check the object appearance"): netmap = parse_netmap_output(get_netmap_snapshot(node=resulting_copies[0], shell=self.shell)) netmap = self.get_netmap_param(netmap) - for node in resulting_copies: - node_address = node.get_rpc_endpoint().split(":")[0] - assert ( - ( - int(netmap[node_address]["price"]) > expected_params["price"][1] - and netmap[node_address]["continent"] == unexpected_params["continent"] - ) - or ( - int(netmap[node_address]["price"]) < expected_params["price"][0] - and netmap[node_address]["continent"] == unexpected_params["continent"] - ) - or (netmap[node_address]["continent"] == unexpected_params["continent"]) - ), f"The node is selected from the wrong price or continent. Expected {expected_params} and got {netmap[node_address]}" + with reporter.step(f"Check all nodes are selected"): + for node in resulting_copies: + node_address = node.get_rpc_endpoint().split(":")[0] + assert ( + ( + int(netmap[node_address]["price"]) > placement_params["price"][1] + and not netmap[node_address]["continent"] == placement_params["continent"] + ) + or ( + int(netmap[node_address]["price"]) < placement_params["price"][0] + and not netmap[node_address]["continent"] == placement_params["continent"] + ) + or not (netmap[node_address]["continent"] == placement_params["continent"]) + ), f"The node is selected with the wrong price or continent. Got {netmap[node_address]}" - with allure.step(f"Delete the object from the container"): + with reporter.step(f"Delete the object from the container"): delete_object(wallet=default_wallet, cid=cid, oid=oid, shell=self.shell, endpoint=endpoint) - with allure.step(f"Delete the container"): + with reporter.step(f"Delete the container"): delete_container(wallet=default_wallet, cid=cid, shell=self.shell, endpoint=endpoint) @pytest.mark.sanity @@ -1069,27 +1070,27 @@ class TestPolicy(ClusterTestBase): expected_copies = 4 endpoint = self.cluster.default_rpc_endpoint - with allure.step(f"Create container with policy {placement_rule}"): + with reporter.step(f"Create container with policy {placement_rule}"): cid = create_container( wallet=default_wallet, rule=placement_rule, basic_acl=PUBLIC_ACL, shell=self.shell, endpoint=endpoint ) - with allure.step(f"Check container policy"): + with reporter.step(f"Check container policy"): self.validate_object_policy(default_wallet, placement_rule, cid, endpoint) - with allure.step(f"Put object in container"): + with reporter.step(f"Put object in container"): oid = put_object_to_random_node(default_wallet, file_path, cid, shell=self.shell, cluster=self.cluster) - with allure.step(f"Check object expected copies"): + with reporter.step(f"Check object expected copies"): resulting_copies = get_nodes_with_object(cid, oid, shell=self.shell, nodes=self.cluster.storage_nodes) assert ( len(resulting_copies) == expected_copies ), f"Expected {expected_copies} copies, got {len(resulting_copies)}" - with allure.step(f"Delete the object from the container"): + with reporter.step(f"Delete the object from the container"): delete_object(wallet=default_wallet, cid=cid, oid=oid, shell=self.shell, endpoint=endpoint) - with allure.step(f"Delete the container"): + with reporter.step(f"Delete the container"): delete_container(wallet=default_wallet, cid=cid, shell=self.shell, endpoint=endpoint) @allure.title("Policy with SELECT results with 100% of available nodes") @@ -1106,27 +1107,27 @@ class TestPolicy(ClusterTestBase): expected_copies = 1 endpoint = self.cluster.default_rpc_endpoint - with allure.step(f"Create container with policy {placement_rule}"): + with reporter.step(f"Create container with policy {placement_rule}"): cid = create_container( wallet=default_wallet, rule=placement_rule, basic_acl=PUBLIC_ACL, shell=self.shell, endpoint=endpoint ) - with allure.step(f"Check container policy"): + with reporter.step(f"Check container policy"): self.validate_object_policy(default_wallet, placement_rule, cid, endpoint) - with allure.step(f"Put object in container"): + with reporter.step(f"Put object in container"): oid = put_object_to_random_node(default_wallet, file_path, cid, shell=self.shell, cluster=self.cluster) - with allure.step(f"Check object expected copies"): + with reporter.step(f"Check object expected copies"): resulting_copies = get_nodes_with_object(cid, oid, shell=self.shell, nodes=self.cluster.storage_nodes) assert ( len(resulting_copies) == expected_copies ), f"Expected {expected_copies} copies, got {len(resulting_copies)}" - with allure.step(f"Delete the object from the container"): + with reporter.step(f"Delete the object from the container"): delete_object(wallet=default_wallet, cid=cid, oid=oid, shell=self.shell, endpoint=endpoint) - with allure.step(f"Delete the container"): + with reporter.step(f"Delete the container"): delete_container(wallet=default_wallet, cid=cid, shell=self.shell, endpoint=endpoint) @pytest.mark.skip(reason="price") @@ -1140,41 +1141,41 @@ class TestPolicy(ClusterTestBase): This test checks object's copies based on container's placement policy with SELECT and FILTER results with 100% of available nodes. """ placement_rule = "REP 1 IN All SELECT 4 FROM AllNodes AS All FILTER Price GE 0 AS AllNodes" - expected_params = {"price": 0} + placement_params = {"price": 0} file_path = generate_file(simple_object_size.value) expected_copies = 1 endpoint = self.cluster.default_rpc_endpoint - with allure.step(f"Create container with policy {placement_rule}"): + with reporter.step(f"Create container with policy {placement_rule}"): cid = create_container( wallet=default_wallet, rule=placement_rule, basic_acl=PUBLIC_ACL, shell=self.shell, endpoint=endpoint ) - with allure.step(f"Check container policy"): + with reporter.step(f"Check container policy"): self.validate_object_policy(default_wallet, placement_rule, cid, endpoint) - with allure.step(f"Put object in container"): + with reporter.step(f"Put object in container"): oid = put_object_to_random_node(default_wallet, file_path, cid, shell=self.shell, cluster=self.cluster) - with allure.step(f"Check object expected copies"): + with reporter.step(f"Check object expected copies"): resulting_copies = get_nodes_with_object(cid, oid, shell=self.shell, nodes=self.cluster.storage_nodes) assert ( len(resulting_copies) == expected_copies ), f"Expected {expected_copies} copies, got {len(resulting_copies)}" - with allure.step(f"Check the object appearance"): - self.check_for_the_uniqueness_of_the_nodes(resulting_copies) + with reporter.step(f"Check the object appearance"): netmap = parse_netmap_output(get_netmap_snapshot(node=resulting_copies[0], shell=self.shell)) netmap = self.get_netmap_param(netmap) node_address = resulting_copies[0].get_rpc_endpoint().split(":")[0] - assert netmap[node_address]["price"] >= int( - expected_params["price"] - ), f"The node is selected from the wrong price. Expected {expected_params} and got {netmap[node_address]}" + with reporter.step(f"Check the node is selected with price >= {placement_params['price']}"): + assert netmap[node_address]["price"] >= int( + placement_params["price"] + ), f"The node is selected with the wrong price. Got {netmap[node_address]}" - with allure.step(f"Delete the object from the container"): + with reporter.step(f"Delete the object from the container"): delete_object(wallet=default_wallet, cid=cid, oid=oid, shell=self.shell, endpoint=endpoint) - with allure.step(f"Delete the container"): + with reporter.step(f"Delete the container"): delete_container(wallet=default_wallet, cid=cid, shell=self.shell, endpoint=endpoint) @allure.title("Policy with SELECT and Complex FILTER results with 100% of available nodes") @@ -1187,43 +1188,44 @@ class TestPolicy(ClusterTestBase): This test checks object's copies based on container's placement policy with SELECT and Complex FILTER results with 100% of available nodes. """ placement_rule = "REP 2 IN All SELECT 4 FROM AllNodes AS All FILTER Country EQ Russia OR Country EQ Sweden OR Country EQ Finland AS AllCountries FILTER @AllCountries AND Continent EQ Europe AS AllNodes" - expected_params = {"country": ["Russia", "Sweden", "Finland"], "continent": "Europe"} + placement_params = {"country": ["Russia", "Sweden", "Finland"], "continent": "Europe"} file_path = generate_file(simple_object_size.value) expected_copies = 2 endpoint = self.cluster.default_rpc_endpoint - with allure.step(f"Create container with policy {placement_rule}"): + with reporter.step(f"Create container with policy {placement_rule}"): cid = create_container( wallet=default_wallet, rule=placement_rule, basic_acl=PUBLIC_ACL, shell=self.shell, endpoint=endpoint ) - with allure.step(f"Check container policy"): + with reporter.step(f"Check container policy"): self.validate_object_policy(default_wallet, placement_rule, cid, endpoint) - with allure.step(f"Put object in container"): + with reporter.step(f"Put object in container"): oid = put_object_to_random_node(default_wallet, file_path, cid, shell=self.shell, cluster=self.cluster) - with allure.step(f"Check object expected copies"): + with reporter.step(f"Check object expected copies"): resulting_copies = get_nodes_with_object(cid, oid, shell=self.shell, nodes=self.cluster.storage_nodes) assert ( len(resulting_copies) == expected_copies ), f"Expected {expected_copies} copies, got {len(resulting_copies)}" - with allure.step(f"Check the object appearance"): + with reporter.step(f"Check the object appearance"): netmap = parse_netmap_output(get_netmap_snapshot(node=resulting_copies[0], shell=self.shell)) netmap = self.get_netmap_param(netmap) - for node in resulting_copies: - node_address = node.get_rpc_endpoint().split(":")[0] - assert ( - (netmap[node_address]["country"] in expected_params["country"]) - or (netmap[node_address]["country"] in expected_params["country"]) - and (netmap[node_address]["continent"] in expected_params["continent"]) - ), f"The node is selected from the wrong country or continent. Expected {expected_params} and got {netmap[node_address]}" + with reporter.step(f"Check two nodes are selected from {' or '.join(placement_params['country'])}"): + for node in resulting_copies: + node_address = node.get_rpc_endpoint().split(":")[0] + assert ( + (netmap[node_address]["country"] in placement_params["country"]) + or (netmap[node_address]["country"] in placement_params["country"]) + and (netmap[node_address]["continent"] == placement_params["continent"]) + ), f"The node is selected from the wrong country or continent. Got {netmap[node_address]}" - with allure.step(f"Delete the object from the container"): + with reporter.step(f"Delete the object from the container"): delete_object(wallet=default_wallet, cid=cid, oid=oid, shell=self.shell, endpoint=endpoint) - with allure.step(f"Delete the container"): + with reporter.step(f"Delete the container"): delete_container(wallet=default_wallet, cid=cid, shell=self.shell, endpoint=endpoint) @allure.title("Policy with Multi SELECTs and FILTERs results with 100% of available nodes") @@ -1236,41 +1238,42 @@ class TestPolicy(ClusterTestBase): This test checks object's copies based on container's placement policy with Multi SELECTs and FILTERs results with 100% of available nodes. """ placement_rule = "REP 4 IN AllOne REP 4 IN AllTwo CBF 4 SELECT 2 FROM GEZero AS AllOne SELECT 2 FROM AllCountries AS AllTwo FILTER Country EQ Russia OR Country EQ Sweden OR Country EQ Finland AS AllCountries FILTER Price GE 0 AS GEZero" - expected_params = {"country": ["Russia", "Sweden", "Finland"], "price": "0"} + placement_params = {"country": ["Russia", "Sweden", "Finland"], "price": 0} file_path = generate_file(simple_object_size.value) expected_copies = 4 endpoint = self.cluster.default_rpc_endpoint - with allure.step(f"Create container with policy {placement_rule}"): + with reporter.step(f"Create container with policy {placement_rule}"): cid = create_container( wallet=default_wallet, rule=placement_rule, basic_acl=PUBLIC_ACL, shell=self.shell, endpoint=endpoint ) - with allure.step(f"Check container policy"): + with reporter.step(f"Check container policy"): self.validate_object_policy(default_wallet, placement_rule, cid, endpoint) - with allure.step(f"Put object in container"): + with reporter.step(f"Put object in container"): oid = put_object_to_random_node(default_wallet, file_path, cid, shell=self.shell, cluster=self.cluster) - with allure.step(f"Check object expected copies"): + with reporter.step(f"Check object expected copies"): resulting_copies = get_nodes_with_object(cid, oid, shell=self.shell, nodes=self.cluster.storage_nodes) assert ( len(resulting_copies) == expected_copies ), f"Expected {expected_copies} copies, got {len(resulting_copies)}" - with allure.step(f"Check the object appearance"): + with reporter.step(f"Check the object appearance"): netmap = parse_netmap_output(get_netmap_snapshot(node=resulting_copies[0], shell=self.shell)) netmap = self.get_netmap_param(netmap) - for node in resulting_copies: - node_address = node.get_rpc_endpoint().split(":")[0] - assert (netmap[node_address]["country"] in expected_params["country"]) or ( - netmap[node_address]["price"] in expected_params["price"] - ), f"The node is selected from the wrong country or price. Expected {expected_params} and got {netmap[node_address]}" + with reporter.step(f"Check all node are selected"): + for node in resulting_copies: + node_address = node.get_rpc_endpoint().split(":")[0] + assert (netmap[node_address]["country"] in placement_params["country"]) or ( + int(netmap[node_address]["price"]) >= placement_params["price"] + ), f"The node is selected from the wrong country or with wrong price. Got {netmap[node_address]}" - with allure.step(f"Delete the object from the container"): + with reporter.step(f"Delete the object from the container"): delete_object(wallet=default_wallet, cid=cid, oid=oid, shell=self.shell, endpoint=endpoint) - with allure.step(f"Delete the container"): + with reporter.step(f"Delete the container"): delete_container(wallet=default_wallet, cid=cid, shell=self.shell, endpoint=endpoint) @pytest.mark.sanity @@ -1288,31 +1291,27 @@ class TestPolicy(ClusterTestBase): expected_copies = 2 endpoint = self.cluster.default_rpc_endpoint - with allure.step(f"Create container with policy {placement_rule}"): + with reporter.step(f"Create container with policy {placement_rule}"): cid = create_container( wallet=default_wallet, rule=placement_rule, basic_acl=PUBLIC_ACL, shell=self.shell, endpoint=endpoint ) - with allure.step(f"Check container policy"): + with reporter.step(f"Check container policy"): self.validate_object_policy(default_wallet, placement_rule, cid, endpoint) - with allure.step(f"Put object in container"): + with reporter.step(f"Put object in container"): oid = put_object_to_random_node(default_wallet, file_path, cid, shell=self.shell, cluster=self.cluster) - with allure.step(f"Check object expected copies"): + with reporter.step(f"Check object expected copies"): resulting_copies = get_nodes_with_object(cid, oid, shell=self.shell, nodes=self.cluster.storage_nodes) assert ( len(resulting_copies) == expected_copies ), f"Expected {expected_copies} copies, got {len(resulting_copies)}" - self.check_for_the_uniqueness_of_the_nodes(resulting_copies) - with allure.step(f"Check the object appearance"): - self.check_for_the_uniqueness_of_the_nodes(resulting_copies) - - with allure.step(f"Delete the object from the container"): + with reporter.step(f"Delete the object from the container"): delete_object(wallet=default_wallet, cid=cid, oid=oid, shell=self.shell, endpoint=endpoint) - with allure.step(f"Delete the container"): + with reporter.step(f"Delete the container"): delete_container(wallet=default_wallet, cid=cid, shell=self.shell, endpoint=endpoint) @allure.title("Policy with SELECT results with UNIQUE nodes") @@ -1329,30 +1328,27 @@ class TestPolicy(ClusterTestBase): expected_copies = 2 endpoint = self.cluster.default_rpc_endpoint - with allure.step(f"Create container with policy {placement_rule}"): + with reporter.step(f"Create container with policy {placement_rule}"): cid = create_container( wallet=default_wallet, rule=placement_rule, basic_acl=PUBLIC_ACL, shell=self.shell, endpoint=endpoint ) - with allure.step(f"Check container policy"): + with reporter.step(f"Check container policy"): self.validate_object_policy(default_wallet, placement_rule, cid, endpoint) - with allure.step(f"Put object in container"): + with reporter.step(f"Put object in container"): oid = put_object_to_random_node(default_wallet, file_path, cid, shell=self.shell, cluster=self.cluster) - with allure.step(f"Check object expected copies"): + with reporter.step(f"Check object expected copies"): resulting_copies = get_nodes_with_object(cid, oid, shell=self.shell, nodes=self.cluster.storage_nodes) assert ( len(resulting_copies) == expected_copies ), f"Expected {expected_copies} copies, got {len(resulting_copies)}" - with allure.step(f"Check the object appearance"): - self.check_for_the_uniqueness_of_the_nodes(resulting_copies) - - with allure.step(f"Delete the object from the container"): + with reporter.step(f"Delete the object from the container"): delete_object(wallet=default_wallet, cid=cid, oid=oid, shell=self.shell, endpoint=endpoint) - with allure.step(f"Delete the container"): + with reporter.step(f"Delete the container"): delete_container(wallet=default_wallet, cid=cid, shell=self.shell, endpoint=endpoint) @pytest.mark.sanity @@ -1366,45 +1362,44 @@ class TestPolicy(ClusterTestBase): This test checks object's copies based on container's placement policy with SELECT and Complex FILTER results with UNIQUE nodes. """ placement_rule = "UNIQUE REP 1 IN RUS REP 1 IN RUS CBF 1 SELECT 1 FROM RU AS RUS FILTER Country NE Sweden AS NotSE FILTER @NotSE AND NOT (CountryCode EQ FI) AND Country EQ 'Russia' AS RU" - expected_params = {"country": "Russia"} - unexpected_params = {"country_code": "FI", "country": "Sweden"} + placement_params = {"country_code": "FI", "country": ["Sweden", "Russia"]} file_path = generate_file(simple_object_size.value) expected_copies = 2 endpoint = self.cluster.default_rpc_endpoint - with allure.step(f"Create container with policy {placement_rule}"): + with reporter.step(f"Create container with policy {placement_rule}"): cid = create_container( wallet=default_wallet, rule=placement_rule, basic_acl=PUBLIC_ACL, shell=self.shell, endpoint=endpoint ) - with allure.step(f"Check container policy"): + with reporter.step(f"Check container policy"): self.validate_object_policy(default_wallet, placement_rule, cid, endpoint) - with allure.step(f"Put object in container"): + with reporter.step(f"Put object in container"): oid = put_object_to_random_node(default_wallet, file_path, cid, shell=self.shell, cluster=self.cluster) - with allure.step(f"Check object expected copies"): + with reporter.step(f"Check object expected copies"): resulting_copies = get_nodes_with_object(cid, oid, shell=self.shell, nodes=self.cluster.storage_nodes) assert ( len(resulting_copies) == expected_copies ), f"Expected {expected_copies} copies, got {len(resulting_copies)}" - with allure.step(f"Check the object appearance"): - self.check_for_the_uniqueness_of_the_nodes(resulting_copies) + with reporter.step(f"Check the object appearance"): netmap = parse_netmap_output(get_netmap_snapshot(node=resulting_copies[0], shell=self.shell)) netmap = self.get_netmap_param(netmap) - for node in resulting_copies: - node_address = node.get_rpc_endpoint().split(":")[0] - assert not (unexpected_params["country"] == netmap[node_address]["country"]) or ( - not (unexpected_params["country"] == netmap[node_address]["country"]) - and not (expected_params["country_code"] == netmap[node_address]["country_code"]) - or (expected_params["country"] == netmap[node_address]["country"]) - ), f"The node is selected from the wrong country or country code. Expected {expected_params} and got {netmap[node_address]}" + with reporter.step(f"Check two nodes are selected not from {placement_params['country'][0]}"): + for node in resulting_copies: + node_address = node.get_rpc_endpoint().split(":")[0] + assert not (placement_params["country"][0] == netmap[node_address]["country"]) or ( + not (placement_params["country"][0] == netmap[node_address]["country"]) + and not (placement_params["country_code"] == netmap[node_address]["country_code"]) + and placement_params["country"][1] == netmap[node_address]["country"] + ), f"The node is selected from the wrong country or with wrong country code. Got {netmap[node_address]}" - with allure.step(f"Delete the object from the container"): + with reporter.step(f"Delete the object from the container"): delete_object(wallet=default_wallet, cid=cid, oid=oid, shell=self.shell, endpoint=endpoint) - with allure.step(f"Delete the container"): + with reporter.step(f"Delete the container"): delete_container(wallet=default_wallet, cid=cid, shell=self.shell, endpoint=endpoint) @pytest.mark.sanity @@ -1418,45 +1413,44 @@ class TestPolicy(ClusterTestBase): This test checks object's copies based on container's placement policy with Multi SELECTs and FILTERs results with UNIQUE nodes. """ placement_rule = "UNIQUE REP 1 IN RU REP 1 IN EU REP 1 IN RU CBF 1 SELECT 1 FROM RUS AS RU SELECT 1 FROM EUR AS EU FILTER Country EQ Russia AS RUS FILTER NOT (@RUS) AND Country EQ Sweden OR CountryCode EQ FI AS EUR" - expected_params = {"country": ["Russia", "Sweden"], "country_code": "FI"} - unexpected_params = {"country": "Russia"} + placement_params = {"country": ["Russia", "Sweden"], "country_code": "FI"} file_path = generate_file(simple_object_size.value) expected_copies = 3 endpoint = self.cluster.default_rpc_endpoint - with allure.step(f"Create container with policy {placement_rule}"): + with reporter.step(f"Create container with policy {placement_rule}"): cid = create_container( wallet=default_wallet, rule=placement_rule, basic_acl=PUBLIC_ACL, shell=self.shell, endpoint=endpoint ) - with allure.step(f"Check container policy"): + with reporter.step(f"Check container policy"): self.validate_object_policy(default_wallet, placement_rule, cid, endpoint) - with allure.step(f"Put object in container"): + with reporter.step(f"Put object in container"): oid = put_object_to_random_node(default_wallet, file_path, cid, shell=self.shell, cluster=self.cluster) - with allure.step(f"Check object expected copies"): + with reporter.step(f"Check object expected copies"): resulting_copies = get_nodes_with_object(cid, oid, shell=self.shell, nodes=self.cluster.storage_nodes) assert ( len(resulting_copies) == expected_copies ), f"Expected {expected_copies} copies, got {len(resulting_copies)}" - with allure.step(f"Check the object appearance"): - self.check_for_the_uniqueness_of_the_nodes(resulting_copies) + with reporter.step(f"Check the object appearance"): netmap = parse_netmap_output(get_netmap_snapshot(node=resulting_copies[0], shell=self.shell)) netmap = self.get_netmap_param(netmap) - for node in resulting_copies: - node_address = node.get_rpc_endpoint().split(":")[0] - assert (expected_params["country"][0] == netmap[node_address]["country"]) or ( - not (unexpected_params["country"][0] == netmap[node_address]["country"]) - and (expected_params["country"][1] == netmap[node_address]["country"]) - or (expected_params["country_code"] == netmap[node_address]["country_code"]) - ), f"The node is selected from the wrong country or country code. Expected {expected_params} and got {netmap[node_address]}" + with reporter.step(f"Check three nodes are selected from any country"): + for node in resulting_copies: + node_address = node.get_rpc_endpoint().split(":")[0] + assert (placement_params["country"][0] == netmap[node_address]["country"]) or ( + not (placement_params["country"][0] == netmap[node_address]["country"]) + and (placement_params["country"][1] == netmap[node_address]["country"]) + or (placement_params["country_code"] == netmap[node_address]["country_code"]) + ), f"The node is selected from the wrong country or with wrong country code. Got {netmap[node_address]}" - with allure.step(f"Delete the object from the container"): + with reporter.step(f"Delete the object from the container"): delete_object(wallet=default_wallet, cid=cid, oid=oid, shell=self.shell, endpoint=endpoint) - with allure.step(f"Delete the container"): + with reporter.step(f"Delete the container"): delete_container(wallet=default_wallet, cid=cid, shell=self.shell, endpoint=endpoint) @allure.title("Policy: REP 1 IN SPB REP 1 IN MSK REP 3") @@ -1469,29 +1463,29 @@ class TestPolicy(ClusterTestBase): This test checks object's copies based on container's placement policy: REP 1 IN SPB REP 1 IN MSK REP 3. """ placement_rule = "REP 1 IN SPB REP 1 IN MSK REP 3 CBF 1 SELECT 2 FROM LED AS SPB SELECT 2 FROM MOW AS MSK FILTER Location EQ 'Saint Petersburg (ex Leningrad)' AS LED FILTER Location EQ Moskva AS MOW" - expected_params = {"location": ["Saint Petersburg (ex Leningrad)", "Moskva"]} + placement_params = {"location": ["Saint Petersburg (ex Leningrad)", "Moskva"]} file_path = generate_file(simple_object_size.value) expected_copies = 3 endpoint = self.cluster.default_rpc_endpoint - with allure.step(f"Create container with policy {placement_rule}"): + with reporter.step(f"Create container with policy {placement_rule}"): cid = create_container( wallet=default_wallet, rule=placement_rule, basic_acl=PUBLIC_ACL, shell=self.shell, endpoint=endpoint ) - with allure.step(f"Check container policy"): + with reporter.step(f"Check container policy"): self.validate_object_policy(default_wallet, placement_rule, cid, endpoint) - with allure.step(f"Put object in container"): + with reporter.step(f"Put object in container"): oid = put_object_to_random_node(default_wallet, file_path, cid, shell=self.shell, cluster=self.cluster) - with allure.step(f"Check object expected copies"): + with reporter.step(f"Check object expected copies"): resulting_copies = get_nodes_with_object(cid, oid, shell=self.shell, nodes=self.cluster.storage_nodes) assert len(resulting_copies) >= expected_copies and len(resulting_copies) <= len( self.cluster.storage_nodes ), f"Expected {expected_copies} or {expected_copies + 1} copies, got {len(resulting_copies)}" - with allure.step(f"Check the object appearance"): + with reporter.step(f"Check the object appearance"): netmap = parse_netmap_output(get_netmap_snapshot(node=resulting_copies[0], shell=self.shell)) netmap = self.get_netmap_param(netmap) list_of_location = [] @@ -1499,18 +1493,17 @@ class TestPolicy(ClusterTestBase): node_address = node.get_rpc_endpoint().split(":")[0] list_of_location.append(netmap[node_address]["location"]) - assert ( - expected_params["location"][0] in list_of_location - and expected_params["location"][1] in list_of_location - and len(resulting_copies) > 2 - ), f"The node is selected from the wrong location. Expected {expected_params} and got {netmap[node_address]}" + with reporter.step(f"Check two or three nodes are selected from Russia and from any other country"): + assert ( + placement_params["location"][0] in list_of_location + and placement_params["location"][1] in list_of_location + and len(resulting_copies) > 2 + ), f"The node is selected from the wrong location. Got {netmap[node_address]}" - self.check_for_the_uniqueness_of_the_nodes(resulting_copies) - - with allure.step(f"Delete the object from the container"): + with reporter.step(f"Delete the object from the container"): delete_object(wallet=default_wallet, cid=cid, oid=oid, shell=self.shell, endpoint=endpoint) - with allure.step(f"Delete the container"): + with reporter.step(f"Delete the container"): delete_container(wallet=default_wallet, cid=cid, shell=self.shell, endpoint=endpoint) def validate_object_policy(self, wallet: str, placement_rule: str, cid: str, endpoint: str): @@ -1521,9 +1514,6 @@ class TestPolicy(ClusterTestBase): "'", "" ), f"Expected \n{placement_rule} and got policy \n{got_policy} are the same" - def check_for_the_uniqueness_of_the_nodes(self, nodes: list): - assert len(set(nodes)) == len(nodes), f"The nodes found must be unique, but {nodes}" - def get_netmap_param(self, netmap_info: list[NodeNetmapInfo]) -> dict: dict_external = dict() for node in netmap_info: