2023-09-25 09:47:24 +00:00
import allure
import pytest
from frostfs_testlib . resources . wellknown_acl import PUBLIC_ACL
2023-10-17 11:00:21 +00:00
from frostfs_testlib . steps . cli . container import create_container , delete_container , get_container
2023-10-18 10:08:15 +00:00
from frostfs_testlib . steps . cli . object import delete_object , put_object_to_random_node
2023-10-20 10:59:15 +00:00
from frostfs_testlib . steps . node_management import get_netmap_snapshot
2023-10-18 10:08:15 +00:00
from frostfs_testlib . steps . storage_policy import get_nodes_with_object , get_nodes_without_object
2023-10-20 10:59:15 +00:00
from frostfs_testlib . storage . dataclasses . frostfs_services import StorageNode
2023-10-17 11:00:21 +00:00
from frostfs_testlib . storage . dataclasses . object_size import ObjectSize
2023-10-20 10:59:15 +00:00
from frostfs_testlib . storage . dataclasses . storage_object_info import NodeNetmapInfo
2023-10-17 11:00:21 +00:00
from frostfs_testlib . testing . cluster_test_base import ClusterTestBase
2023-10-20 10:59:15 +00:00
from frostfs_testlib . utils . cli_utils import parse_netmap_output
2023-10-17 11:00:21 +00:00
from frostfs_testlib . utils . file_utils import generate_file
from pytest_tests . helpers . utility import placement_policy_from_container
2023-10-18 10:08:15 +00:00
from pytest_tests . resources . policy_error_patterns import (
NOT_ENOUGH_TO_SELECT ,
NOT_FOUND_FILTER ,
NOT_FOUND_SELECTOR ,
NOT_PARSE_POLICY ,
)
2023-10-17 11:00:21 +00:00
2023-09-25 09:47:24 +00:00
@pytest.mark.container
@pytest.mark.policy
class TestPolicy ( ClusterTestBase ) :
2023-10-18 10:08:15 +00:00
@allure.title ( " [NEGATIVE] Placement policy: Can ' t parse placement policy " )
def test_placement_policy_negative ( self , default_wallet ) :
2023-09-25 09:47:24 +00:00
"""
2023-10-23 13:13:10 +00:00
Negative test for placement policy : Can ' t parse placement policy.
2023-09-25 09:47:24 +00:00
"""
2023-10-18 10:08:15 +00:00
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 "
2023-09-25 09:47:24 +00:00
endpoint = self . cluster . default_rpc_endpoint
2023-10-18 10:08:15 +00:00
with allure . step ( f " Create container with policy { placement_rule } " ) :
with pytest . raises ( Exception , match = NOT_PARSE_POLICY ) :
cid = create_container (
wallet = default_wallet ,
rule = placement_rule ,
basic_acl = PUBLIC_ACL ,
shell = self . shell ,
endpoint = endpoint ,
)
2023-09-25 09:47:24 +00:00
2023-10-17 11:00:21 +00:00
@allure.title ( " [NEGATIVE] Placement policy: Not enough nodes to SELECT " )
2023-10-18 10:08:15 +00:00
def test_placement_policy_negative_not_enough_nodes_to_select ( self , default_wallet ) :
2023-09-25 09:47:24 +00:00
"""
Negative test for placement policy : Not enough nodes to SELECT .
"""
2023-10-18 10:08:15 +00:00
placement_rule = " REP 2 IN RU SELECT 2 FROM RUS AS RU FILTER Country EQ Russia AND SubDivCode EQ SPE AS RUS "
2023-09-25 09:47:24 +00:00
endpoint = self . cluster . default_rpc_endpoint
2023-10-18 10:08:15 +00:00
with allure . step ( f " Create container with policy { placement_rule } " ) :
with pytest . raises ( Exception , match = NOT_ENOUGH_TO_SELECT ) :
cid = create_container (
wallet = default_wallet ,
rule = placement_rule ,
basic_acl = PUBLIC_ACL ,
shell = self . shell ,
endpoint = endpoint ,
)
2023-10-17 11:00:21 +00:00
@allure.title ( " [NEGATIVE] Placement policy: Filter not found " )
2023-10-18 10:08:15 +00:00
def test_placement_policy_negative_not_enough_nodes_to_filter ( self , default_wallet ) :
2023-09-25 09:47:24 +00:00
"""
Negative test for placement policy : Filter not found .
"""
2023-10-18 10:08:15 +00:00
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 "
2023-09-25 09:47:24 +00:00
endpoint = self . cluster . default_rpc_endpoint
2023-10-18 10:08:15 +00:00
with allure . step ( f " Create container with policy { placement_rule } " ) :
with pytest . raises ( Exception , match = NOT_FOUND_FILTER ) :
cid = create_container (
wallet = default_wallet ,
rule = placement_rule ,
basic_acl = PUBLIC_ACL ,
shell = self . shell ,
endpoint = endpoint ,
)
2023-10-17 11:00:21 +00:00
@allure.title ( " [NEGATIVE] Placement policy: SELECTOR not found " )
2023-10-18 10:08:15 +00:00
def test_placement_policy_negative_not_enough_nodes_to_selector ( self , default_wallet ) :
2023-09-25 09:47:24 +00:00
"""
Negative test for placement policy : Filter not found .
"""
2023-10-18 10:08:15 +00:00
placement_rule = " REP 2 IN HALFIC CBF 1 SELECT 2 FROM GT15 AS HALF FILTER Price GT 15 AS GT15 "
2023-09-25 09:47:24 +00:00
endpoint = self . cluster . default_rpc_endpoint
2023-10-18 10:08:15 +00:00
with allure . step ( f " Create container with policy { placement_rule } " ) :
with pytest . raises ( Exception , match = NOT_FOUND_SELECTOR ) :
cid = create_container (
wallet = default_wallet ,
rule = placement_rule ,
basic_acl = PUBLIC_ACL ,
shell = self . shell ,
endpoint = endpoint ,
)
2023-09-25 09:47:24 +00:00
2023-10-17 11:00:21 +00:00
@allure.title ( " Simple policy results with one node " )
2023-09-25 09:47:24 +00:00
def test_simple_policy_results_with_one_node (
self ,
default_wallet ,
simple_object_size : ObjectSize ,
) :
"""
This test checks object ' s copies based on container ' s placement simple policy results with one node .
"""
2023-10-17 11:00:21 +00:00
placement_rule = " REP 1 REP 1 CBF 1 "
2023-09-25 09:47:24 +00:00
file_path = generate_file ( simple_object_size . value )
2023-10-17 11:00:21 +00:00
expected_copies = 1
endpoint = self . cluster . default_rpc_endpoint
2023-09-25 09:47:24 +00:00
2023-10-17 11:00:21 +00:00
with allure . 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 " ) :
self . validate_object_policy ( default_wallet , placement_rule , cid , endpoint )
with allure . 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 " ) :
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 ) } "
2023-09-25 09:47:24 +00:00
2023-10-17 11:00:21 +00:00
with allure . 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 " ) :
delete_container ( wallet = default_wallet , cid = cid , shell = self . shell , endpoint = endpoint )
2023-09-25 09:47:24 +00:00
2023-10-17 11:00:21 +00:00
@allure.title ( " Policy with SELECT results with one node " )
def test_policy_with_select_results_with_one_node (
2023-09-25 09:47:24 +00:00
self ,
default_wallet ,
simple_object_size : ObjectSize ,
) :
"""
2023-10-17 11:00:21 +00:00
This test checks object ' s copies based on container ' s placement policy with SELECT results with one node .
2023-09-25 09:47:24 +00:00
"""
2023-10-17 11:00:21 +00:00
placement_rule = " REP 1 IN AnyNode REP 1 IN AnyNode CBF 1 SELECT 1 FROM * AS AnyNode "
2023-09-25 09:47:24 +00:00
file_path = generate_file ( simple_object_size . value )
2023-10-17 11:00:21 +00:00
expected_copies = 1
endpoint = self . cluster . default_rpc_endpoint
2023-09-25 09:47:24 +00:00
2023-10-17 11:00:21 +00:00
with allure . 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 " ) :
self . validate_object_policy ( default_wallet , placement_rule , cid , endpoint )
with allure . 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 " ) :
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 ) } "
2023-09-25 09:47:24 +00:00
2023-10-17 11:00:21 +00:00
with allure . 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 " ) :
delete_container ( wallet = default_wallet , cid = cid , shell = self . shell , endpoint = endpoint )
2023-09-25 09:47:24 +00:00
2023-10-17 11:00:21 +00:00
@allure.title ( " Policy with SELECT and FILTER results with one node " )
def test_policy_with_select_and_filter_results_with_one_node (
2023-09-25 09:47:24 +00:00
self ,
default_wallet ,
simple_object_size : ObjectSize ,
) :
"""
2023-10-17 11:00:21 +00:00
This test checks object ' s copies based on container ' s placement policy with SELECT and FILTER results with one node .
2023-09-25 09:47:24 +00:00
"""
2023-10-18 11:57:52 +00:00
placement_rule = " REP 1 IN MyRussianNodes REP 1 IN MyRussianNodes CBF 1 SELECT 1 FROM RussianNodes AS MyRussianNodes FILTER Country EQ ' Russia ' AS RussianNodes "
2023-09-25 09:47:24 +00:00
file_path = generate_file ( simple_object_size . value )
2023-10-17 11:00:21 +00:00
expected_copies = 1
endpoint = self . cluster . default_rpc_endpoint
2023-10-23 13:13:10 +00:00
expected_params = { " country " : " Russia " }
2023-09-25 09:47:24 +00:00
2023-10-17 11:00:21 +00:00
with allure . 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 " ) :
self . validate_object_policy ( default_wallet , placement_rule , cid , endpoint )
with allure . 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 " ) :
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 ) } "
2023-09-25 09:47:24 +00:00
2023-10-23 13:13:10 +00:00
with allure . 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 ' ] } "
2023-10-17 11:00:21 +00:00
with allure . 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 " ) :
delete_container ( wallet = default_wallet , cid = cid , shell = self . shell , endpoint = endpoint )
2023-09-25 09:47:24 +00:00
2023-10-17 11:00:21 +00:00
@allure.title ( " Policy with SELECT and Complex FILTER results with one node " )
def test_policy_with_select_and_complex_filter_results_with_one_nodes (
2023-09-25 09:47:24 +00:00
self ,
default_wallet ,
simple_object_size : ObjectSize ,
) :
"""
2023-10-17 11:00:21 +00:00
This test checks object ' s copies based on container ' s placement policy with SELECT and Complex FILTER results with one node .
2023-09-25 09:47:24 +00:00
"""
2023-10-18 11:57:52 +00:00
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 "
2023-10-23 13:13:10 +00:00
expected_params = { " country " : [ " Russia " , " Sweden " ] }
unexpected_params = { " country " : " Sweden " , " country_code " : " FI " }
2023-09-25 09:47:24 +00:00
file_path = generate_file ( simple_object_size . value )
2023-10-17 11:00:21 +00:00
expected_copies = 1
endpoint = self . cluster . default_rpc_endpoint
2023-09-25 09:47:24 +00:00
2023-10-17 11:00:21 +00:00
with allure . 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 " ) :
self . validate_object_policy ( default_wallet , placement_rule , cid , endpoint )
with allure . 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 " ) :
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 ) } "
2023-09-25 09:47:24 +00:00
2023-10-17 11:00:21 +00:00
with allure . step ( f " Check the object appearance " ) :
2023-10-23 13:13:10 +00:00
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 ] } "
2023-10-17 11:00:21 +00:00
with allure . 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 " ) :
delete_container ( wallet = default_wallet , cid = cid , shell = self . shell , endpoint = endpoint )
2023-09-25 09:47:24 +00:00
2023-10-17 11:00:21 +00:00
@allure.title ( " Policy with Multi SELECTs and FILTERs results with one node " )
def test_policy_with_multi_selects_and_filters_results_with_one_node (
2023-09-25 09:47:24 +00:00
self ,
default_wallet ,
simple_object_size : ObjectSize ,
) :
"""
2023-10-17 11:00:21 +00:00
This test checks object ' s copies based on container ' s placement policy with Multi SELECTs and FILTERs results with one nodes .
2023-09-25 09:47:24 +00:00
"""
2023-10-18 11:57:52 +00:00
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 "
2023-10-23 13:13:10 +00:00
expected_params = { " country " : [ " Sweden " , " Russia " ] , " country_code " : " FI " }
unexpected_params = { " country " : " Russia " }
2023-09-25 09:47:24 +00:00
file_path = generate_file ( simple_object_size . value )
2023-10-18 11:57:52 +00:00
expected_copies = 2
2023-10-17 11:00:21 +00:00
endpoint = self . cluster . default_rpc_endpoint
2023-09-25 09:47:24 +00:00
2023-10-17 11:00:21 +00:00
with allure . 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 " ) :
self . validate_object_policy ( default_wallet , placement_rule , cid , endpoint )
with allure . 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 " ) :
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 " ) :
2023-10-23 13:13:10 +00:00
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 ] } "
2023-09-25 09:47:24 +00:00
2023-10-17 11:00:21 +00:00
with allure . 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 " ) :
delete_container ( wallet = default_wallet , cid = cid , shell = self . shell , endpoint = endpoint )
2023-09-25 09:47:24 +00:00
2023-10-17 11:00:21 +00:00
@allure.title ( " Policy with SELECT and FILTER results with UNIQUE nodes " )
def test_policy_with_select_and_filter_results_with_unique_nodes (
2023-09-25 09:47:24 +00:00
self ,
default_wallet ,
simple_object_size : ObjectSize ,
) :
"""
2023-10-17 11:00:21 +00:00
This test checks object ' s copies based on container ' s placement policy with SELECT and FILTER results with UNIQUE nodes .
2023-09-25 09:47:24 +00:00
"""
2023-10-18 11:57:52 +00:00
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 "
2023-09-25 09:47:24 +00:00
file_path = generate_file ( simple_object_size . value )
2023-10-17 11:00:21 +00:00
expected_copies = 2
endpoint = self . cluster . default_rpc_endpoint
2023-10-23 14:11:53 +00:00
expected_params = { " country " : " Russia " }
2023-09-25 09:47:24 +00:00
2023-10-17 11:00:21 +00:00
with allure . 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 " ) :
self . validate_object_policy ( default_wallet , placement_rule , cid , endpoint )
with allure . 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 " ) :
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 ) } "
2023-09-25 09:47:24 +00:00
2023-10-17 11:00:21 +00:00
with allure . step ( f " Check the object appearance " ) :
2023-10-20 10:59:15 +00:00
self . check_for_the_uniqueness_of_the_nodes ( resulting_copies )
2023-10-23 14:11:53 +00:00
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 ' ] } "
2023-10-17 11:00:21 +00:00
with allure . step ( f " Delete the container " ) :
delete_container ( wallet = default_wallet , cid = cid , shell = self . shell , endpoint = endpoint )
with allure . step ( f " Delete the container " ) :
delete_container ( wallet = default_wallet , cid = cid , shell = self . shell , endpoint = endpoint )
2023-09-25 09:47:24 +00:00
2023-10-17 11:00:21 +00:00
@allure.title ( " Simple policy results with 25 % o f available nodes " )
2023-09-25 09:47:24 +00:00
def test_simple_policy_results_with_25_of_available_nodes (
self ,
default_wallet ,
simple_object_size : ObjectSize ,
) :
"""
This test checks object ' s copies based on container ' s placement policy results with 25 % of available nodes .
"""
2023-10-17 11:00:21 +00:00
placement_rule = " REP 1 CBF 1 "
2023-09-25 09:47:24 +00:00
file_path = generate_file ( simple_object_size . value )
2023-10-17 11:00:21 +00:00
expected_copies = 1
endpoint = self . cluster . default_rpc_endpoint
2023-09-25 09:47:24 +00:00
2023-10-17 11:00:21 +00:00
with allure . 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 " ) :
self . validate_object_policy ( default_wallet , placement_rule , cid , endpoint )
with allure . 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 " ) :
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 " ) :
delete_object ( wallet = default_wallet , cid = cid , oid = oid , shell = self . shell , endpoint = endpoint )
with allure . step ( f " Delete the container " ) :
delete_container ( wallet = default_wallet , cid = cid , shell = self . shell , endpoint = endpoint )
2023-09-25 09:47:24 +00:00
2023-10-17 11:00:21 +00:00
@allure.title ( " Policy with SELECT results with 25 % o f available nodes " )
2023-09-25 09:47:24 +00:00
def test_policy_with_select_results_with_25_of_available_nodes (
self ,
default_wallet ,
simple_object_size : ObjectSize ,
) :
"""
2023-10-17 11:00:21 +00:00
This test checks object ' s copies based on container ' s placement policy with SELECT results with 25 % of available nodes .
2023-09-25 09:47:24 +00:00
"""
2023-10-17 11:00:21 +00:00
placement_rule = " REP 1 IN One CBF 1 SELECT 1 FROM * AS One "
2023-09-25 09:47:24 +00:00
file_path = generate_file ( simple_object_size . value )
2023-10-17 11:00:21 +00:00
expected_copies = 1
endpoint = self . cluster . default_rpc_endpoint
2023-09-25 09:47:24 +00:00
2023-10-17 11:00:21 +00:00
with allure . 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 " ) :
self . validate_object_policy ( default_wallet , placement_rule , cid , endpoint )
with allure . 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 " ) :
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 " ) :
delete_object ( wallet = default_wallet , cid = cid , oid = oid , shell = self . shell , endpoint = endpoint )
with allure . step ( f " Delete the container " ) :
delete_container ( wallet = default_wallet , cid = cid , shell = self . shell , endpoint = endpoint )
2023-09-25 09:47:24 +00:00
2023-10-24 08:43:53 +00:00
@pytest.mark.skip ( reason = " price " )
2023-10-17 11:00:21 +00:00
@allure.title ( " Policy with SELECT and FILTER results with 25 % o f available nodes " )
2023-09-25 09:47:24 +00:00
def test_policy_with_select_and_filter_results_with_25_of_available_nodes (
self ,
default_wallet ,
simple_object_size : ObjectSize ,
) :
"""
This test checks object ' s copies based on container ' s placement policy with SELECT and FILTER results with 25 % of available nodes .
"""
2023-10-17 11:00:21 +00:00
placement_rule = " REP 1 IN Nodes25 SELECT 1 FROM LE10 AS Nodes25 FILTER Price LE 10 AS LE10 "
2023-10-25 11:33:23 +00:00
expected_params = { " price " : 10 }
2023-09-25 09:47:24 +00:00
file_path = generate_file ( simple_object_size . value )
2023-10-17 11:00:21 +00:00
expected_copies = 1
endpoint = self . cluster . default_rpc_endpoint
2023-09-25 09:47:24 +00:00
2023-10-17 11:00:21 +00:00
with allure . 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
)
2023-09-25 09:47:24 +00:00
2023-10-17 11:00:21 +00:00
with allure . step ( f " Check container policy " ) :
self . validate_object_policy ( default_wallet , placement_rule , cid , endpoint )
with allure . 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 " ) :
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 " ) :
2023-10-25 11:33:23 +00:00
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 ] } "
2023-10-17 11:00:21 +00:00
with allure . 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 " ) :
delete_container ( wallet = default_wallet , cid = cid , shell = self . shell , endpoint = endpoint )
2023-10-24 08:43:53 +00:00
@pytest.mark.skip ( reason = " price " )
2023-10-17 11:00:21 +00:00
@allure.title ( " Policy with select and complex filter results with 25 % o f available nodes " )
2023-09-25 09:47:24 +00:00
def test_policy_with_select_and_complex_filter_results_with_25_of_available_nodes (
self ,
default_wallet ,
2023-10-17 11:00:21 +00:00
simple_object_size : ObjectSize ,
2023-09-25 09:47:24 +00:00
) :
"""
2023-10-23 13:13:10 +00:00
This test checks object ' s copies based on container ' s placement policy with SELECT and Complex FILTER results with 25 % of available nodes .
2023-09-25 09:47:24 +00:00
"""
2023-10-17 11:00:21 +00:00
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 "
2023-10-25 11:33:23 +00:00
expected_params = { " price " : [ 10 , 0 ] }
2023-10-17 11:00:21 +00:00
file_path = generate_file ( simple_object_size . value )
expected_copies = 1
endpoint = self . cluster . default_rpc_endpoint
2023-09-25 09:47:24 +00:00
2023-10-17 11:00:21 +00:00
with allure . 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
)
2023-09-25 09:47:24 +00:00
2023-10-17 11:00:21 +00:00
with allure . step ( f " Check container policy " ) :
self . validate_object_policy ( default_wallet , placement_rule , cid , endpoint )
with allure . 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 " ) :
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 " ) :
2023-10-25 11:33:23 +00:00
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 ] } "
2023-10-17 11:00:21 +00:00
with allure . 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 " ) :
delete_container ( wallet = default_wallet , cid = cid , shell = self . shell , endpoint = endpoint )
2023-10-24 08:43:53 +00:00
@pytest.mark.skip ( reason = " price " )
2023-10-17 11:00:21 +00:00
@allure.title ( " Policy with Multi SELECTs and FILTERs results with 25 % o f available nodes " )
def test_policy_with_multi_selects_and_filters_results_with_25_of_available_nodes (
2023-09-25 09:47:24 +00:00
self ,
default_wallet ,
simple_object_size : ObjectSize ,
) :
"""
2023-10-17 11:00:21 +00:00
This test checks object ' s copies based on container ' s placement policy with Multi SELECTs and FILTERs results with 25 % of available nodes .
2023-09-25 09:47:24 +00:00
"""
2023-10-17 11:00:21 +00:00
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 "
2023-10-25 11:33:23 +00:00
expected_params = { " price " : [ 15 , 55 ] }
2023-09-25 09:47:24 +00:00
file_path = generate_file ( simple_object_size . value )
2023-10-17 11:00:21 +00:00
expected_copies = 2
endpoint = self . cluster . default_rpc_endpoint
2023-09-25 09:47:24 +00:00
2023-10-17 11:00:21 +00:00
with allure . 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 " ) :
self . validate_object_policy ( default_wallet , placement_rule , cid , endpoint )
with allure . 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 " ) :
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 " ) :
2023-10-25 11:33:23 +00:00
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 ] } "
2023-10-17 11:00:21 +00:00
self . check_for_the_uniqueness_of_the_nodes ( resulting_copies )
with allure . step ( f " Delete the object from the container " ) :
delete_object ( wallet = default_wallet , cid = cid , oid = oid , shell = self . shell , endpoint = endpoint )
2023-09-25 09:47:24 +00:00
2023-10-17 11:00:21 +00:00
with allure . step ( f " Delete the container " ) :
delete_container ( wallet = default_wallet , cid = cid , shell = self . shell , endpoint = endpoint )
2023-09-25 09:47:24 +00:00
2023-10-17 11:00:21 +00:00
@allure.title ( " Simple policy results with 50 % o f available nodes " )
def test_simple_policy_results_with_50_of_available_nodes (
2023-09-25 09:47:24 +00:00
self ,
default_wallet ,
simple_object_size : ObjectSize ,
) :
"""
2023-10-17 11:00:21 +00:00
This test checks object ' s copies based on container ' s placement simple policy results with 50 % of available nodes .
2023-09-25 09:47:24 +00:00
"""
2023-10-17 11:00:21 +00:00
placement_rule = " REP 2 CBF 1 "
2023-09-25 09:47:24 +00:00
file_path = generate_file ( simple_object_size . value )
2023-10-17 11:00:21 +00:00
expected_copies = 2
endpoint = self . cluster . default_rpc_endpoint
2023-09-25 09:47:24 +00:00
2023-10-17 11:00:21 +00:00
with allure . 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
)
2023-09-25 09:47:24 +00:00
2023-10-17 11:00:21 +00:00
with allure . step ( f " Check container policy " ) :
self . validate_object_policy ( default_wallet , placement_rule , cid , endpoint )
2023-09-25 09:47:24 +00:00
2023-10-17 11:00:21 +00:00
with allure . 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 " ) :
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 " ) :
delete_object ( wallet = default_wallet , cid = cid , oid = oid , shell = self . shell , endpoint = endpoint )
with allure . 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 % o f available nodes " )
def test_policy_with_select_results_with_50_of_available_nodes (
self ,
default_wallet ,
simple_object_size : ObjectSize ,
2023-09-25 09:47:24 +00:00
) :
2023-10-17 11:00:21 +00:00
"""
This test checks object ' s copies based on container ' s placement policy with SELECT results with 50 % of available nodes .
"""
placement_rule = " REP 2 IN HALF CBF 1 SELECT 2 FROM * AS HALF "
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 } " ) :
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 " ) :
self . validate_object_policy ( default_wallet , placement_rule , cid , endpoint )
with allure . 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 " ) :
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 " ) :
delete_object ( wallet = default_wallet , cid = cid , oid = oid , shell = self . shell , endpoint = endpoint )
with allure . step ( f " Delete the container " ) :
delete_container ( wallet = default_wallet , cid = cid , shell = self . shell , endpoint = endpoint )
2023-10-24 08:43:53 +00:00
@pytest.mark.skip ( reason = " price " )
2023-10-17 11:00:21 +00:00
@allure.title ( " Policy with SELECT and FILTER results with 50 % o f available nodes " )
def test_policy_with_select_and_filter_results_with_50_of_available_nodes (
self ,
default_wallet ,
simple_object_size : ObjectSize ,
) :
"""
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 "
2023-10-25 11:23:23 +00:00
expected_params = { " price " : 15 }
2023-10-17 11:00:21 +00:00
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 } " ) :
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 " ) :
self . validate_object_policy ( default_wallet , placement_rule , cid , endpoint )
with allure . 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 " ) :
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 " ) :
2023-10-25 11:23:23 +00:00
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 ] } "
2023-09-25 09:47:24 +00:00
2023-10-17 11:00:21 +00:00
with allure . step ( f " Delete the object from the container " ) :
delete_object ( wallet = default_wallet , cid = cid , oid = oid , shell = self . shell , endpoint = endpoint )
2023-09-25 09:47:24 +00:00
2023-10-17 11:00:21 +00:00
with allure . step ( f " Delete the container " ) :
delete_container ( wallet = default_wallet , cid = cid , shell = self . shell , endpoint = endpoint )
2023-09-25 09:47:24 +00:00
2023-10-24 08:43:53 +00:00
@pytest.mark.skip ( reason = " price " )
2023-10-17 11:00:21 +00:00
@allure.title ( " Policy with SELECT and Complex FILTER results with 50 % o f available nodes " )
def test_policy_with_select_and_complex_filter_results_with_50_of_available_nodes (
self ,
default_wallet ,
simple_object_size : ObjectSize ,
) :
"""
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 "
2023-10-25 11:23:23 +00:00
expected_params = { " price " : 15 }
unexpected_params = { " country_code " : " RU " }
2023-10-17 11:00:21 +00:00
file_path = generate_file ( simple_object_size . value )
expected_copies = 2
2023-09-25 09:47:24 +00:00
endpoint = self . cluster . default_rpc_endpoint
2023-10-17 11:00:21 +00:00
with allure . step ( f " Create container with policy { placement_rule } " ) :
2023-09-25 09:47:24 +00:00
cid = create_container (
2023-10-17 11:00:21 +00:00
wallet = default_wallet , rule = placement_rule , basic_acl = PUBLIC_ACL , shell = self . shell , endpoint = endpoint
)
with allure . step ( f " Check container policy " ) :
self . validate_object_policy ( default_wallet , placement_rule , cid , endpoint )
with allure . 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 " ) :
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 " ) :
2023-10-25 11:23:23 +00:00
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 ] } "
2023-10-17 11:00:21 +00:00
with allure . 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 " ) :
delete_container ( wallet = default_wallet , cid = cid , shell = self . shell , endpoint = endpoint )
2023-10-24 08:43:53 +00:00
@pytest.mark.skip ( reason = " price " )
2023-10-17 11:00:21 +00:00
@allure.title ( " Policy with Multi SELECTs and FILTERs results with 50 % o f available nodes " )
def test_policy_with_multi_selects_and_filters_results_with_50_of_available_nodes (
self ,
default_wallet ,
simple_object_size : ObjectSize ,
) :
"""
This test checks object ' s copies based on container ' s placement policy with Multi SELECTs and FILTERs results with 50 % of available nodes .
"""
2023-10-18 11:57:52 +00:00
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 "
2023-10-25 11:23:23 +00:00
expected_params = { " un_locode " : [ " RU_LED " , " RU_MOW " ] , " price " : [ 15 , 55 ] }
2023-10-17 11:00:21 +00:00
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 } " ) :
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 " ) :
self . validate_object_policy ( default_wallet , placement_rule , cid , endpoint )
with allure . 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 " ) :
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 " ) :
2023-10-25 11:23:23 +00:00
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 ] } "
2023-09-25 09:47:24 +00:00
2023-10-17 11:00:21 +00:00
with allure . 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 " ) :
delete_container ( wallet = default_wallet , cid = cid , shell = self . shell , endpoint = endpoint )
@allure.title ( " Simple policy results with 75 % o f available nodes " )
def test_simple_policy_results_with_75_of_available_nodes (
self ,
default_wallet ,
simple_object_size : ObjectSize ,
) :
"""
This test checks object ' s copies based on container ' s placement simple policy results with 75 % of available nodes .
"""
placement_rule = " REP 1 "
file_path = generate_file ( simple_object_size . value )
2023-10-18 11:57:52 +00:00
expected_copies = 1
2023-10-17 11:00:21 +00:00
endpoint = self . cluster . default_rpc_endpoint
2023-09-25 09:47:24 +00:00
2023-10-17 11:00:21 +00:00
with allure . 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
2023-09-25 09:47:24 +00:00
)
2023-10-17 11:00:21 +00:00
with allure . step ( f " Check container policy " ) :
self . validate_object_policy ( default_wallet , placement_rule , cid , endpoint )
with allure . 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 " ) :
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 " ) :
delete_object ( wallet = default_wallet , cid = cid , oid = oid , shell = self . shell , endpoint = endpoint )
with allure . 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 % o f available nodes " )
def test_policy_with_select_results_with_75_of_available_nodes (
self ,
default_wallet ,
simple_object_size : ObjectSize ,
) :
"""
2023-10-18 10:08:15 +00:00
This test checks object ' s copies based on container ' s placement policy with SELECT results with 75 % of available nodes .
2023-10-17 11:00:21 +00:00
"""
placement_rule = " REP 2 IN DS CBF 1 SELECT 3 IN DISTINCT Country FROM * AS DS "
file_path = generate_file ( simple_object_size . value )
2023-10-18 11:57:52 +00:00
expected_copies = 2
2023-10-17 11:00:21 +00:00
endpoint = self . cluster . default_rpc_endpoint
with allure . 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 " ) :
self . validate_object_policy ( default_wallet , placement_rule , cid , endpoint )
with allure . 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 " ) :
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 " ) :
delete_object ( wallet = default_wallet , cid = cid , oid = oid , shell = self . shell , endpoint = endpoint )
with allure . step ( f " Delete the container " ) :
delete_container ( wallet = default_wallet , cid = cid , shell = self . shell , endpoint = endpoint )
2023-10-24 08:43:53 +00:00
@pytest.mark.skip ( reason = " price " )
2023-10-17 11:00:21 +00:00
@allure.title ( " Policy with SELECT and FILTER results with 75 % o f available nodes " )
def test_policy_with_select_and_filter_results_with_75_of_available_nodes (
self ,
default_wallet ,
simple_object_size : ObjectSize ,
) :
"""
2023-10-18 10:08:15 +00:00
This test checks object ' s copies based on container ' s placement policy with SELECT and FILTER results with 75 % of available nodes .
2023-10-17 11:00:21 +00:00
"""
placement_rule = " REP 2 IN NODES75 SELECT 2 FROM LT65 AS NODES75 FILTER Price LT 65 AS LT65 "
2023-10-25 08:01:02 +00:00
expected_params = { " price " : 65 }
2023-10-17 11:00:21 +00:00
file_path = generate_file ( simple_object_size . value )
2023-10-18 11:57:52 +00:00
expected_copies = 2
2023-10-17 11:00:21 +00:00
endpoint = self . cluster . default_rpc_endpoint
with allure . 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 " ) :
self . validate_object_policy ( default_wallet , placement_rule , cid , endpoint )
with allure . 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 " ) :
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 " ) :
2023-10-25 08:01:02 +00:00
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 ] } "
2023-10-17 11:00:21 +00:00
with allure . 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 " ) :
delete_container ( wallet = default_wallet , cid = cid , shell = self . shell , endpoint = endpoint )
2023-10-24 08:43:53 +00:00
@pytest.mark.skip ( reason = " price " )
2023-10-17 11:00:21 +00:00
@allure.title ( " Policy with SELECT and Complex FILTER results with 75 % o f available nodes " )
2023-10-23 13:13:10 +00:00
def test_policy_with_select_and_complex_filter_results_with_75_of_available_nodes (
2023-10-17 11:00:21 +00:00
self ,
default_wallet ,
simple_object_size : ObjectSize ,
) :
"""
2023-10-23 13:13:10 +00:00
This test checks object ' s copies based on container ' s placement policy with SELECT and Complex FILTER results with 75 % of available nodes .
2023-10-17 11:00:21 +00:00
"""
2023-10-25 08:01:02 +00:00
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 " }
2023-10-17 11:00:21 +00:00
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 } " ) :
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 " ) :
self . validate_object_policy ( default_wallet , placement_rule , cid , endpoint )
with allure . 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 " ) :
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 " ) :
2023-10-25 08:01:02 +00:00
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 ] } "
2023-10-17 11:00:21 +00:00
with allure . 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 " ) :
delete_container ( wallet = default_wallet , cid = cid , shell = self . shell , endpoint = endpoint )
2023-10-24 08:43:53 +00:00
@pytest.mark.skip ( reason = " price " )
2023-10-17 11:00:21 +00:00
@allure.title ( " Policy with Multi SELECTs and FILTERs results with 75 % o f available nodes " )
2023-10-23 13:13:10 +00:00
def test_policy_with_multi_selects_and_filters_results_with_75_of_available_nodes (
2023-10-17 11:00:21 +00:00
self ,
default_wallet ,
simple_object_size : ObjectSize ,
) :
"""
2023-10-23 13:13:10 +00:00
This test checks object ' s copies based on container ' s placement policy with Multi SELECTs and FILTERs results with 75 % of available nodes .
2023-10-17 11:00:21 +00:00
"""
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 "
2023-10-25 08:01:02 +00:00
expected_params = { " price " : [ 65 , 10 ] }
unexpected_params = { " continent " : " America " }
2023-10-17 11:00:21 +00:00
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 } " ) :
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 " ) :
self . validate_object_policy ( default_wallet , placement_rule , cid , endpoint )
with allure . 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 " ) :
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 " ) :
2023-10-25 08:01:02 +00:00
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 ] } "
2023-10-17 11:00:21 +00:00
with allure . 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 " ) :
delete_container ( wallet = default_wallet , cid = cid , shell = self . shell , endpoint = endpoint )
@allure.title ( " Simple policy results with 100 % o f available nodes " )
def test_simple_policy_results_with_100_of_available_nodes (
self ,
default_wallet ,
simple_object_size : ObjectSize ,
) :
"""
This test checks object ' s copies based on container ' s placement simple policy results with 100 % of available nodes .
"""
placement_rule = " REP 4 "
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 } " ) :
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 " ) :
self . validate_object_policy ( default_wallet , placement_rule , cid , endpoint )
with allure . 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 " ) :
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 " ) :
delete_object ( wallet = default_wallet , cid = cid , oid = oid , shell = self . shell , endpoint = endpoint )
with allure . 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 % o f available nodes " )
def test_policy_with_select_results_with_100_of_available_nodes (
self ,
default_wallet ,
simple_object_size : ObjectSize ,
) :
"""
This test checks object ' s copies based on container ' s placement policy with SELECT results with 100 % of available nodes .
"""
placement_rule = " REP 1 IN All SELECT 4 FROM * AS All "
file_path = generate_file ( simple_object_size . value )
2023-10-18 11:57:52 +00:00
expected_copies = 1
2023-10-17 11:00:21 +00:00
endpoint = self . cluster . default_rpc_endpoint
with allure . 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 " ) :
self . validate_object_policy ( default_wallet , placement_rule , cid , endpoint )
with allure . 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 " ) :
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 " ) :
delete_object ( wallet = default_wallet , cid = cid , oid = oid , shell = self . shell , endpoint = endpoint )
with allure . step ( f " Delete the container " ) :
delete_container ( wallet = default_wallet , cid = cid , shell = self . shell , endpoint = endpoint )
2023-10-24 08:43:53 +00:00
@pytest.mark.skip ( reason = " price " )
2023-10-17 11:00:21 +00:00
@allure.title ( " Policy with SELECT and FILTER results with 100 % o f available nodes " )
def test_policy_with_select_and_filter_results_with_100_of_available_nodes (
self ,
default_wallet ,
simple_object_size : ObjectSize ,
) :
"""
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 "
2023-10-25 08:01:02 +00:00
expected_params = { " price " : 0 }
2023-10-17 11:00:21 +00:00
file_path = generate_file ( simple_object_size . value )
2023-10-18 11:57:52 +00:00
expected_copies = 1
2023-10-17 11:00:21 +00:00
endpoint = self . cluster . default_rpc_endpoint
with allure . 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 " ) :
self . validate_object_policy ( default_wallet , placement_rule , cid , endpoint )
with allure . 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 " ) :
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 " ) :
2023-10-24 08:43:53 +00:00
self . check_for_the_uniqueness_of_the_nodes ( resulting_copies )
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 ]
2023-10-25 11:23:23 +00:00
assert netmap [ node_address ] [ " price " ] > = int (
expected_params [ " price " ]
2023-10-24 08:43:53 +00:00
) , f " The node is selected from the wrong price. Expected { expected_params } and got { netmap [ node_address ] } "
2023-10-17 11:00:21 +00:00
with allure . 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 " ) :
delete_container ( wallet = default_wallet , cid = cid , shell = self . shell , endpoint = endpoint )
@allure.title ( " Policy with SELECT and Complex FILTER results with 100 % o f available nodes " )
def test_policy_with_select_and_complex_filter_results_with_100_of_available_nodes (
self ,
default_wallet ,
simple_object_size : ObjectSize ,
) :
"""
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 "
2023-10-24 08:43:53 +00:00
expected_params = { " country " : [ " Russia " , " Sweden " , " Finland " ] , " continent " : " Europe " }
2023-10-17 11:00:21 +00:00
file_path = generate_file ( simple_object_size . value )
2023-10-18 11:57:52 +00:00
expected_copies = 2
2023-10-17 11:00:21 +00:00
endpoint = self . cluster . default_rpc_endpoint
with allure . 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 " ) :
self . validate_object_policy ( default_wallet , placement_rule , cid , endpoint )
with allure . 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 " ) :
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 " ) :
2023-10-24 08:43:53 +00:00
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 ] } "
2023-10-17 11:00:21 +00:00
with allure . 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 " ) :
delete_container ( wallet = default_wallet , cid = cid , shell = self . shell , endpoint = endpoint )
@allure.title ( " Policy with Multi SELECTs and FILTERs results with 100 % o f available nodes " )
def test_policy_with_multi_selects_and_filters_results_with_100_of_available_nodes (
self ,
default_wallet ,
simple_object_size : ObjectSize ,
) :
"""
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 "
2023-10-24 08:43:53 +00:00
expected_params = { " country " : [ " Russia " , " Sweden " , " Finland " ] , " price " : " 0 " }
2023-10-17 11:00:21 +00:00
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 } " ) :
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 " ) :
self . validate_object_policy ( default_wallet , placement_rule , cid , endpoint )
with allure . 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 " ) :
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 " ) :
2023-10-24 08:43:53 +00:00
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 ] } "
2023-10-17 11:00:21 +00:00
with allure . 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 " ) :
delete_container ( wallet = default_wallet , cid = cid , shell = self . shell , endpoint = endpoint )
@allure.title ( " Simple policy results with UNIQUE nodes " )
2023-10-23 13:13:10 +00:00
def test_simple_policy_results_with_unique_nodes (
2023-10-17 11:00:21 +00:00
self ,
default_wallet ,
simple_object_size : ObjectSize ,
) :
"""
This test checks object ' s copies based on container ' s placement simple policy results with UNIQUE nodes .
"""
placement_rule = " UNIQUE REP 1 REP 1 CBF 1 "
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 } " ) :
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 " ) :
self . validate_object_policy ( default_wallet , placement_rule , cid , endpoint )
with allure . 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 " ) :
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 " ) :
2023-10-20 10:59:15 +00:00
self . check_for_the_uniqueness_of_the_nodes ( resulting_copies )
2023-10-17 11:00:21 +00:00
with allure . 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 " ) :
delete_container ( wallet = default_wallet , cid = cid , shell = self . shell , endpoint = endpoint )
@allure.title ( " Policy with SELECT results with UNIQUE nodes " )
def test_policy_with_select_results_with_unique_nodes (
self ,
default_wallet ,
simple_object_size : ObjectSize ,
) :
"""
This test checks object ' s copies based on container ' s placement policy with SELECT results with UNIQUE nodes .
"""
placement_rule = " UNIQUE REP 1 IN AnyNode REP 1 IN AnyNode CBF 1 SELECT 1 FROM * AS AnyNode "
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 } " ) :
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 " ) :
self . validate_object_policy ( default_wallet , placement_rule , cid , endpoint )
with allure . 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 " ) :
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 " ) :
delete_object ( wallet = default_wallet , cid = cid , oid = oid , shell = self . shell , endpoint = endpoint )
with allure . 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 UNIQUE nodes " )
def test_policy_with_select_and_complex_filter_results_with_unique_nodes (
self ,
default_wallet ,
simple_object_size : ObjectSize ,
) :
"""
This test checks object ' s copies based on container ' s placement policy with SELECT and Complex FILTER results with UNIQUE nodes .
"""
2023-10-18 11:57:52 +00:00
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 "
2023-10-23 14:11:53 +00:00
expected_params = { " country " : " Russia " }
unexpected_params = { " country_code " : " FI " , " country " : " Sweden " }
2023-10-17 11:00:21 +00:00
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 } " ) :
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 " ) :
self . validate_object_policy ( default_wallet , placement_rule , cid , endpoint )
with allure . 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 " ) :
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 )
2023-10-23 14:11:53 +00:00
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 ] } "
2023-10-17 11:00:21 +00:00
with allure . 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 " ) :
delete_container ( wallet = default_wallet , cid = cid , shell = self . shell , endpoint = endpoint )
@allure.title ( " Policy with Multi SELECTs and FILTERs results with UNIQUE nodes " )
def test_policy_with_multi_selects_and_filters_results_with_unique_nodes (
self ,
default_wallet ,
simple_object_size : ObjectSize ,
) :
"""
This test checks object ' s copies based on container ' s placement policy with Multi SELECTs and FILTERs results with UNIQUE nodes .
"""
2023-10-18 11:57:52 +00:00
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 "
2023-10-23 14:11:53 +00:00
expected_params = { " country " : [ " Russia " , " Sweden " ] , " country_code " : " FI " }
unexpected_params = { " country " : " Russia " }
2023-10-17 11:00:21 +00:00
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 } " ) :
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 " ) :
self . validate_object_policy ( default_wallet , placement_rule , cid , endpoint )
with allure . 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 " ) :
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 )
2023-10-23 14:11:53 +00:00
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 ] } "
2023-10-17 11:00:21 +00:00
with allure . 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 " ) :
delete_container ( wallet = default_wallet , cid = cid , shell = self . shell , endpoint = endpoint )
2023-10-18 10:54:58 +00:00
@allure.title ( " Policy: REP 1 IN SPB REP 1 IN MSK REP 3 " )
def test_policy_rep_1_in_spb_rep_1_in_msk_rep_3 (
self ,
default_wallet ,
simple_object_size : ObjectSize ,
) :
"""
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 "
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 } " ) :
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 " ) :
self . validate_object_policy ( default_wallet , placement_rule , cid , endpoint )
with allure . 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 " ) :
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 " ) :
nodes_without_object = get_nodes_without_object (
wallet = default_wallet , cid = cid , oid = oid , shell = self . shell , nodes = self . cluster . storage_nodes
)
assert set ( resulting_copies ) | set ( nodes_without_object ) == set (
self . cluster . storage_nodes
) , f " nodes filling error: nodes with object = { resulting_copies } , nodes witout object = { nodes_without_object } "
self . check_for_the_uniqueness_of_the_nodes ( resulting_copies )
with allure . 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 " ) :
delete_container ( wallet = default_wallet , cid = cid , shell = self . shell , endpoint = endpoint )
2023-10-17 11:00:21 +00:00
def validate_object_policy ( self , wallet : str , placement_rule : str , cid : str , endpoint : str ) :
got_policy = placement_policy_from_container (
get_container ( wallet , cid , json_mode = False , shell = self . shell , endpoint = endpoint )
)
2023-10-18 10:54:58 +00:00
assert got_policy . replace ( " ' " , " " ) == placement_rule . replace (
2023-10-17 11:00:21 +00:00
" ' " , " "
) , 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 } "
2023-10-23 13:13:10 +00:00
def get_netmap_param ( self , netmap_info : list [ NodeNetmapInfo ] ) - > dict :
dict_external = dict ( )
for node in netmap_info :
external_adress = node . external_address [ 0 ] . split ( " / " ) [ 2 ]
dict_external [ external_adress ] = {
" country " : node . country ,
" country_code " : node . country_code ,
" price " : node . price ,
2023-10-24 08:43:53 +00:00
" continent " : node . continent ,
2023-10-25 11:23:23 +00:00
" un_locode " : node . un_locode ,
2023-10-23 13:13:10 +00:00
}
return dict_external