forked from TrueCloudLab/frostfs-testcases
[#105] Change common ACL constants
Signed-off-by: Elizaveta Chichindaeva <elizaveta@nspcc.ru>
This commit is contained in:
parent
da64379eef
commit
38e6776fc1
32 changed files with 331 additions and 289 deletions
|
@ -706,7 +706,7 @@ def delete_container(cid: str, private_key: str):
|
||||||
|
|
||||||
deleteContainerCmd = (
|
deleteContainerCmd = (
|
||||||
f'{NEOFS_CLI_EXEC} --rpc-endpoint {NEOFS_ENDPOINT} --wif {private_key} '
|
f'{NEOFS_CLI_EXEC} --rpc-endpoint {NEOFS_ENDPOINT} --wif {private_key} '
|
||||||
f'container delete --cid {cid} --await'
|
f'container delete --cid {cid}'
|
||||||
)
|
)
|
||||||
logger.info(f"Cmd: {deleteContainerCmd}")
|
logger.info(f"Cmd: {deleteContainerCmd}")
|
||||||
_cmd_run(deleteContainerCmd)
|
_cmd_run(deleteContainerCmd)
|
||||||
|
|
|
@ -11,6 +11,7 @@ from neo3 import wallet
|
||||||
from common import *
|
from common import *
|
||||||
import rpc_client
|
import rpc_client
|
||||||
import contract
|
import contract
|
||||||
|
from wrappers import run_sh_with_passwd_contract
|
||||||
|
|
||||||
ROBOT_AUTO_KEYWORDS = False
|
ROBOT_AUTO_KEYWORDS = False
|
||||||
|
|
||||||
|
@ -29,7 +30,7 @@ def withdraw_mainnet_gas(wallet: str, address: str, scripthash: str, amount: int
|
||||||
)
|
)
|
||||||
|
|
||||||
logger.info(f"Executing command: {cmd}")
|
logger.info(f"Executing command: {cmd}")
|
||||||
out = _run_sh_with_passwd('', cmd)
|
out = (run_sh_with_passwd_contract('', cmd, expect_confirmation=True)).decode('utf-8')
|
||||||
logger.info(f"Command completed with output: {out}")
|
logger.info(f"Command completed with output: {out}")
|
||||||
m = re.match(r'^Sent invocation transaction (\w{64})$', out)
|
m = re.match(r'^Sent invocation transaction (\w{64})$', out)
|
||||||
if m is None:
|
if m is None:
|
||||||
|
|
|
@ -7,7 +7,7 @@ Variables wellknown_acl.py
|
||||||
Create Private Container
|
Create Private Container
|
||||||
[Arguments] ${USER_KEY}
|
[Arguments] ${USER_KEY}
|
||||||
Log Create Private Container
|
Log Create Private Container
|
||||||
${PRIV_CID_GEN} = Create container ${USER_KEY} ${PRIVATE_ACL} ${COMMON_PLACEMENT_RULE}
|
${PRIV_CID_GEN} = Create container ${USER_KEY} ${PRIVATE_ACL_F} ${COMMON_PLACEMENT_RULE}
|
||||||
Wait Until Keyword Succeeds ${MORPH_BLOCK_TIME} ${CONTAINER_WAIT_INTERVAL}
|
Wait Until Keyword Succeeds ${MORPH_BLOCK_TIME} ${CONTAINER_WAIT_INTERVAL}
|
||||||
... Container Existing ${USER_KEY} ${PRIV_CID_GEN}
|
... Container Existing ${USER_KEY} ${PRIV_CID_GEN}
|
||||||
[Return] ${PRIV_CID_GEN}
|
[Return] ${PRIV_CID_GEN}
|
||||||
|
@ -15,7 +15,7 @@ Create Private Container
|
||||||
Create Public Container
|
Create Public Container
|
||||||
[Arguments] ${USER_KEY}
|
[Arguments] ${USER_KEY}
|
||||||
Log Create Public Container
|
Log Create Public Container
|
||||||
${PUBLIC_CID_GEN} = Create container ${USER_KEY} ${PUBLIC_ACL} ${COMMON_PLACEMENT_RULE}
|
${PUBLIC_CID_GEN} = Create container ${USER_KEY} ${PUBLIC_ACL_F} ${COMMON_PLACEMENT_RULE}
|
||||||
Wait Until Keyword Succeeds ${MORPH_BLOCK_TIME} ${CONTAINER_WAIT_INTERVAL}
|
Wait Until Keyword Succeeds ${MORPH_BLOCK_TIME} ${CONTAINER_WAIT_INTERVAL}
|
||||||
... Container Existing ${USER_KEY} ${PUBLIC_CID_GEN}
|
... Container Existing ${USER_KEY} ${PUBLIC_CID_GEN}
|
||||||
[Return] ${PUBLIC_CID_GEN}
|
[Return] ${PUBLIC_CID_GEN}
|
||||||
|
@ -23,7 +23,7 @@ Create Public Container
|
||||||
Create Read-Only Container
|
Create Read-Only Container
|
||||||
[Arguments] ${USER_KEY}
|
[Arguments] ${USER_KEY}
|
||||||
Log Create Read-Only Container
|
Log Create Read-Only Container
|
||||||
${READONLY_CID_GEN} = Create container ${USER_KEY} ${READONLY_ACL} ${COMMON_PLACEMENT_RULE}
|
${READONLY_CID_GEN} = Create container ${USER_KEY} ${READONLY_ACL_F} ${COMMON_PLACEMENT_RULE}
|
||||||
Wait Until Keyword Succeeds ${MORPH_BLOCK_TIME} ${CONTAINER_WAIT_INTERVAL}
|
Wait Until Keyword Succeeds ${MORPH_BLOCK_TIME} ${CONTAINER_WAIT_INTERVAL}
|
||||||
... Container Existing ${USER_KEY} ${READONLY_CID_GEN}
|
... Container Existing ${USER_KEY} ${READONLY_CID_GEN}
|
||||||
[Return] ${READONLY_CID_GEN}
|
[Return] ${READONLY_CID_GEN}
|
||||||
|
|
|
@ -10,7 +10,7 @@ ${FILE_OTH_HEADER} = key1=oth,key2=oth
|
||||||
*** Keywords ***
|
*** Keywords ***
|
||||||
Create Container Public
|
Create Container Public
|
||||||
[Arguments] ${USER_KEY}
|
[Arguments] ${USER_KEY}
|
||||||
${PUBLIC_CID_GEN} = Create container ${USER_KEY} 0x0FFFFFFF ${COMMON_PLACEMENT_RULE}
|
${PUBLIC_CID_GEN} = Create container ${USER_KEY} ${PUBLIC_ACL} ${COMMON_PLACEMENT_RULE}
|
||||||
Wait Until Keyword Succeeds ${MORPH_BLOCK_TIME} ${CONTAINER_WAIT_INTERVAL}
|
Wait Until Keyword Succeeds ${MORPH_BLOCK_TIME} ${CONTAINER_WAIT_INTERVAL}
|
||||||
... Container Existing ${USER_KEY} ${PUBLIC_CID_GEN}
|
... Container Existing ${USER_KEY} ${PUBLIC_CID_GEN}
|
||||||
[Return] ${PUBLIC_CID_GEN}
|
[Return] ${PUBLIC_CID_GEN}
|
||||||
|
|
|
@ -21,7 +21,7 @@ ${EACL_ERR_MSG} = *
|
||||||
Create Container Public
|
Create Container Public
|
||||||
[Arguments] ${USER_KEY}
|
[Arguments] ${USER_KEY}
|
||||||
Log Create Public Container
|
Log Create Public Container
|
||||||
${PUBLIC_CID_GEN} = Create container ${USER_KEY} 0x4FFFFFFF ${COMMON_PLACEMENT_RULE}
|
${PUBLIC_CID_GEN} = Create container ${USER_KEY} ${PUBLIC_ACL} ${COMMON_PLACEMENT_RULE}
|
||||||
Wait Until Keyword Succeeds ${MORPH_BLOCK_TIME} ${CONTAINER_WAIT_INTERVAL}
|
Wait Until Keyword Succeeds ${MORPH_BLOCK_TIME} ${CONTAINER_WAIT_INTERVAL}
|
||||||
... Container Existing ${USER_KEY} ${PUBLIC_CID_GEN}
|
... Container Existing ${USER_KEY} ${PUBLIC_CID_GEN}
|
||||||
[Return] ${PUBLIC_CID_GEN}
|
[Return] ${PUBLIC_CID_GEN}
|
||||||
|
|
|
@ -26,4 +26,4 @@ Prepare container
|
||||||
${CONTAINER_FEE} = Evaluate ${NEOFS_BALANCE} - ${NEW_NEOFS_BALANCE}
|
${CONTAINER_FEE} = Evaluate ${NEOFS_BALANCE} - ${NEW_NEOFS_BALANCE}
|
||||||
Log Container fee is ${CONTAINER_FEE}
|
Log Container fee is ${CONTAINER_FEE}
|
||||||
|
|
||||||
Set Global Variable ${CID} ${CID}
|
[Return] ${CID}
|
||||||
|
|
|
@ -31,27 +31,24 @@ Basic ACL Operations for Private Container
|
||||||
[Teardown] Teardown acl_basic_private_container
|
[Teardown] Teardown acl_basic_private_container
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
*** Keywords ***
|
*** Keywords ***
|
||||||
|
|
||||||
Check Private Container
|
Check Private Container
|
||||||
[Arguments] ${USER_KEY} ${FILE_S} ${PRIV_CID} ${OTHER_KEY}
|
[Arguments] ${USER_KEY} ${FILE_S} ${PRIV_CID} ${OTHER_KEY}
|
||||||
|
|
||||||
# Put
|
# Put
|
||||||
${S_OID_USER} = Put object ${USER_KEY} ${FILE_S} ${PRIV_CID} ${EMPTY} ${EMPTY}
|
${S_OID_USER} = Put Object ${USER_KEY} ${FILE_S} ${PRIV_CID} ${EMPTY} ${EMPTY}
|
||||||
Run Keyword And Expect Error *
|
Run Keyword And Expect Error *
|
||||||
... Put object ${OTHER_KEY} ${FILE_S} ${PRIV_CID} ${EMPTY} ${EMPTY}
|
... Put object ${OTHER_KEY} ${FILE_S} ${PRIV_CID} ${EMPTY} ${EMPTY}
|
||||||
Run Keyword And Expect Error *
|
${S_OID_SYS_IR} = Put Object ${NEOFS_IR_WIF} ${FILE_S} ${PRIV_CID} ${EMPTY} ${EMPTY}
|
||||||
... Put object ${NEOFS_IR_WIF} ${FILE_S} ${PRIV_CID} ${EMPTY} ${EMPTY}
|
${S_OID_SYS_SN} = Put Object ${NEOFS_SN_WIF} ${FILE_S} ${PRIV_CID} ${EMPTY} ${EMPTY}
|
||||||
${S_OID_SYS_SN} = Put object ${NEOFS_SN_WIF} ${FILE_S} ${PRIV_CID} ${EMPTY} ${EMPTY}
|
|
||||||
|
|
||||||
# Get
|
# Get
|
||||||
Get object ${USER_KEY} ${PRIV_CID} ${S_OID_USER} ${EMPTY} s_file_read
|
Get Object ${USER_KEY} ${PRIV_CID} ${S_OID_USER} ${EMPTY} s_file_read
|
||||||
Run Keyword And Expect Error *
|
Run Keyword And Expect Error *
|
||||||
... Get object ${OTHER_KEY} ${PRIV_CID} ${S_OID_USER} ${EMPTY} s_file_read
|
... Get object ${OTHER_KEY} ${PRIV_CID} ${S_OID_USER} ${EMPTY} s_file_read
|
||||||
Get object ${NEOFS_IR_WIF} ${PRIV_CID} ${S_OID_USER} ${EMPTY} s_file_read
|
Get Object ${NEOFS_IR_WIF} ${PRIV_CID} ${S_OID_USER} ${EMPTY} s_file_read
|
||||||
Get object ${NEOFS_SN_WIF} ${PRIV_CID} ${S_OID_USER} ${EMPTY} s_file_read
|
Get Object ${NEOFS_SN_WIF} ${PRIV_CID} ${S_OID_USER} ${EMPTY} s_file_read
|
||||||
|
|
||||||
# Get Range
|
# Get Range
|
||||||
Get Range ${USER_KEY} ${PRIV_CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
Get Range ${USER_KEY} ${PRIV_CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
||||||
|
@ -63,27 +60,27 @@ Check Private Container
|
||||||
... Get Range ${NEOFS_SN_WIF} ${PRIV_CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
... Get Range ${NEOFS_SN_WIF} ${PRIV_CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
||||||
|
|
||||||
# Get Range Hash
|
# Get Range Hash
|
||||||
Get Range Hash ${USER_KEY} ${PRIV_CID} ${S_OID_USER} ${EMPTY} 0:256
|
Get Range hash ${USER_KEY} ${PRIV_CID} ${S_OID_USER} ${EMPTY} 0:256
|
||||||
Run Keyword And Expect Error *
|
Run Keyword And Expect Error *
|
||||||
... Get Range Hash ${OTHER_KEY} ${PRIV_CID} ${S_OID_USER} ${EMPTY} 0:256
|
... Get Range Hash ${OTHER_KEY} ${PRIV_CID} ${S_OID_USER} ${EMPTY} 0:256
|
||||||
Get Range Hash ${NEOFS_IR_WIF} ${PRIV_CID} ${S_OID_USER} ${EMPTY} 0:256
|
Get Range hash ${NEOFS_IR_WIF} ${PRIV_CID} ${S_OID_USER} ${EMPTY} 0:256
|
||||||
Get Range Hash ${NEOFS_SN_WIF} ${PRIV_CID} ${S_OID_USER} ${EMPTY} 0:256
|
Get Range hash ${NEOFS_SN_WIF} ${PRIV_CID} ${S_OID_USER} ${EMPTY} 0:256
|
||||||
|
|
||||||
# Search
|
# Search
|
||||||
@{S_OBJ_PRIV} = Create List ${S_OID_USER} ${S_OID_SYS_SN}
|
@{S_OBJ_PRIV} = Create List ${S_OID_USER} ${S_OID_SYS_SN} ${S_OID_SYS_IR}
|
||||||
Search object ${USER_KEY} ${PRIV_CID} --root ${EMPTY} ${EMPTY} ${S_OBJ_PRIV}
|
Search Object ${USER_KEY} ${PRIV_CID} --root ${EMPTY} ${EMPTY} ${S_OBJ_PRIV}
|
||||||
Run Keyword And Expect Error *
|
Run Keyword And Expect Error *
|
||||||
... Search object ${OTHER_KEY} ${PRIV_CID} --root ${EMPTY} ${EMPTY} ${S_OBJ_PRIV}
|
... Search object ${OTHER_KEY} ${PRIV_CID} --root ${EMPTY} ${EMPTY} ${S_OBJ_PRIV}
|
||||||
Search object ${NEOFS_IR_WIF} ${PRIV_CID} --root ${EMPTY} ${EMPTY} ${S_OBJ_PRIV}
|
Search Object ${NEOFS_IR_WIF} ${PRIV_CID} --root ${EMPTY} ${EMPTY} ${S_OBJ_PRIV}
|
||||||
Search object ${NEOFS_SN_WIF} ${PRIV_CID} --root ${EMPTY} ${EMPTY} ${S_OBJ_PRIV}
|
Search Object ${NEOFS_SN_WIF} ${PRIV_CID} --root ${EMPTY} ${EMPTY} ${S_OBJ_PRIV}
|
||||||
|
|
||||||
|
|
||||||
# Head
|
# Head
|
||||||
Head object ${USER_KEY} ${PRIV_CID} ${S_OID_USER} ${EMPTY} ${EMPTY}
|
Head Object ${USER_KEY} ${PRIV_CID} ${S_OID_USER} ${EMPTY} ${EMPTY}
|
||||||
Run Keyword And Expect Error *
|
Run Keyword And Expect Error *
|
||||||
... Head object ${OTHER_KEY} ${PRIV_CID} ${S_OID_USER} ${EMPTY} ${EMPTY}
|
... Head object ${OTHER_KEY} ${PRIV_CID} ${S_OID_USER} ${EMPTY} ${EMPTY}
|
||||||
Head object ${NEOFS_IR_WIF} ${PRIV_CID} ${S_OID_USER} ${EMPTY} ${EMPTY}
|
Head Object ${NEOFS_IR_WIF} ${PRIV_CID} ${S_OID_USER} ${EMPTY} ${EMPTY}
|
||||||
Head object ${NEOFS_SN_WIF} ${PRIV_CID} ${S_OID_USER} ${EMPTY} ${EMPTY}
|
Head Object ${NEOFS_SN_WIF} ${PRIV_CID} ${S_OID_USER} ${EMPTY} ${EMPTY}
|
||||||
|
|
||||||
|
|
||||||
# Delete
|
# Delete
|
||||||
|
@ -93,4 +90,4 @@ Check Private Container
|
||||||
... Delete object ${NEOFS_IR_WIF} ${PRIV_CID} ${S_OID_USER} ${EMPTY}
|
... Delete object ${NEOFS_IR_WIF} ${PRIV_CID} ${S_OID_USER} ${EMPTY}
|
||||||
Run Keyword And Expect Error *
|
Run Keyword And Expect Error *
|
||||||
... Delete object ${NEOFS_SN_WIF} ${PRIV_CID} ${S_OID_USER} ${EMPTY}
|
... Delete object ${NEOFS_SN_WIF} ${PRIV_CID} ${S_OID_USER} ${EMPTY}
|
||||||
Delete object ${USER_KEY} ${PRIV_CID} ${S_OID_USER} ${EMPTY}
|
Delete Object ${USER_KEY} ${PRIV_CID} ${S_OID_USER} ${EMPTY}
|
||||||
|
|
|
@ -44,12 +44,12 @@ Check Private Container
|
||||||
# Storage group Operations (Put, List, Get, Delete) with different Keys
|
# Storage group Operations (Put, List, Get, Delete) with different Keys
|
||||||
# User group key
|
# User group key
|
||||||
${SG_OID_INV} = Put Storagegroup ${USER_KEY} ${PRIV_CID} ${EMPTY} ${S_OID_USER}
|
${SG_OID_INV} = Put Storagegroup ${USER_KEY} ${PRIV_CID} ${EMPTY} ${S_OID_USER}
|
||||||
${SG_OID_1} = Put Storagegroup ${USER_KEY} ${PRIV_CID} ${EMPTY} ${S_OID_USER}
|
${SG_OID} = Put Storagegroup ${USER_KEY} ${PRIV_CID} ${EMPTY} ${S_OID_USER}
|
||||||
List Storagegroup ${USER_KEY} ${PRIV_CID} ${EMPTY} ${SG_OID_1} ${SG_OID_INV}
|
List Storagegroup ${USER_KEY} ${PRIV_CID} ${EMPTY} ${SG_OID} ${SG_OID_INV}
|
||||||
@{EXPECTED_OIDS} = Run Keyword If "${RUN_TYPE}" == "Complex" Get Split objects ${USER_KEY} ${PRIV_CID} ${S_OID_USER}
|
@{EXPECTED_OIDS} = Run Keyword If "${RUN_TYPE}" == "Complex" Get Split objects ${USER_KEY} ${PRIV_CID} ${S_OID_USER}
|
||||||
... ELSE IF "${RUN_TYPE}" == "Simple" Create List ${S_OID_USER}
|
... ELSE IF "${RUN_TYPE}" == "Simple" Create List ${S_OID_USER}
|
||||||
Get Storagegroup ${USER_KEY} ${PRIV_CID} ${SG_OID_1} ${EMPTY} ${EMPTY} @{EXPECTED_OIDS}
|
Get Storagegroup ${USER_KEY} ${PRIV_CID} ${SG_OID} ${EMPTY} ${EMPTY} @{EXPECTED_OIDS}
|
||||||
Delete Storagegroup ${USER_KEY} ${PRIV_CID} ${SG_OID_1} ${EMPTY}
|
Delete Storagegroup ${USER_KEY} ${PRIV_CID} ${SG_OID} ${EMPTY}
|
||||||
|
|
||||||
|
|
||||||
# "Others" group key
|
# "Others" group key
|
||||||
|
@ -63,25 +63,21 @@ Check Private Container
|
||||||
... Delete Storagegroup ${OTHER_KEY} ${PRIV_CID} ${SG_OID_INV} ${EMPTY}
|
... Delete Storagegroup ${OTHER_KEY} ${PRIV_CID} ${SG_OID_INV} ${EMPTY}
|
||||||
|
|
||||||
|
|
||||||
# System group key (storage node)
|
# System group key (Storage Node)
|
||||||
${SG_OID_1} = Put Storagegroup ${NEOFS_SN_WIF} ${PRIV_CID} ${EMPTY} ${S_OID_USER}
|
${SG_OID_SN} = Put Storagegroup ${NEOFS_SN_WIF} ${PRIV_CID} ${EMPTY} ${S_OID_USER}
|
||||||
List Storagegroup ${NEOFS_SN_WIF} ${PRIV_CID} ${EMPTY} ${SG_OID_1} ${SG_OID_INV}
|
List Storagegroup ${NEOFS_SN_WIF} ${PRIV_CID} ${EMPTY} ${SG_OID_SN} ${SG_OID_INV}
|
||||||
@{EXPECTED_OIDS} = Run Keyword If "${RUN_TYPE}" == "Complex" Get Split objects ${NEOFS_SN_WIF} ${PRIV_CID} ${S_OID_USER}
|
@{EXPECTED_OIDS} = Run Keyword If "${RUN_TYPE}" == "Complex" Get Split objects ${NEOFS_SN_WIF} ${PRIV_CID} ${S_OID_USER}
|
||||||
... ELSE IF "${RUN_TYPE}" == "Simple" Create List ${S_OID_USER}
|
... ELSE IF "${RUN_TYPE}" == "Simple" Create List ${S_OID_USER}
|
||||||
Get Storagegroup ${NEOFS_SN_WIF} ${PRIV_CID} ${SG_OID_1} ${EMPTY} ${EMPTY} @{EXPECTED_OIDS}
|
Get Storagegroup ${NEOFS_SN_WIF} ${PRIV_CID} ${SG_OID_SN} ${EMPTY} ${EMPTY} @{EXPECTED_OIDS}
|
||||||
Run Keyword And Expect Error *
|
Run Keyword And Expect Error *
|
||||||
... Delete Storagegroup ${NEOFS_SN_WIF} ${PRIV_CID} ${SG_OID_1} ${EMPTY}
|
... Delete Storagegroup ${NEOFS_SN_WIF} ${PRIV_CID} ${SG_OID_SN} ${EMPTY}
|
||||||
|
|
||||||
|
|
||||||
# System group key (Inner ring node)
|
# System group key (Inner Ring Node)
|
||||||
Run Keyword And Expect Error *
|
${SG_OID_IR} = Put Storagegroup ${NEOFS_IR_WIF} ${PRIV_CID} ${EMPTY} ${S_OID_USER}
|
||||||
... Put Storagegroup ${NEOFS_IR_WIF} ${PRIV_CID} ${EMPTY} ${S_OID_USER}
|
List Storagegroup ${NEOFS_IR_WIF} ${PRIV_CID} ${EMPTY} ${SG_OID_SN} ${SG_OID_IR} ${SG_OID_INV}
|
||||||
Run Keyword And Expect Error *
|
|
||||||
... List Storagegroup ${NEOFS_IR_WIF} ${PRIV_CID} ${EMPTY} ${SG_OID_INV}
|
|
||||||
|
|
||||||
@{EXPECTED_OIDS} = Run Keyword If "${RUN_TYPE}" == "Complex" Get Split objects ${USER_KEY} ${PRIV_CID} ${S_OID_USER}
|
@{EXPECTED_OIDS} = Run Keyword If "${RUN_TYPE}" == "Complex" Get Split objects ${USER_KEY} ${PRIV_CID} ${S_OID_USER}
|
||||||
... ELSE IF "${RUN_TYPE}" == "Simple" Create List ${S_OID_USER}
|
... ELSE IF "${RUN_TYPE}" == "Simple" Create List ${S_OID_USER}
|
||||||
Get Storagegroup ${NEOFS_IR_WIF} ${PRIV_CID} ${SG_OID_INV} ${EMPTY} ${EMPTY} @{EXPECTED_OIDS}
|
Get Storagegroup ${NEOFS_IR_WIF} ${PRIV_CID} ${SG_OID_IR} ${EMPTY} ${EMPTY} @{EXPECTED_OIDS}
|
||||||
|
|
||||||
Run Keyword And Expect Error *
|
Run Keyword And Expect Error *
|
||||||
... Delete Storagegroup ${NEOFS_IR_WIF} ${PRIV_CID} ${SG_OID_INV} ${EMPTY}
|
... Delete Storagegroup ${NEOFS_IR_WIF} ${PRIV_CID} ${SG_OID_IR} ${EMPTY}
|
||||||
|
|
|
@ -37,22 +37,24 @@ Check Public Container
|
||||||
[Arguments] ${USER_KEY} ${FILE_S} ${PUBLIC_CID} ${OTHER_KEY}
|
[Arguments] ${USER_KEY} ${FILE_S} ${PUBLIC_CID} ${OTHER_KEY}
|
||||||
|
|
||||||
# Put
|
# Put
|
||||||
${S_OID_USER} = Put object ${USER_KEY} ${FILE_S} ${PUBLIC_CID} ${EMPTY} ${EMPTY}
|
${S_OID_USER} = Put Object ${USER_KEY} ${FILE_S} ${PUBLIC_CID} ${EMPTY} ${EMPTY}
|
||||||
${S_OID_OTHER} = Put object ${OTHER_KEY} ${FILE_S} ${PUBLIC_CID} ${EMPTY} ${EMPTY}
|
${S_OID_OTHER} = Put Object ${OTHER_KEY} ${FILE_S} ${PUBLIC_CID} ${EMPTY} ${EMPTY}
|
||||||
${S_OID_SYS_IR} = Put object ${NEOFS_IR_WIF} ${FILE_S} ${PUBLIC_CID} ${EMPTY} ${EMPTY}
|
${S_OID_SYS_IR} = Put Object ${NEOFS_IR_WIF} ${FILE_S} ${PUBLIC_CID} ${EMPTY} ${EMPTY}
|
||||||
${S_OID_SYS_SN} = Put object ${NEOFS_SN_WIF} ${FILE_S} ${PUBLIC_CID} ${EMPTY} ${EMPTY}
|
${S_OID_SYS_SN} = Put Object ${NEOFS_SN_WIF} ${FILE_S} ${PUBLIC_CID} ${EMPTY} ${EMPTY}
|
||||||
|
|
||||||
# Get
|
# Get
|
||||||
Get object ${USER_KEY} ${PUBLIC_CID} ${S_OID_USER} ${EMPTY} s_file_read
|
Get Object ${USER_KEY} ${PUBLIC_CID} ${S_OID_USER} ${EMPTY} s_file_read
|
||||||
Get object ${OTHER_KEY} ${PUBLIC_CID} ${S_OID_USER} ${EMPTY} s_file_read
|
Get Object ${OTHER_KEY} ${PUBLIC_CID} ${S_OID_USER} ${EMPTY} s_file_read
|
||||||
Get object ${NEOFS_IR_WIF} ${PUBLIC_CID} ${S_OID_USER} ${EMPTY} s_file_read
|
Get Object ${NEOFS_IR_WIF} ${PUBLIC_CID} ${S_OID_USER} ${EMPTY} s_file_read
|
||||||
Get object ${NEOFS_SN_WIF} ${PUBLIC_CID} ${S_OID_USER} ${EMPTY} s_file_read
|
Get Object ${NEOFS_SN_WIF} ${PUBLIC_CID} ${S_OID_USER} ${EMPTY} s_file_read
|
||||||
|
|
||||||
# Get Range
|
# Get Range
|
||||||
Get Range ${USER_KEY} ${PUBLIC_CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
Get Range ${USER_KEY} ${PUBLIC_CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
||||||
Get Range ${OTHER_KEY} ${PUBLIC_CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
Get Range ${OTHER_KEY} ${PUBLIC_CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
||||||
Get Range ${NEOFS_IR_WIF} ${PUBLIC_CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
Run Keyword And Expect Error *
|
||||||
Get Range ${NEOFS_SN_WIF} ${PUBLIC_CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
... Get Range ${NEOFS_IR_WIF} ${PUBLIC_CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
||||||
|
Run Keyword And Expect Error *
|
||||||
|
... Get Range ${NEOFS_SN_WIF} ${PUBLIC_CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
||||||
|
|
||||||
|
|
||||||
# Get Range Hash
|
# Get Range Hash
|
||||||
|
@ -69,24 +71,26 @@ Check Public Container
|
||||||
Search object ${NEOFS_SN_WIF} ${PUBLIC_CID} --root ${EMPTY} ${EMPTY} ${S_OBJ_PRIV}
|
Search object ${NEOFS_SN_WIF} ${PUBLIC_CID} --root ${EMPTY} ${EMPTY} ${S_OBJ_PRIV}
|
||||||
|
|
||||||
# Head
|
# Head
|
||||||
Head object ${USER_KEY} ${PUBLIC_CID} ${S_OID_USER} ${EMPTY} ${EMPTY}
|
Head Object ${USER_KEY} ${PUBLIC_CID} ${S_OID_USER} ${EMPTY} ${EMPTY}
|
||||||
Head object ${OTHER_KEY} ${PUBLIC_CID} ${S_OID_USER} ${EMPTY} ${EMPTY}
|
Head Object ${OTHER_KEY} ${PUBLIC_CID} ${S_OID_USER} ${EMPTY} ${EMPTY}
|
||||||
Head object ${NEOFS_IR_WIF} ${PUBLIC_CID} ${S_OID_USER} ${EMPTY} ${EMPTY}
|
Head Object ${NEOFS_IR_WIF} ${PUBLIC_CID} ${S_OID_USER} ${EMPTY} ${EMPTY}
|
||||||
Head object ${NEOFS_SN_WIF} ${PUBLIC_CID} ${S_OID_USER} ${EMPTY} ${EMPTY}
|
Head Object ${NEOFS_SN_WIF} ${PUBLIC_CID} ${S_OID_USER} ${EMPTY} ${EMPTY}
|
||||||
|
|
||||||
Head object ${USER_KEY} ${PUBLIC_CID} ${S_OID_OTHER} ${EMPTY} ${EMPTY}
|
Head Object ${USER_KEY} ${PUBLIC_CID} ${S_OID_OTHER} ${EMPTY} ${EMPTY}
|
||||||
Head object ${OTHER_KEY} ${PUBLIC_CID} ${S_OID_OTHER} ${EMPTY} ${EMPTY}
|
Head Object ${OTHER_KEY} ${PUBLIC_CID} ${S_OID_OTHER} ${EMPTY} ${EMPTY}
|
||||||
Head object ${NEOFS_IR_WIF} ${PUBLIC_CID} ${S_OID_OTHER} ${EMPTY} ${EMPTY}
|
Head Object ${NEOFS_IR_WIF} ${PUBLIC_CID} ${S_OID_OTHER} ${EMPTY} ${EMPTY}
|
||||||
Head object ${NEOFS_SN_WIF} ${PUBLIC_CID} ${S_OID_OTHER} ${EMPTY} ${EMPTY}
|
Head Object ${NEOFS_SN_WIF} ${PUBLIC_CID} ${S_OID_OTHER} ${EMPTY} ${EMPTY}
|
||||||
|
|
||||||
Head object ${USER_KEY} ${PUBLIC_CID} ${S_OID_SYS_SN} ${EMPTY} ${EMPTY}
|
Head Object ${USER_KEY} ${PUBLIC_CID} ${S_OID_SYS_SN} ${EMPTY} ${EMPTY}
|
||||||
Head object ${OTHER_KEY} ${PUBLIC_CID} ${S_OID_SYS_SN} ${EMPTY} ${EMPTY}
|
Head Object ${OTHER_KEY} ${PUBLIC_CID} ${S_OID_SYS_SN} ${EMPTY} ${EMPTY}
|
||||||
Head object ${NEOFS_IR_WIF} ${PUBLIC_CID} ${S_OID_SYS_SN} ${EMPTY} ${EMPTY}
|
Head Object ${NEOFS_IR_WIF} ${PUBLIC_CID} ${S_OID_SYS_SN} ${EMPTY} ${EMPTY}
|
||||||
Head object ${NEOFS_SN_WIF} ${PUBLIC_CID} ${S_OID_SYS_SN} ${EMPTY} ${EMPTY}
|
Head Object ${NEOFS_SN_WIF} ${PUBLIC_CID} ${S_OID_SYS_SN} ${EMPTY} ${EMPTY}
|
||||||
|
|
||||||
|
|
||||||
# Delete
|
# Delete
|
||||||
Delete object ${USER_KEY} ${PUBLIC_CID} ${S_OID_SYS_IR} ${EMPTY}
|
Delete object ${USER_KEY} ${PUBLIC_CID} ${S_OID_SYS_IR} ${EMPTY}
|
||||||
Delete object ${OTHER_KEY} ${PUBLIC_CID} ${S_OID_SYS_SN} ${EMPTY}
|
Delete Object ${OTHER_KEY} ${PUBLIC_CID} ${S_OID_SYS_SN} ${EMPTY}
|
||||||
Delete object ${NEOFS_IR_WIF} ${PUBLIC_CID} ${S_OID_USER} ${EMPTY}
|
Run Keyword And Expect Error *
|
||||||
Delete object ${NEOFS_SN_WIF} ${PUBLIC_CID} ${S_OID_OTHER} ${EMPTY}
|
... Delete object ${NEOFS_IR_WIF} ${PUBLIC_CID} ${S_OID_USER} ${EMPTY}
|
||||||
|
Run Keyword And Expect Error *
|
||||||
|
... Delete object ${NEOFS_SN_WIF} ${PUBLIC_CID} ${S_OID_OTHER} ${EMPTY}
|
||||||
|
|
|
@ -3,6 +3,7 @@ Variables common.py
|
||||||
|
|
||||||
Library neofs.py
|
Library neofs.py
|
||||||
Library payment_neogo.py
|
Library payment_neogo.py
|
||||||
|
Library contract_keywords.py
|
||||||
|
|
||||||
Resource common_steps_acl_basic.robot
|
Resource common_steps_acl_basic.robot
|
||||||
Resource payment_operations.robot
|
Resource payment_operations.robot
|
||||||
|
@ -42,13 +43,26 @@ Check Public Container
|
||||||
# Put target object to use in storage groups
|
# Put target object to use in storage groups
|
||||||
${S_OID} = Put object ${USER_KEY} ${FILE_S} ${PUBLIC_CID} ${EMPTY} ${EMPTY}
|
${S_OID} = Put object ${USER_KEY} ${FILE_S} ${PUBLIC_CID} ${EMPTY} ${EMPTY}
|
||||||
|
|
||||||
@{Roles_keys} = Create List ${USER_KEY} ${OTHER_KEY} ${NEOFS_IR_WIF} ${NEOFS_SN_WIF}
|
@{ROLES_KEYS_PASS} = Create List ${USER_KEY} ${OTHER_KEY}
|
||||||
|
@{ROLES_KEYS_SYS} = Create List ${NEOFS_IR_WIF} ${NEOFS_SN_WIF}
|
||||||
|
|
||||||
FOR ${role_key} IN @{Roles_keys}
|
FOR ${ROLE_KEY} IN @{ROLES_KEYS_PASS}
|
||||||
${SG_OID_1} = Put Storagegroup ${role_key} ${PUBLIC_CID} ${EMPTY} ${S_OID}
|
${SG_OID_USERS} = Put Storagegroup ${ROLE_KEY} ${PUBLIC_CID} ${EMPTY} ${S_OID}
|
||||||
List Storagegroup ${role_key} ${PUBLIC_CID} ${EMPTY} ${SG_OID_1}
|
List Storagegroup ${ROLE_KEY} ${PUBLIC_CID} ${EMPTY} ${SG_OID_USERS}
|
||||||
@{EXPECTED_OIDS} = Run Keyword If "${RUN_TYPE}" == "Complex" Get Split objects ${role_key} ${PUBLIC_CID} ${S_OID}
|
@{EXPECTED_OIDS} = Run Keyword If "${RUN_TYPE}" == "Complex" Get Split objects ${ROLE_KEY} ${PUBLIC_CID} ${S_OID}
|
||||||
... ELSE IF "${RUN_TYPE}" == "Simple" Create List ${S_OID}
|
... ELSE IF "${RUN_TYPE}" == "Simple" Create List ${S_OID}
|
||||||
Get Storagegroup ${role_key} ${PUBLIC_CID} ${SG_OID_1} ${EMPTY} ${EMPTY} @{EXPECTED_OIDS}
|
Get Storagegroup ${ROLE_KEY} ${PUBLIC_CID} ${SG_OID_USERS} ${EMPTY} ${EMPTY} @{EXPECTED_OIDS}
|
||||||
Delete Storagegroup ${role_key} ${PUBLIC_CID} ${SG_OID_1} ${EMPTY}
|
Delete Storagegroup ${ROLE_KEY} ${PUBLIC_CID} ${SG_OID_USERS} ${EMPTY}
|
||||||
|
Tick Epoch
|
||||||
|
END
|
||||||
|
FOR ${ROLE_KEY} IN @{ROLES_KEYS_SYS}
|
||||||
|
${SG_OID_SYS} = Put Storagegroup ${ROLE_KEY} ${PUBLIC_CID} ${EMPTY} ${S_OID}
|
||||||
|
List Storagegroup ${ROLE_KEY} ${PUBLIC_CID} ${EMPTY} ${SG_OID_SYS}
|
||||||
|
@{EXPECTED_OIDS} = Run Keyword If "${RUN_TYPE}" == "Complex" Get Split objects ${ROLE_KEY} ${PUBLIC_CID} ${S_OID}
|
||||||
|
... ELSE IF "${RUN_TYPE}" == "Simple" Create List ${S_OID}
|
||||||
|
Get Storagegroup ${ROLE_KEY} ${PUBLIC_CID} ${SG_OID_SYS} ${EMPTY} ${EMPTY} @{EXPECTED_OIDS}
|
||||||
|
Run Keyword And Expect Error *
|
||||||
|
... Delete Storagegroup ${ROLE_KEY} ${PUBLIC_CID} ${SG_OID_SYS} ${EMPTY}
|
||||||
|
Delete Storagegroup ${USER_KEY} ${PUBLIC_CID} ${SG_OID_SYS} ${EMPTY}
|
||||||
|
Tick Epoch
|
||||||
END
|
END
|
||||||
|
|
|
@ -38,11 +38,10 @@ Check Read-Only Container
|
||||||
[Arguments] ${RUN_TYPE} ${USER_KEY} ${FILE_S} ${READONLY_CID} ${OTHER_KEY}
|
[Arguments] ${RUN_TYPE} ${USER_KEY} ${FILE_S} ${READONLY_CID} ${OTHER_KEY}
|
||||||
|
|
||||||
# Put
|
# Put
|
||||||
${S_OID_USER} = Put object ${USER_KEY} ${FILE_S} ${READONLY_CID} ${EMPTY} ${EMPTY}
|
${S_OID_USER} = Put Object ${USER_KEY} ${FILE_S} ${READONLY_CID} ${EMPTY} ${EMPTY}
|
||||||
Run Keyword And Expect Error *
|
Run Keyword And Expect Error *
|
||||||
... Put object ${OTHER_KEY} ${FILE_S} ${READONLY_CID} ${EMPTY} ${EMPTY}
|
... Put object ${OTHER_KEY} ${FILE_S} ${READONLY_CID} ${EMPTY} ${EMPTY}
|
||||||
Run Keyword And Expect Error *
|
${S_OID_SYS_IR} = Put Object ${NEOFS_IR_WIF} ${FILE_S} ${READONLY_CID} ${EMPTY} ${EMPTY}
|
||||||
... Put object ${NEOFS_IR_WIF} ${FILE_S} ${READONLY_CID} ${EMPTY} ${EMPTY}
|
|
||||||
${S_OID_SYS_SN} = Put object ${NEOFS_SN_WIF} ${FILE_S} ${READONLY_CID} ${EMPTY} ${EMPTY}
|
${S_OID_SYS_SN} = Put object ${NEOFS_SN_WIF} ${FILE_S} ${READONLY_CID} ${EMPTY} ${EMPTY}
|
||||||
|
|
||||||
|
|
||||||
|
@ -64,47 +63,48 @@ Check Read-Only Container
|
||||||
Run Keyword And Expect Error *
|
Run Keyword And Expect Error *
|
||||||
... Delete Storagegroup ${OTHER_KEY} ${READONLY_CID} ${SG_OID_INV} ${EMPTY}
|
... Delete Storagegroup ${OTHER_KEY} ${READONLY_CID} ${SG_OID_INV} ${EMPTY}
|
||||||
|
|
||||||
Run Keyword And Expect Error *
|
${SG_OID_IR} = Put Storagegroup ${NEOFS_IR_WIF} ${READONLY_CID} ${EMPTY} ${S_OID_USER}
|
||||||
... Put Storagegroup ${NEOFS_IR_WIF} ${READONLY_CID} ${EMPTY} ${S_OID_USER}
|
List Storagegroup ${NEOFS_IR_WIF} ${READONLY_CID} ${EMPTY} ${SG_OID_INV} ${SG_OID_IR}
|
||||||
List Storagegroup ${NEOFS_IR_WIF} ${READONLY_CID} ${EMPTY} ${SG_OID_INV}
|
|
||||||
@{EXPECTED_OIDS} = Run Keyword If "${RUN_TYPE}" == "Complex" Get Split objects ${USER_KEY} ${READONLY_CID} ${S_OID_USER}
|
@{EXPECTED_OIDS} = Run Keyword If "${RUN_TYPE}" == "Complex" Get Split objects ${USER_KEY} ${READONLY_CID} ${S_OID_USER}
|
||||||
... ELSE IF "${RUN_TYPE}" == "Simple" Create List ${S_OID_USER}
|
... ELSE IF "${RUN_TYPE}" == "Simple" Create List ${S_OID_USER}
|
||||||
Get Storagegroup ${NEOFS_IR_WIF} ${READONLY_CID} ${SG_OID_INV} ${EMPTY} ${EMPTY} @{EXPECTED_OIDS}
|
Get Storagegroup ${NEOFS_IR_WIF} ${READONLY_CID} ${SG_OID_IR} ${EMPTY} ${EMPTY} @{EXPECTED_OIDS}
|
||||||
Run Keyword And Expect Error *
|
Run Keyword And Expect Error *
|
||||||
... Delete Storagegroup ${NEOFS_IR_WIF} ${READONLY_CID} ${SG_OID_INV} ${EMPTY}
|
... Delete Storagegroup ${NEOFS_IR_WIF} ${READONLY_CID} ${SG_OID_IR} ${EMPTY}
|
||||||
|
|
||||||
# Get
|
# Get
|
||||||
Get object ${USER_KEY} ${READONLY_CID} ${S_OID_USER} ${EMPTY} s_file_read
|
Get object ${USER_KEY} ${READONLY_CID} ${S_OID_USER} ${EMPTY} s_file_read
|
||||||
Get object ${OTHER_KEY} ${READONLY_CID} ${S_OID_USER} ${EMPTY} s_file_read
|
Get Object ${OTHER_KEY} ${READONLY_CID} ${S_OID_USER} ${EMPTY} s_file_read
|
||||||
Get object ${NEOFS_IR_WIF} ${READONLY_CID} ${S_OID_USER} ${EMPTY} s_file_read
|
Get Object ${NEOFS_IR_WIF} ${READONLY_CID} ${S_OID_USER} ${EMPTY} s_file_read
|
||||||
Get object ${NEOFS_SN_WIF} ${READONLY_CID} ${S_OID_USER} ${EMPTY} s_file_read
|
Get Object ${NEOFS_SN_WIF} ${READONLY_CID} ${S_OID_USER} ${EMPTY} s_file_read
|
||||||
|
|
||||||
# Get Range
|
# Get Range
|
||||||
Get Range ${USER_KEY} ${READONLY_CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
Get Range ${USER_KEY} ${READONLY_CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
||||||
Get Range ${OTHER_KEY} ${READONLY_CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
Get Range ${OTHER_KEY} ${READONLY_CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
||||||
Get Range ${NEOFS_IR_WIF} ${READONLY_CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
Run Keyword And Expect Error *
|
||||||
Get Range ${NEOFS_SN_WIF} ${READONLY_CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
... Get Range ${NEOFS_IR_WIF} ${READONLY_CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
||||||
|
Run Keyword And Expect Error *
|
||||||
|
... Get Range ${NEOFS_SN_WIF} ${READONLY_CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
||||||
|
|
||||||
|
|
||||||
# Get Range Hash
|
# Get Range Hash
|
||||||
Get Range Hash ${USER_KEY} ${READONLY_CID} ${S_OID_USER} ${EMPTY} 0:256
|
Get Range hash ${USER_KEY} ${READONLY_CID} ${S_OID_USER} ${EMPTY} 0:256
|
||||||
Get Range Hash ${OTHER_KEY} ${READONLY_CID} ${S_OID_USER} ${EMPTY} 0:256
|
Get Range hash ${OTHER_KEY} ${READONLY_CID} ${S_OID_USER} ${EMPTY} 0:256
|
||||||
Get Range Hash ${NEOFS_IR_WIF} ${READONLY_CID} ${S_OID_USER} ${EMPTY} 0:256
|
Get Range hash ${NEOFS_IR_WIF} ${READONLY_CID} ${S_OID_USER} ${EMPTY} 0:256
|
||||||
Get Range Hash ${NEOFS_SN_WIF} ${READONLY_CID} ${S_OID_USER} ${EMPTY} 0:256
|
Get Range hash ${NEOFS_SN_WIF} ${READONLY_CID} ${S_OID_USER} ${EMPTY} 0:256
|
||||||
|
|
||||||
# Search
|
# Search
|
||||||
@{S_OBJ_RO} = Create List ${S_OID_USER} ${S_OID_SYS_SN}
|
@{S_OBJ_RO} = Create List ${S_OID_USER} ${S_OID_SYS_SN} ${S_OID_SYS_IR}
|
||||||
Search object ${USER_KEY} ${READONLY_CID} --root ${EMPTY} ${EMPTY} ${S_OBJ_RO}
|
Search Object ${USER_KEY} ${READONLY_CID} --root ${EMPTY} ${EMPTY} ${S_OBJ_RO}
|
||||||
Search object ${OTHER_KEY} ${READONLY_CID} --root ${EMPTY} ${EMPTY} ${S_OBJ_RO}
|
Search Object ${OTHER_KEY} ${READONLY_CID} --root ${EMPTY} ${EMPTY} ${S_OBJ_RO}
|
||||||
Search object ${NEOFS_IR_WIF} ${READONLY_CID} --root ${EMPTY} ${EMPTY} ${S_OBJ_RO}
|
Search Object ${NEOFS_IR_WIF} ${READONLY_CID} --root ${EMPTY} ${EMPTY} ${S_OBJ_RO}
|
||||||
Search object ${NEOFS_SN_WIF} ${READONLY_CID} --root ${EMPTY} ${EMPTY} ${S_OBJ_RO}
|
Search Object ${NEOFS_SN_WIF} ${READONLY_CID} --root ${EMPTY} ${EMPTY} ${S_OBJ_RO}
|
||||||
|
|
||||||
|
|
||||||
# Head
|
# Head
|
||||||
Head object ${USER_KEY} ${READONLY_CID} ${S_OID_USER} ${EMPTY} ${EMPTY}
|
Head Object ${USER_KEY} ${READONLY_CID} ${S_OID_USER} ${EMPTY} ${EMPTY}
|
||||||
Head object ${OTHER_KEY} ${READONLY_CID} ${S_OID_USER} ${EMPTY} ${EMPTY}
|
Head Object ${OTHER_KEY} ${READONLY_CID} ${S_OID_USER} ${EMPTY} ${EMPTY}
|
||||||
Head object ${NEOFS_IR_WIF} ${READONLY_CID} ${S_OID_USER} ${EMPTY} ${EMPTY}
|
Head Object ${NEOFS_IR_WIF} ${READONLY_CID} ${S_OID_USER} ${EMPTY} ${EMPTY}
|
||||||
Head object ${NEOFS_SN_WIF} ${READONLY_CID} ${S_OID_USER} ${EMPTY} ${EMPTY}
|
Head Object ${NEOFS_SN_WIF} ${READONLY_CID} ${S_OID_USER} ${EMPTY} ${EMPTY}
|
||||||
|
|
||||||
# Delete
|
# Delete
|
||||||
Run Keyword And Expect Error *
|
Run Keyword And Expect Error *
|
||||||
|
@ -113,4 +113,4 @@ Check Read-Only Container
|
||||||
... Delete object ${NEOFS_IR_WIF} ${READONLY_CID} ${S_OID_USER} ${EMPTY}
|
... Delete object ${NEOFS_IR_WIF} ${READONLY_CID} ${S_OID_USER} ${EMPTY}
|
||||||
Run Keyword And Expect Error *
|
Run Keyword And Expect Error *
|
||||||
... Delete object ${NEOFS_SN_WIF} ${READONLY_CID} ${S_OID_USER} ${EMPTY}
|
... Delete object ${NEOFS_SN_WIF} ${READONLY_CID} ${S_OID_USER} ${EMPTY}
|
||||||
Delete object ${USER_KEY} ${READONLY_CID} ${S_OID_USER} ${EMPTY}
|
Delete Object ${USER_KEY} ${READONLY_CID} ${S_OID_USER} ${EMPTY}
|
||||||
|
|
|
@ -62,11 +62,10 @@ Check Read-Only Container
|
||||||
... Delete Storagegroup ${OTHER_KEY} ${READONLY_CID} ${SG_OID_INV} ${EMPTY}
|
... Delete Storagegroup ${OTHER_KEY} ${READONLY_CID} ${SG_OID_INV} ${EMPTY}
|
||||||
|
|
||||||
|
|
||||||
Run Keyword And Expect Error *
|
${SG_OID_IR} = Put Storagegroup ${NEOFS_IR_WIF} ${READONLY_CID} ${EMPTY} ${S_OID_USER}
|
||||||
... Put Storagegroup ${NEOFS_IR_WIF} ${READONLY_CID} ${EMPTY} ${S_OID_USER}
|
List Storagegroup ${NEOFS_IR_WIF} ${READONLY_CID} ${EMPTY} ${SG_OID_INV} ${SG_OID_IR}
|
||||||
List Storagegroup ${NEOFS_IR_WIF} ${READONLY_CID} ${EMPTY} ${SG_OID_INV}
|
|
||||||
@{EXPECTED_OIDS} = Run Keyword If "${RUN_TYPE}" == "Complex" Get Split objects ${USER_KEY} ${READONLY_CID} ${S_OID_USER}
|
@{EXPECTED_OIDS} = Run Keyword If "${RUN_TYPE}" == "Complex" Get Split objects ${USER_KEY} ${READONLY_CID} ${S_OID_USER}
|
||||||
... ELSE IF "${RUN_TYPE}" == "Simple" Create List ${S_OID_USER}
|
... ELSE IF "${RUN_TYPE}" == "Simple" Create List ${S_OID_USER}
|
||||||
Get Storagegroup ${NEOFS_IR_WIF} ${READONLY_CID} ${SG_OID_INV} ${EMPTY} ${EMPTY} @{EXPECTED_OIDS}
|
Get Storagegroup ${NEOFS_IR_WIF} ${READONLY_CID} ${SG_OID_IR} ${EMPTY} ${EMPTY} @{EXPECTED_OIDS}
|
||||||
Run Keyword And Expect Error *
|
Run Keyword And Expect Error *
|
||||||
... Delete Storagegroup ${NEOFS_IR_WIF} ${READONLY_CID} ${SG_OID_INV} ${EMPTY}
|
... Delete Storagegroup ${NEOFS_IR_WIF} ${READONLY_CID} ${SG_OID_INV} ${EMPTY}
|
||||||
|
|
|
@ -77,7 +77,12 @@ Check Bearer Сompound Get
|
||||||
... Head object ${KEY} ${CID} ${S_OID_USER} ${EACL_TOKEN}
|
... Head object ${KEY} ${CID} ${S_OID_USER} ${EACL_TOKEN}
|
||||||
|
|
||||||
Get object ${KEY} ${CID} ${S_OID_USER} ${EACL_TOKEN} local_file_eacl
|
Get object ${KEY} ${CID} ${S_OID_USER} ${EACL_TOKEN} local_file_eacl
|
||||||
|
IF "${KEY}" == "${NEOFS_IR_WIF}"
|
||||||
|
Run Keyword And Expect Error *
|
||||||
|
... Get Range ${KEY} ${CID} ${S_OID_USER} s_get_range ${EACL_TOKEN} 0:256
|
||||||
|
ELSE
|
||||||
Get Range ${KEY} ${CID} ${S_OID_USER} s_get_range ${EACL_TOKEN} 0:256
|
Get Range ${KEY} ${CID} ${S_OID_USER} s_get_range ${EACL_TOKEN} 0:256
|
||||||
|
END
|
||||||
Get Range Hash ${KEY} ${CID} ${S_OID_USER} ${EACL_TOKEN} 0:256
|
Get Range Hash ${KEY} ${CID} ${S_OID_USER} ${EACL_TOKEN} 0:256
|
||||||
|
|
||||||
|
|
||||||
|
@ -88,7 +93,12 @@ Check Bearer Сompound Delete
|
||||||
${S_OID_USER} = Put object ${USER_KEY} ${FILE_S} ${CID} ${EMPTY} ${FILE_USR_HEADER}
|
${S_OID_USER} = Put object ${USER_KEY} ${FILE_S} ${CID} ${EMPTY} ${FILE_USR_HEADER}
|
||||||
${D_OID_USER} = Put object ${USER_KEY} ${FILE_S} ${CID} ${EMPTY} ${EMPTY}
|
${D_OID_USER} = Put object ${USER_KEY} ${FILE_S} ${CID} ${EMPTY} ${EMPTY}
|
||||||
Put object ${KEY} ${FILE_S} ${CID} ${EMPTY} ${FILE_OTH_HEADER}
|
Put object ${KEY} ${FILE_S} ${CID} ${EMPTY} ${FILE_OTH_HEADER}
|
||||||
|
IF "${KEY}" == "${NEOFS_IR_WIF}"
|
||||||
|
Run Keyword And Expect Error *
|
||||||
|
... Delete object ${KEY} ${CID} ${D_OID_USER} ${EMPTY}
|
||||||
|
ELSE
|
||||||
Delete object ${KEY} ${CID} ${D_OID_USER} ${EMPTY}
|
Delete object ${KEY} ${CID} ${D_OID_USER} ${EMPTY}
|
||||||
|
END
|
||||||
|
|
||||||
Set eACL ${USER_KEY} ${CID} ${DENY_EACL}
|
Set eACL ${USER_KEY} ${CID} ${DENY_EACL}
|
||||||
|
|
||||||
|
@ -106,7 +116,7 @@ Check Bearer Сompound Delete
|
||||||
Run Keyword And Expect Error *
|
Run Keyword And Expect Error *
|
||||||
... Put object ${KEY} ${FILE_S} ${CID} ${EACL_TOKEN} ${FILE_OTH_HEADER}
|
... Put object ${KEY} ${FILE_S} ${CID} ${EACL_TOKEN} ${FILE_OTH_HEADER}
|
||||||
|
|
||||||
Delete object ${KEY} ${CID} ${S_OID_USER} ${EACL_TOKEN}
|
Delete object ${USER_KEY} ${CID} ${S_OID_USER} ${EACL_TOKEN}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -58,14 +58,18 @@ Check eACL Deny and Allow All System
|
||||||
Head object ${NEOFS_IR_WIF} ${CID} ${S_OID_USER} ${EMPTY}
|
Head object ${NEOFS_IR_WIF} ${CID} ${S_OID_USER} ${EMPTY}
|
||||||
Head object ${NEOFS_SN_WIF} ${CID} ${S_OID_USER} ${EMPTY}
|
Head object ${NEOFS_SN_WIF} ${CID} ${S_OID_USER} ${EMPTY}
|
||||||
|
|
||||||
Get Range ${NEOFS_IR_WIF} ${CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
Run Keyword And Expect Error *
|
||||||
Get Range ${NEOFS_SN_WIF} ${CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
... Get Range ${NEOFS_IR_WIF} ${CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
||||||
|
Run Keyword And Expect Error *
|
||||||
|
... Get Range ${NEOFS_SN_WIF} ${CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
||||||
|
|
||||||
Get Range Hash ${NEOFS_IR_WIF} ${CID} ${S_OID_USER} ${EMPTY} 0:256
|
Get Range Hash ${NEOFS_IR_WIF} ${CID} ${S_OID_USER} ${EMPTY} 0:256
|
||||||
Get Range Hash ${NEOFS_SN_WIF} ${CID} ${S_OID_USER} ${EMPTY} 0:256
|
Get Range Hash ${NEOFS_SN_WIF} ${CID} ${S_OID_USER} ${EMPTY} 0:256
|
||||||
|
|
||||||
Delete object ${NEOFS_IR_WIF} ${CID} ${D_OID_USER_S} ${EMPTY}
|
Run Keyword And Expect Error *
|
||||||
Delete object ${NEOFS_SN_WIF} ${CID} ${D_OID_USER_SN} ${EMPTY}
|
... Delete object ${NEOFS_IR_WIF} ${CID} ${D_OID_USER_S} ${EMPTY}
|
||||||
|
Run Keyword And Expect Error *
|
||||||
|
... Delete object ${NEOFS_SN_WIF} ${CID} ${D_OID_USER_SN} ${EMPTY}
|
||||||
|
|
||||||
Set eACL ${USER_KEY} ${CID} ${EACL_DENY_ALL_SYSTEM}
|
Set eACL ${USER_KEY} ${CID} ${EACL_DENY_ALL_SYSTEM}
|
||||||
|
|
||||||
|
@ -116,6 +120,9 @@ Check eACL Deny and Allow All System
|
||||||
# The current ACL cache lifetime is 30 sec
|
# The current ACL cache lifetime is 30 sec
|
||||||
Sleep ${NEOFS_CONTRACT_CACHE_TIMEOUT}
|
Sleep ${NEOFS_CONTRACT_CACHE_TIMEOUT}
|
||||||
|
|
||||||
|
Delete object ${USER_KEY} ${CID} ${D_OID_USER_S} ${EMPTY}
|
||||||
|
Delete object ${USER_KEY} ${CID} ${D_OID_USER_SN} ${EMPTY}
|
||||||
|
|
||||||
${D_OID_USER_S} = Put object ${USER_KEY} ${FILE_S} ${CID} ${EMPTY} ${FILE_USR_HEADER_DEL}
|
${D_OID_USER_S} = Put object ${USER_KEY} ${FILE_S} ${CID} ${EMPTY} ${FILE_USR_HEADER_DEL}
|
||||||
${D_OID_USER_SN} = Put object ${USER_KEY} ${FILE_S} ${CID} ${EMPTY} ${FILE_USR_HEADER_DEL}
|
${D_OID_USER_SN} = Put object ${USER_KEY} ${FILE_S} ${CID} ${EMPTY} ${FILE_USR_HEADER_DEL}
|
||||||
|
|
||||||
|
@ -131,11 +138,15 @@ Check eACL Deny and Allow All System
|
||||||
Head object ${NEOFS_IR_WIF} ${CID} ${S_OID_USER} ${EMPTY}
|
Head object ${NEOFS_IR_WIF} ${CID} ${S_OID_USER} ${EMPTY}
|
||||||
Head object ${NEOFS_SN_WIF} ${CID} ${S_OID_USER} ${EMPTY}
|
Head object ${NEOFS_SN_WIF} ${CID} ${S_OID_USER} ${EMPTY}
|
||||||
|
|
||||||
Get Range ${NEOFS_IR_WIF} ${CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
Run Keyword And Expect Error *
|
||||||
Get Range ${NEOFS_SN_WIF} ${CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
... Get Range ${NEOFS_IR_WIF} ${CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
||||||
|
Run Keyword And Expect Error *
|
||||||
|
... Get Range ${NEOFS_SN_WIF} ${CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
||||||
|
|
||||||
Get Range Hash ${NEOFS_IR_WIF} ${CID} ${S_OID_USER} ${EMPTY} 0:256
|
Get Range Hash ${NEOFS_IR_WIF} ${CID} ${S_OID_USER} ${EMPTY} 0:256
|
||||||
Get Range Hash ${NEOFS_SN_WIF} ${CID} ${S_OID_USER} ${EMPTY} 0:256
|
Get Range Hash ${NEOFS_SN_WIF} ${CID} ${S_OID_USER} ${EMPTY} 0:256
|
||||||
|
|
||||||
Delete object ${NEOFS_IR_WIF} ${CID} ${D_OID_USER_S} ${EMPTY}
|
Run Keyword And Expect Error *
|
||||||
Delete object ${NEOFS_SN_WIF} ${CID} ${D_OID_USER_SN} ${EMPTY}
|
... Delete object ${NEOFS_IR_WIF} ${CID} ${D_OID_USER_S} ${EMPTY}
|
||||||
|
Run Keyword And Expect Error *
|
||||||
|
... Delete object ${NEOFS_SN_WIF} ${CID} ${D_OID_USER_SN} ${EMPTY}
|
||||||
|
|
|
@ -72,7 +72,12 @@ Check eACL Сompound Get
|
||||||
... Head object ${KEY} ${CID} ${S_OID_USER} ${EMPTY}
|
... Head object ${KEY} ${CID} ${S_OID_USER} ${EMPTY}
|
||||||
|
|
||||||
Get object ${KEY} ${CID} ${S_OID_USER} ${EMPTY} local_file_eacl
|
Get object ${KEY} ${CID} ${S_OID_USER} ${EMPTY} local_file_eacl
|
||||||
|
IF "${KEY}" == "${NEOFS_IR_WIF}"
|
||||||
|
Run Keyword And Expect Error *
|
||||||
|
... Get Range ${KEY} ${CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
||||||
|
ELSE
|
||||||
Get Range ${KEY} ${CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
Get Range ${KEY} ${CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
||||||
|
END
|
||||||
Get Range Hash ${KEY} ${CID} ${S_OID_USER} ${EMPTY} 0:256
|
Get Range Hash ${KEY} ${CID} ${S_OID_USER} ${EMPTY} 0:256
|
||||||
|
|
||||||
|
|
||||||
|
@ -84,7 +89,12 @@ Check eACL Сompound Delete
|
||||||
${S_OID_USER} = Put object ${USER_KEY} ${FILE_S} ${CID} ${EMPTY} ${FILE_USR_HEADER}
|
${S_OID_USER} = Put object ${USER_KEY} ${FILE_S} ${CID} ${EMPTY} ${FILE_USR_HEADER}
|
||||||
${D_OID_USER} = Put object ${USER_KEY} ${FILE_S} ${CID} ${EMPTY} ${EMPTY}
|
${D_OID_USER} = Put object ${USER_KEY} ${FILE_S} ${CID} ${EMPTY} ${EMPTY}
|
||||||
Put object ${KEY} ${FILE_S} ${CID} ${EMPTY} ${FILE_OTH_HEADER}
|
Put object ${KEY} ${FILE_S} ${CID} ${EMPTY} ${FILE_OTH_HEADER}
|
||||||
|
IF "${KEY}" == "${NEOFS_IR_WIF}"
|
||||||
|
Run Keyword And Expect Error *
|
||||||
|
... Delete object ${KEY} ${CID} ${D_OID_USER} ${EMPTY}
|
||||||
|
ELSE
|
||||||
Delete object ${KEY} ${CID} ${D_OID_USER} ${EMPTY}
|
Delete object ${KEY} ${CID} ${D_OID_USER} ${EMPTY}
|
||||||
|
END
|
||||||
|
|
||||||
Set eACL ${USER_KEY} ${CID} ${DENY_EACL}
|
Set eACL ${USER_KEY} ${CID} ${DENY_EACL}
|
||||||
|
|
||||||
|
@ -95,8 +105,12 @@ Check eACL Сompound Delete
|
||||||
... Head object ${KEY} ${CID} ${S_OID_USER} ${EMPTY}
|
... Head object ${KEY} ${CID} ${S_OID_USER} ${EMPTY}
|
||||||
Run Keyword And Expect Error *
|
Run Keyword And Expect Error *
|
||||||
... Put object ${KEY} ${FILE_S} ${CID} ${EMPTY} ${FILE_OTH_HEADER}
|
... Put object ${KEY} ${FILE_S} ${CID} ${EMPTY} ${FILE_OTH_HEADER}
|
||||||
|
IF "${KEY}" == "${NEOFS_IR_WIF}"
|
||||||
|
Run Keyword And Expect Error *
|
||||||
|
... Delete object ${KEY} ${CID} ${S_OID_USER} ${EMPTY}
|
||||||
|
ELSE
|
||||||
Delete object ${KEY} ${CID} ${S_OID_USER} ${EMPTY}
|
Delete object ${KEY} ${CID} ${S_OID_USER} ${EMPTY}
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,7 @@ eACL Deny Replication Operations
|
||||||
|
|
||||||
${FILE} = Generate file of bytes ${SIMPLE_OBJ_SIZE}
|
${FILE} = Generate file of bytes ${SIMPLE_OBJ_SIZE}
|
||||||
|
|
||||||
${CID} = Create container ${WIF_USER} 0x0FFFFFFF ${FULL_PLACEMENT_RULE}
|
${CID} = Create container ${WIF_USER} ${PUBLIC_ACL} ${FULL_PLACEMENT_RULE}
|
||||||
Wait Until Keyword Succeeds ${MORPH_BLOCK_TIME} ${CONTAINER_WAIT_INTERVAL}
|
Wait Until Keyword Succeeds ${MORPH_BLOCK_TIME} ${CONTAINER_WAIT_INTERVAL}
|
||||||
... Container Existing ${WIF_USER} ${CID}
|
... Container Existing ${WIF_USER} ${CID}
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@ Library acl.py
|
||||||
Library neofs.py
|
Library neofs.py
|
||||||
Library payment_neogo.py
|
Library payment_neogo.py
|
||||||
Library Collections
|
Library Collections
|
||||||
|
Library contract_keywords.py
|
||||||
|
|
||||||
Resource common_steps_acl_extended.robot
|
Resource common_steps_acl_extended.robot
|
||||||
Resource payment_operations.robot
|
Resource payment_operations.robot
|
||||||
|
@ -95,11 +96,11 @@ Check eACL MatchType String Equal Request Allow
|
||||||
[Arguments] ${USER_KEY} ${OTHER_KEY}
|
[Arguments] ${USER_KEY} ${OTHER_KEY}
|
||||||
|
|
||||||
${CID} = Create Container Public ${USER_KEY}
|
${CID} = Create Container Public ${USER_KEY}
|
||||||
${S_OID_USER} = Put object ${USER_KEY} ${FILE_S} ${CID} ${EMPTY} ${FILE_USR_HEADER}
|
${S_OID_USER} = Put Object ${USER_KEY} ${FILE_S} ${CID} ${EMPTY} ${FILE_USR_HEADER}
|
||||||
|
|
||||||
${HEADER} = Head object ${USER_KEY} ${CID} ${S_OID_USER} ${EMPTY} json_output=True
|
${HEADER} = Head Object ${USER_KEY} ${CID} ${S_OID_USER} ${EMPTY} json_output=True
|
||||||
&{HEADER_DICT} = Decode Object System Header Json ${HEADER}
|
&{HEADER_DICT} = Decode Object System Header Json ${HEADER}
|
||||||
Get object ${OTHER_KEY} ${CID} ${S_OID_USER} ${EMPTY} ${PATH}
|
Get Object ${OTHER_KEY} ${CID} ${S_OID_USER} ${EMPTY} ${PATH}
|
||||||
|
|
||||||
|
|
||||||
${ID_value} = Get From Dictionary ${HEADER_DICT} ID
|
${ID_value} = Get From Dictionary ${HEADER_DICT} ID
|
||||||
|
@ -149,7 +150,7 @@ Check eACL MatchType String Equal Object
|
||||||
|
|
||||||
|
|
||||||
Log Set eACL for Deny GET operation with StringEqual Object ID
|
Log Set eACL for Deny GET operation with StringEqual Object ID
|
||||||
${ID_value} = Get From Dictionary ${HEADER_DICT} ID
|
${ID_value} = Get From dictionary ${HEADER_DICT} ID
|
||||||
|
|
||||||
${filters} = Create Dictionary headerType=OBJECT matchType=STRING_EQUAL key=$Object:objectID value=${ID_value}
|
${filters} = Create Dictionary headerType=OBJECT matchType=STRING_EQUAL key=$Object:objectID value=${ID_value}
|
||||||
${rule1} = Create Dictionary Operation=GET Access=DENY Role=OTHERS Filters=${filters}
|
${rule1} = Create Dictionary Operation=GET Access=DENY Role=OTHERS Filters=${filters}
|
||||||
|
|
|
@ -51,7 +51,6 @@ Check $Object:creationEpoch Filter with MatchType String Not Equal
|
||||||
${EACL_CUSTOM} = Compose eACL Custom ${HEADER_DICT} STRING_NOT_EQUAL ${FILTER} DENY OTHERS
|
${EACL_CUSTOM} = Compose eACL Custom ${HEADER_DICT} STRING_NOT_EQUAL ${FILTER} DENY OTHERS
|
||||||
Set eACL ${USER_KEY} ${CID} ${EACL_CUSTOM}
|
Set eACL ${USER_KEY} ${CID} ${EACL_CUSTOM}
|
||||||
|
|
||||||
|
|
||||||
Run Keyword And Expect Error ${EACL_ERR_MSG}
|
Run Keyword And Expect Error ${EACL_ERR_MSG}
|
||||||
... Get object ${OTHER_KEY} ${CID} ${S_OID} ${EMPTY} ${OBJECT_PATH}
|
... Get object ${OTHER_KEY} ${CID} ${S_OID} ${EMPTY} ${OBJECT_PATH}
|
||||||
Get object ${OTHER_KEY} ${CID} ${S_OID_NEW} ${EMPTY} ${OBJECT_PATH}
|
Get object ${OTHER_KEY} ${CID} ${S_OID_NEW} ${EMPTY} ${OBJECT_PATH}
|
||||||
|
|
|
@ -50,7 +50,6 @@ Check $Object:payloadLength Filter with MatchType String Not Equal
|
||||||
${EACL_CUSTOM} = Compose eACL Custom ${HEADER_DICT} STRING_NOT_EQUAL ${FILTER} DENY OTHERS
|
${EACL_CUSTOM} = Compose eACL Custom ${HEADER_DICT} STRING_NOT_EQUAL ${FILTER} DENY OTHERS
|
||||||
Set eACL ${USER_KEY} ${CID} ${EACL_CUSTOM}
|
Set eACL ${USER_KEY} ${CID} ${EACL_CUSTOM}
|
||||||
|
|
||||||
|
|
||||||
Run Keyword And Expect Error ${EACL_ERR_MSG}
|
Run Keyword And Expect Error ${EACL_ERR_MSG}
|
||||||
... Get object ${OTHER_KEY} ${CID} ${S_OID_0} ${EMPTY} ${OBJECT_PATH}
|
... Get object ${OTHER_KEY} ${CID} ${S_OID_0} ${EMPTY} ${OBJECT_PATH}
|
||||||
Get object ${OTHER_KEY} ${CID} ${S_OID} ${EMPTY} ${OBJECT_PATH}
|
Get object ${OTHER_KEY} ${CID} ${S_OID} ${EMPTY} ${OBJECT_PATH}
|
||||||
|
|
|
@ -5,6 +5,7 @@ Variables wellknown_acl.py
|
||||||
Library neofs.py
|
Library neofs.py
|
||||||
Library payment_neogo.py
|
Library payment_neogo.py
|
||||||
Library wallet_keywords.py
|
Library wallet_keywords.py
|
||||||
|
Library contract_keywords.py
|
||||||
|
|
||||||
Resource setup_teardown.robot
|
Resource setup_teardown.robot
|
||||||
Resource payment_operations.robot
|
Resource payment_operations.robot
|
||||||
|
@ -20,22 +21,26 @@ Delete Containers
|
||||||
|
|
||||||
[Setup] Setup
|
[Setup] Setup
|
||||||
|
|
||||||
${WALLET} ${ADDR} ${USER_KEY} = Init Wallet with Address ${ASSETS_DIR}
|
${WALLET} ${ADDR} ${USER_KEY} = Prepare Wallet And Deposit
|
||||||
Payment Operations ${ADDR} ${USER_KEY}
|
${WALLET_OTH} ${ADDR_OTH} ${OTHER_KEY} = Prepare Wallet And Deposit
|
||||||
${WALLET_OTH} ${ADDR_OTH} ${OTHER_KEY} = Init Wallet with Address ${ASSETS_DIR}
|
|
||||||
Payment Operations ${ADDR_OTH} ${OTHER_KEY}
|
|
||||||
|
|
||||||
${CID} = Create container ${USER_KEY} ${PUBLIC_ACL} ${COMMON_PLACEMENT_RULE}
|
${CID} = Create container ${USER_KEY} ${PRIVATE_ACL_F} ${COMMON_PLACEMENT_RULE}
|
||||||
Wait Until Keyword Succeeds ${MORPH_BLOCK_TIME} ${CONTAINER_WAIT_INTERVAL}
|
Wait Until Keyword Succeeds ${MORPH_BLOCK_TIME} ${CONTAINER_WAIT_INTERVAL}
|
||||||
... Container Existing ${USER_KEY} ${CID}
|
... Container Existing ${USER_KEY} ${CID}
|
||||||
|
|
||||||
Run Keyword And Expect Error *
|
################################################################
|
||||||
... Delete Container ${CID} ${OTHER_KEY}
|
# No explicit error is expected upon container deletion attempt
|
||||||
|
################################################################
|
||||||
|
Delete Container ${CID} ${OTHER_KEY}
|
||||||
|
Tick Epoch
|
||||||
|
Get container attributes ${USER_KEY} ${CID}
|
||||||
|
|
||||||
Delete Container ${CID} ${USER_KEY}
|
Delete Container ${CID} ${USER_KEY}
|
||||||
|
Tick Epoch
|
||||||
|
Run Keyword And Expect Error *
|
||||||
|
... Get container attributes ${USER_KEY} ${CID}
|
||||||
|
|
||||||
${EXPECTED_ERROR} = Run Keyword And Expect Error *
|
Log If one tries to delete an already deleted container, they should expect success.
|
||||||
... Delete Container ${CID} ${USER_KEY}
|
Delete Container ${CID} ${USER_KEY}
|
||||||
Log Container cannot be deleted: ${EXPECTED_ERROR}
|
|
||||||
|
|
||||||
[Teardown] Teardown container_delete
|
[Teardown] Teardown container_delete
|
||||||
|
|
|
@ -32,7 +32,7 @@ Session Token for Container
|
||||||
|
|
||||||
Sign Session token ${SESSION_TOKEN} ${WALLET} ${SIGNED_FILE}
|
Sign Session token ${SESSION_TOKEN} ${WALLET} ${SIGNED_FILE}
|
||||||
|
|
||||||
${CID} = Create Container ${GEN_KEY} ${PRIVATE_ACL} ${COMMON_PLACEMENT_RULE} ${EMPTY} ${SIGNED_FILE}
|
${CID} = Create Container ${GEN_KEY} ${PRIVATE_ACL_F} ${COMMON_PLACEMENT_RULE} ${EMPTY} ${SIGNED_FILE}
|
||||||
Wait Until Keyword Succeeds ${MORPH_BLOCK_TIME} ${CONTAINER_WAIT_INTERVAL}
|
Wait Until Keyword Succeeds ${MORPH_BLOCK_TIME} ${CONTAINER_WAIT_INTERVAL}
|
||||||
... Container Existing ${OWNER_KEY} ${CID}
|
... Container Existing ${OWNER_KEY} ${CID}
|
||||||
Run Keyword And Expect Error *
|
Run Keyword And Expect Error *
|
||||||
|
|
|
@ -30,10 +30,9 @@ Drop command in control group
|
||||||
${FILE_SIMPLE} = Generate file of bytes ${SIMPLE_OBJ_SIZE}
|
${FILE_SIMPLE} = Generate file of bytes ${SIMPLE_OBJ_SIZE}
|
||||||
${FILE_COMPLEX} = Generate file of bytes ${COMPLEX_OBJ_SIZE}
|
${FILE_COMPLEX} = Generate file of bytes ${COMPLEX_OBJ_SIZE}
|
||||||
|
|
||||||
${WALLET} ${ADDR} ${USER_KEY} = Init Wallet with Address ${ASSETS_DIR}
|
${WALLET} ${ADDR} ${USER_KEY} = Prepare Wallet And Deposit
|
||||||
Payment Operations ${ADDR} ${USER_KEY}
|
|
||||||
|
|
||||||
${PRIV_CID} = Create container ${USER_KEY} ${PRIVATE_ACL} REP 1 CBF 1 SELECT 1 FROM * FILTER 'UN-LOCODE' EQ '${LOCODE}' AS LOC
|
${PRIV_CID} = Create container ${USER_KEY} ${PRIVATE_ACL_F} REP 1 CBF 1 SELECT 1 FROM * FILTER 'UN-LOCODE' EQ '${LOCODE}' AS LOC
|
||||||
Wait Until Keyword Succeeds ${MORPH_BLOCK_TIME} ${CONTAINER_WAIT_INTERVAL}
|
Wait Until Keyword Succeeds ${MORPH_BLOCK_TIME} ${CONTAINER_WAIT_INTERVAL}
|
||||||
... Container Existing ${USER_KEY} ${PRIV_CID}
|
... Container Existing ${USER_KEY} ${PRIV_CID}
|
||||||
|
|
||||||
|
@ -43,15 +42,16 @@ Drop command in control group
|
||||||
|
|
||||||
${S_OID} = Put object ${USER_KEY} ${FILE_SIMPLE} ${PRIV_CID} ${EMPTY} ${EMPTY}
|
${S_OID} = Put object ${USER_KEY} ${FILE_SIMPLE} ${PRIV_CID} ${EMPTY} ${EMPTY}
|
||||||
Get object ${USER_KEY} ${PRIV_CID} ${S_OID} ${EMPTY} s_file_read
|
Get object ${USER_KEY} ${PRIV_CID} ${S_OID} ${EMPTY} s_file_read
|
||||||
Head object ${NEOFS_IR_WIF} ${PRIV_CID} ${S_OID} ${EMPTY} ${EMPTY}
|
Head object ${USER_KEY} ${PRIV_CID} ${S_OID} ${EMPTY} ${EMPTY}
|
||||||
|
|
||||||
Drop object ${NODE} ${WIF} ${PRIV_CID} ${S_OID}
|
Drop object ${NODE} ${WIF} ${PRIV_CID} ${S_OID}
|
||||||
|
|
||||||
Wait Until Keyword Succeeds 3x ${SHARD_0_GC_SLEEP}
|
Wait Until Keyword Succeeds 3x ${SHARD_0_GC_SLEEP}
|
||||||
... Run Keyword And Expect Error Error:*
|
... Run Keyword And Expect Error Error:*
|
||||||
... Get object ${USER_KEY} ${PRIV_CID} ${S_OID} ${EMPTY} s_file_read options='--ttl 1'
|
... Get object ${USER_KEY} ${PRIV_CID} ${S_OID} ${EMPTY} s_file_read options=--ttl 1
|
||||||
Run Keyword And Expect Error Error:*
|
Wait Until Keyword Succeeds 3x ${SHARD_0_GC_SLEEP}
|
||||||
... Head object ${NEOFS_IR_WIF} ${PRIV_CID} ${S_OID} ${EMPTY} ${EMPTY}
|
... Run Keyword And Expect Error Error:*
|
||||||
|
... Head object ${USER_KEY} ${PRIV_CID} ${S_OID} ${EMPTY} ${EMPTY} options=--ttl 1
|
||||||
|
|
||||||
Drop object ${NODE} ${WIF} ${PRIV_CID} ${S_OID}
|
Drop object ${NODE} ${WIF} ${PRIV_CID} ${S_OID}
|
||||||
|
|
||||||
|
@ -61,12 +61,12 @@ Drop command in control group
|
||||||
|
|
||||||
${C_OID} = Put object ${USER_KEY} ${FILE_COMPLEX} ${PRIV_CID} ${EMPTY} ${EMPTY}
|
${C_OID} = Put object ${USER_KEY} ${FILE_COMPLEX} ${PRIV_CID} ${EMPTY} ${EMPTY}
|
||||||
Get object ${USER_KEY} ${PRIV_CID} ${C_OID} ${EMPTY} s_file_read
|
Get object ${USER_KEY} ${PRIV_CID} ${C_OID} ${EMPTY} s_file_read
|
||||||
Head object ${NEOFS_IR_WIF} ${PRIV_CID} ${C_OID} ${EMPTY} ${EMPTY}
|
Head object ${USER_KEY} ${PRIV_CID} ${C_OID} ${EMPTY} ${EMPTY}
|
||||||
|
|
||||||
Drop object ${NODE} ${WIF} ${PRIV_CID} ${C_OID}
|
Drop object ${NODE} ${WIF} ${PRIV_CID} ${C_OID}
|
||||||
|
|
||||||
Get object ${USER_KEY} ${PRIV_CID} ${C_OID} ${EMPTY} s_file_read
|
Get object ${USER_KEY} ${PRIV_CID} ${C_OID} ${EMPTY} s_file_read
|
||||||
Head object ${NEOFS_IR_WIF} ${PRIV_CID} ${C_OID} ${EMPTY} ${EMPTY}
|
Head object ${USER_KEY} ${PRIV_CID} ${C_OID} ${EMPTY} ${EMPTY}
|
||||||
|
|
||||||
@{SPLIT_OIDS} = Get Split objects ${USER_KEY} ${PRIV_CID} ${C_OID}
|
@{SPLIT_OIDS} = Get Split objects ${USER_KEY} ${PRIV_CID} ${C_OID}
|
||||||
FOR ${CHILD_OID} IN @{SPLIT_OIDS}
|
FOR ${CHILD_OID} IN @{SPLIT_OIDS}
|
||||||
|
@ -76,9 +76,10 @@ Drop command in control group
|
||||||
|
|
||||||
Wait Until Keyword Succeeds 3x ${SHARD_0_GC_SLEEP}
|
Wait Until Keyword Succeeds 3x ${SHARD_0_GC_SLEEP}
|
||||||
... Run Keyword And Expect Error Error:*
|
... Run Keyword And Expect Error Error:*
|
||||||
... Get object ${USER_KEY} ${PRIV_CID} ${C_OID} ${EMPTY} s_file_read options='--ttl 1'
|
... Get object ${USER_KEY} ${PRIV_CID} ${C_OID} ${EMPTY} s_file_read options=--ttl 1
|
||||||
Run Keyword And Expect Error Error:*
|
Wait Until Keyword Succeeds 3x ${SHARD_0_GC_SLEEP}
|
||||||
... Head object ${NEOFS_IR_WIF} ${PRIV_CID} ${C_OID} ${EMPTY} ${EMPTY}
|
... Run Keyword And Expect Error Error:*
|
||||||
|
... Head object ${USER_KEY} ${PRIV_CID} ${C_OID} ${EMPTY} ${EMPTY} options=--ttl 1
|
||||||
|
|
||||||
|
|
||||||
[Teardown] Teardown netmap_control_drop
|
[Teardown] Teardown netmap_control_drop
|
||||||
|
|
|
@ -29,7 +29,7 @@ Duplicated Object Attributes
|
||||||
${WALLET} ${ADDR} ${USER_KEY} = Init Wallet with Address ${ASSETS_DIR}
|
${WALLET} ${ADDR} ${USER_KEY} = Init Wallet with Address ${ASSETS_DIR}
|
||||||
Payment Operations ${ADDR} ${USER_KEY}
|
Payment Operations ${ADDR} ${USER_KEY}
|
||||||
|
|
||||||
${PUBLIC_CID} = Create container ${USER_KEY} ${PUBLIC_ACL} ${POLICY} ${EMPTY}
|
${PUBLIC_CID} = Create container ${USER_KEY} ${PUBLIC_ACL_F} ${POLICY} ${EMPTY}
|
||||||
${FILE_S} = Generate file of bytes ${SIMPLE_OBJ_SIZE}
|
${FILE_S} = Generate file of bytes ${SIMPLE_OBJ_SIZE}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -20,9 +20,8 @@ NeoFS Complex Object Operations
|
||||||
|
|
||||||
[Setup] Setup
|
[Setup] Setup
|
||||||
|
|
||||||
${WALLET} ${ADDR} ${WIF} = Init Wallet with Address ${ASSETS_DIR}
|
${WALLET} ${ADDR} ${WIF} = Prepare Wallet And Deposit
|
||||||
Payment Operations ${ADDR} ${WIF}
|
${CID} = Prepare container ${WIF}
|
||||||
Prepare container ${WIF}
|
|
||||||
|
|
||||||
${FILE} = Generate file of bytes ${COMPLEX_OBJ_SIZE}
|
${FILE} = Generate file of bytes ${COMPLEX_OBJ_SIZE}
|
||||||
${FILE_HASH} = Get file hash ${FILE}
|
${FILE_HASH} = Get file hash ${FILE}
|
||||||
|
@ -41,7 +40,7 @@ NeoFS Complex Object Operations
|
||||||
@{S_OBJ_H} = Create List ${H_OID}
|
@{S_OBJ_H} = Create List ${H_OID}
|
||||||
@{S_OBJ_H_OTH} = Create List ${H_OID_OTH}
|
@{S_OBJ_H_OTH} = Create List ${H_OID_OTH}
|
||||||
|
|
||||||
Search object ${WIF} ${CID} --root ${EMPTY} ${EMPTY} ${S_OBJ_ALL}
|
Search Object ${WIF} ${CID} --root ${EMPTY} ${EMPTY} ${S_OBJ_ALL}
|
||||||
|
|
||||||
${GET_OBJ_S} = Get object ${WIF} ${CID} ${S_OID} ${EMPTY} s_file_read
|
${GET_OBJ_S} = Get object ${WIF} ${CID} ${S_OID} ${EMPTY} s_file_read
|
||||||
${GET_OBJ_H} = Get object ${WIF} ${CID} ${H_OID} ${EMPTY} h_file_read
|
${GET_OBJ_H} = Get object ${WIF} ${CID} ${H_OID} ${EMPTY} h_file_read
|
||||||
|
|
|
@ -22,7 +22,7 @@ NeoFS Simple Object Operations
|
||||||
|
|
||||||
${WALLET} ${ADDR} ${WIF} = Init Wallet with Address ${ASSETS_DIR}
|
${WALLET} ${ADDR} ${WIF} = Init Wallet with Address ${ASSETS_DIR}
|
||||||
Payment Operations ${ADDR} ${WIF}
|
Payment Operations ${ADDR} ${WIF}
|
||||||
Prepare container ${WIF}
|
${CID} = Prepare container ${WIF}
|
||||||
|
|
||||||
${FILE} = Generate file of bytes ${SIMPLE_OBJ_SIZE}
|
${FILE} = Generate file of bytes ${SIMPLE_OBJ_SIZE}
|
||||||
${FILE_HASH} = Get file hash ${FILE}
|
${FILE_HASH} = Get file hash ${FILE}
|
||||||
|
|
|
@ -22,7 +22,7 @@ NeoFS Simple Object Operations
|
||||||
|
|
||||||
${WALLET} ${ADDR} ${WIF} = Init Wallet with Address ${ASSETS_DIR}
|
${WALLET} ${ADDR} ${WIF} = Init Wallet with Address ${ASSETS_DIR}
|
||||||
Payment Operations ${ADDR} ${WIF}
|
Payment Operations ${ADDR} ${WIF}
|
||||||
Prepare container ${WIF}
|
${CID} = Prepare container ${WIF}
|
||||||
|
|
||||||
${FILE} = Generate file of bytes ${SIMPLE_OBJ_SIZE}
|
${FILE} = Generate file of bytes ${SIMPLE_OBJ_SIZE}
|
||||||
${FILE_HASH} = Get file hash ${FILE}
|
${FILE_HASH} = Get file hash ${FILE}
|
||||||
|
|
|
@ -19,7 +19,7 @@ NeoFS Complex Storagegroup
|
||||||
|
|
||||||
${WALLET} ${ADDR} ${WIF} = Init Wallet with Address ${ASSETS_DIR}
|
${WALLET} ${ADDR} ${WIF} = Init Wallet with Address ${ASSETS_DIR}
|
||||||
Payment Operations ${ADDR} ${WIF}
|
Payment Operations ${ADDR} ${WIF}
|
||||||
Prepare container ${WIF}
|
${CID} = Prepare container ${WIF}
|
||||||
|
|
||||||
${FILE_S} = Generate file of bytes ${COMPLEX_OBJ_SIZE}
|
${FILE_S} = Generate file of bytes ${COMPLEX_OBJ_SIZE}
|
||||||
${FILE_HASH_S} = Get file hash ${FILE_S}
|
${FILE_HASH_S} = Get file hash ${FILE_S}
|
||||||
|
|
|
@ -19,7 +19,7 @@ NeoFS Simple Storagegroup
|
||||||
|
|
||||||
${WALLET} ${ADDR} ${WIF} = Init Wallet with Address ${ASSETS_DIR}
|
${WALLET} ${ADDR} ${WIF} = Init Wallet with Address ${ASSETS_DIR}
|
||||||
Payment Operations ${ADDR} ${WIF}
|
Payment Operations ${ADDR} ${WIF}
|
||||||
Prepare container ${WIF}
|
${CID} = Prepare container ${WIF}
|
||||||
|
|
||||||
${FILE_S} = Generate file of bytes ${SIMPLE_OBJ_SIZE}
|
${FILE_S} = Generate file of bytes ${SIMPLE_OBJ_SIZE}
|
||||||
${FILE_HASH_S} = Get file hash ${FILE_S}
|
${FILE_HASH_S} = Get file hash ${FILE_S}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
*** Settings ***
|
*** Settings ***
|
||||||
Variables common.py
|
Variables common.py
|
||||||
|
Variables wellknown_acl.py
|
||||||
|
|
||||||
Library neofs.py
|
Library neofs.py
|
||||||
Library payment_neogo.py
|
Library payment_neogo.py
|
||||||
|
@ -7,6 +8,7 @@ Library gates.py
|
||||||
Library wallet_keywords.py
|
Library wallet_keywords.py
|
||||||
Library rpc_call_keywords.py
|
Library rpc_call_keywords.py
|
||||||
|
|
||||||
|
Resource payment_operations.robot
|
||||||
Resource setup_teardown.robot
|
Resource setup_teardown.robot
|
||||||
|
|
||||||
*** Variables ***
|
*** Variables ***
|
||||||
|
@ -22,20 +24,10 @@ NeoFS HTTP Gateway
|
||||||
[Timeout] 5 min
|
[Timeout] 5 min
|
||||||
|
|
||||||
[Setup] Setup
|
[Setup] Setup
|
||||||
${WALLET} ${ADDR} ${WIF} = Init Wallet with Address ${ASSETS_DIR}
|
|
||||||
${TX} = Transfer Mainnet Gas ${MAINNET_WALLET_WIF} ${ADDR} ${TRANSFER_AMOUNT}
|
|
||||||
|
|
||||||
Wait Until Keyword Succeeds ${MAINNET_TIMEOUT} ${MAINNET_BLOCK_TIME}
|
${WALLET} ${ADDR} ${WIF} = Prepare Wallet And Deposit
|
||||||
... Transaction accepted in block ${TX}
|
|
||||||
|
|
||||||
${MAINNET_BALANCE} = Get Mainnet Balance ${ADDR}
|
${CID} = Create container ${WIF} ${PUBLIC_ACL} ${PLACEMENT_RULE}
|
||||||
Should Be Equal As Numbers ${MAINNET_BALANCE} ${TRANSFER_AMOUNT}
|
|
||||||
|
|
||||||
${TX_DEPOSIT} = NeoFS Deposit ${WIF} ${DEPOSIT_AMOUNT}
|
|
||||||
Wait Until Keyword Succeeds ${MAINNET_TIMEOUT} ${MAINNET_BLOCK_TIME}
|
|
||||||
... Transaction accepted in block ${TX_DEPOSIT}
|
|
||||||
|
|
||||||
${CID} = Create container ${WIF} 0x0FFFFFFF ${PLACEMENT_RULE}
|
|
||||||
Wait Until Keyword Succeeds ${MORPH_BLOCK_TIME} ${CONTAINER_WAIT_INTERVAL}
|
Wait Until Keyword Succeeds ${MORPH_BLOCK_TIME} ${CONTAINER_WAIT_INTERVAL}
|
||||||
... Container Existing ${WIF} ${CID}
|
... Container Existing ${WIF} ${CID}
|
||||||
|
|
||||||
|
|
|
@ -7,11 +7,13 @@ Library payment_neogo.py
|
||||||
Library gates.py
|
Library gates.py
|
||||||
Library wallet_keywords.py
|
Library wallet_keywords.py
|
||||||
Library contract_keywords.py
|
Library contract_keywords.py
|
||||||
|
Library Process
|
||||||
|
|
||||||
Resource setup_teardown.robot
|
Resource setup_teardown.robot
|
||||||
|
Resource payment_operations.robot
|
||||||
|
|
||||||
*** Variables ***
|
*** Variables ***
|
||||||
${DEPOSIT_AMOUNT} = ${5}
|
${DEPOSIT} = ${30}
|
||||||
${WIF} = ${MAINNET_WALLET_WIF}
|
${WIF} = ${MAINNET_WALLET_WIF}
|
||||||
${DEPOSIT_TIMEOUT}= 30s
|
${DEPOSIT_TIMEOUT}= 30s
|
||||||
|
|
||||||
|
@ -22,11 +24,7 @@ Buckets in NeoFS S3 Gateway
|
||||||
|
|
||||||
[Setup] Setup
|
[Setup] Setup
|
||||||
|
|
||||||
${WALLET} ${ADDR} = Init Wallet from WIF ${ASSETS_DIR} ${WIF}
|
${WALLET} ${ADDR} ${WIF} = Prepare Wallet And Deposit
|
||||||
${TX_DEPOSIT} = NeoFS Deposit ${WIF} ${DEPOSIT_AMOUNT}
|
|
||||||
Wait Until Keyword Succeeds ${DEPOSIT_TIMEOUT} ${MAINNET_BLOCK_TIME}
|
|
||||||
... Transaction accepted in block ${TX_DEPOSIT}
|
|
||||||
|
|
||||||
${FILE_S3} = Generate file of bytes ${COMPLEX_OBJ_SIZE}
|
${FILE_S3} = Generate file of bytes ${COMPLEX_OBJ_SIZE}
|
||||||
${FILE_S3_NAME} = Get file name ${FILE_S3}
|
${FILE_S3_NAME} = Get file name ${FILE_S3}
|
||||||
|
|
||||||
|
@ -68,5 +66,3 @@ Buckets in NeoFS S3 Gateway
|
||||||
List Should Not Contain Value ${BUCKET_LIST} ${NEW_BUCKET_EMPTY}
|
List Should Not Contain Value ${BUCKET_LIST} ${NEW_BUCKET_EMPTY}
|
||||||
|
|
||||||
[Teardown] Teardown s3_gate_bucket
|
[Teardown] Teardown s3_gate_bucket
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
PUBLIC_ACL = "0x1FFFFFFF"
|
# ACLs with set F flag
|
||||||
PRIVATE_ACL = "0x18888888"
|
PUBLIC_ACL_F = "0x1FBFBFFF"
|
||||||
READONLY_ACL = "0x1FFF88FF"
|
PRIVATE_ACL_F = "0x1C8C8CCC"
|
||||||
|
READONLY_ACL_F = "0x1FBF8CFF"
|
||||||
|
|
||||||
|
# ACLs without F flag set
|
||||||
|
PUBLIC_ACL = "0x0FBFBFFF"
|
||||||
INACCESSIBLE_ACL = "0x40000000"
|
INACCESSIBLE_ACL = "0x40000000"
|
||||||
STICKYBIT_PUB_ACL = "0x3FFFFFFF"
|
STICKYBIT_PUB_ACL = "0x3FFFFFFF"
|
||||||
|
|
Loading…
Reference in a new issue