diff --git a/pytest_tests/testsuites/network/test_node_management.py b/pytest_tests/testsuites/network/test_node_management.py index 73efc0b..7522300 100644 --- a/pytest_tests/testsuites/network/test_node_management.py +++ b/pytest_tests/testsuites/network/test_node_management.py @@ -203,97 +203,6 @@ class TestNodeManagement(ClusterTestBase): ) wait_object_replication(cid, oid, 4, shell=self.shell, nodes=storage_nodes) - @pytest.mark.parametrize( - "placement_rule,expected_copies", - [ - ("REP 2 IN X CBF 2 SELECT 2 FROM * AS X", 2), - ("REP 2 IN X CBF 1 SELECT 2 FROM * AS X", 2), - ("REP 3 IN X CBF 1 SELECT 3 FROM * AS X", 3), - ("REP 1 IN X CBF 1 SELECT 1 FROM * AS X", 1), - ("REP 1 IN X CBF 2 SELECT 1 FROM * AS X", 1), - ("REP 4 IN X CBF 1 SELECT 4 FROM * AS X", 4), - ("REP 2 IN X CBF 1 SELECT 4 FROM * AS X", 2), - ], - ) - @pytest.mark.node_mgmt - @allure.title("Placement policy (copies={expected_copies}, policy={placement_rule})") - def test_placement_policy(self, default_wallet, placement_rule, expected_copies, simple_object_size: ObjectSize): - """ - This test checks object's copies based on container's placement policy. - """ - wallet = default_wallet - file_path = generate_file(simple_object_size.value) - self.validate_object_copies(wallet, placement_rule, file_path, expected_copies) - - @pytest.mark.parametrize( - "placement_rule,expected_copies,expected_nodes_id", - [ - ("REP 4 IN X CBF 1 SELECT 4 FROM * AS X", 4, {1, 2, 3, 4}), - ( - "REP 1 IN LOC_PLACE CBF 1 SELECT 1 FROM LOC_SW AS LOC_PLACE FILTER Country EQ Sweden AS LOC_SW", - 1, - {3}, - ), - ( - "REP 1 IN SEL_SPB CBF 1 SELECT 1 FROM LOC_SPB AS SEL_SPB FILTER 'UN-LOCODE' EQ 'RU LED' AS LOC_SPB", - 1, - {2}, - ), - ( - "REP 1 IN LOC_SPB_PLACE REP 1 IN LOC_MSK_PLACE CBF 1 SELECT 1 FROM LOC_SPB AS LOC_SPB_PLACE " - "SELECT 1 FROM LOC_MSK AS LOC_MSK_PLACE " - "FILTER 'UN-LOCODE' EQ 'RU LED' AS LOC_SPB FILTER 'UN-LOCODE' EQ 'RU MOW' AS LOC_MSK", - 2, - {1, 2}, - ), - ( - "REP 4 CBF 1 SELECT 4 FROM LOC_EU FILTER Continent EQ Europe AS LOC_EU", - 4, - {1, 2, 3, 4}, - ), - ( - "REP 1 IN SEL_SPB CBF 1 SELECT 1 FROM LOC_SPB AS SEL_SPB " - "FILTER 'UN-LOCODE' NE 'RU MOW' AND 'UN-LOCODE' NE 'SE STO' AND 'UN-LOCODE' NE 'FI HEL' AS LOC_SPB", - 1, - {2}, - ), - ( - "REP 2 IN SEL CBF 1 SELECT 2 FROM LOC_RU AS SEL FILTER SubDivCode NE 'AB' AND SubDivCode NE '18' AS LOC_RU", - 2, - {1, 2}, - ), - ( - "REP 2 IN SEL_EU CBF 1 SELECT 2 FROM LOC_RU AS SEL_EU FILTER Country EQ 'Russia' AS LOC_RU", - 2, - {1, 2}, - ), - ( - "REP 2 IN SEL_EU CBF 1 SELECT 2 FROM LOC_EU AS SEL_EU FILTER Country NE 'Russia' AS LOC_EU", - 2, - {3, 4}, - ), - ], - ) - @pytest.mark.node_mgmt - @allure.title("Placement policy (nodes_id={expected_nodes_id}, policy={placement_rule})") - def test_placement_policy_with_nodes( - self, - default_wallet, - placement_rule, - expected_copies, - expected_nodes_id: set[int], - simple_object_size: ObjectSize, - ): - """ - Based on container's placement policy check that storage nodes are piked correctly and object has - correct copies amount. - """ - wallet = default_wallet - file_path = generate_file(simple_object_size.value) - cid, oid, found_nodes = self.validate_object_copies(wallet, placement_rule, file_path, expected_copies) - - assert found_nodes == expected_nodes_id, f"Expected nodes {expected_nodes_id}, got {found_nodes}" - @pytest.mark.node_mgmt @allure.title("Drop object using control command") def test_drop_object(self, default_wallet, complex_object_size: ObjectSize, simple_object_size: ObjectSize): @@ -401,49 +310,6 @@ class TestNodeManagement(ClusterTestBase): ) self.return_nodes(alive_node) - @allure.step("Validate object has {expected_copies} copies") - def validate_object_copies( - self, wallet: str, placement_rule: str, file_path: str, expected_copies: int - ) -> set[int]: - endpoint = self.cluster.default_rpc_endpoint - cid = create_container(wallet, rule=placement_rule, basic_acl=PUBLIC_ACL, shell=self.shell, endpoint=endpoint) - got_policy = placement_policy_from_container( - get_container(wallet, cid, json_mode=False, shell=self.shell, endpoint=endpoint) - ) - assert got_policy.replace("'", "") == placement_rule.replace( - "'", "" - ), f"Expected \n{placement_rule} and got policy \n{got_policy} are the same" - oid = put_object_to_random_node(wallet, file_path, cid, shell=self.shell, cluster=self.cluster) - nodes = get_nodes_with_object(cid, oid, shell=self.shell, nodes=self.cluster.storage_nodes) - nodes_id = {node.id for node in nodes} - assert len(nodes) == expected_copies, f"Expected {expected_copies} copies, got {len(nodes)}" - return cid, oid, nodes_id - - @allure.step("Wait for node {node} goes online") - def wait_for_node_go_online(self, node: StorageNode) -> None: - timeout, attempts = 5, 20 - for _ in range(attempts): - try: - health_check = storage_node_healthcheck(node) - assert health_check.health_status == "READY" and health_check.network_status == "ONLINE" - return - except Exception as err: - logger.warning(f"Node {node} is not online:\n{err}") - sleep(timeout) - raise AssertionError(f"Node {node} hasn't gone to the READY and ONLINE state after {timeout * attempts} second") - - @allure.step("Wait for {expected_copies} object copies in the wallet") - def wait_for_expected_object_copies(self, wallet: str, cid: str, oid: str, expected_copies: int = 2) -> None: - nodes = self.cluster.storage_nodes - for _ in range(2): - copies = get_simple_object_copies(wallet, cid, oid, self.shell, nodes) - if copies == expected_copies: - break - tick_epoch(self.shell, self.cluster) - sleep(datetime_utils.parse_time(FROSTFS_CONTRACT_CACHE_TIMEOUT)) - else: - raise AssertionError(f"There are no {expected_copies} copies during time") - @allure.step("Wait for object to be dropped") def wait_for_obj_dropped(self, wallet: str, cid: str, oid: str, endpoint: str, checker) -> None: for _ in range(3):