storage group operations moved from neofs.py; storage group tests

refactored

Signed-off-by: anastasia prasolova <anastasia@nspcc.ru>
This commit is contained in:
anastasia prasolova 2022-05-06 12:53:02 +03:00 committed by Anastasia Prasolova
parent 48730d8f7a
commit d940fe9573
14 changed files with 389 additions and 379 deletions

View file

@ -21,13 +21,14 @@ ROBOT_AUTO_KEYWORDS = False
@keyword('Get Link Object') @keyword('Get Link Object')
def get_link_object(wallet: str, cid: str, oid: str): def get_link_object(wallet: str, cid: str, oid: str, bearer_token: str=""):
""" """
Args: Args:
wallet (str): path to the wallet on whose behalf the Storage Nodes wallet (str): path to the wallet on whose behalf the Storage Nodes
are requested are requested
cid (str): Container ID which stores the Large Object cid (str): Container ID which stores the Large Object
oid (str): Large Object ID oid (str): Large Object ID
bearer_token (optional, str): path to Bearer token file
Returns: Returns:
(str): Link Object ID (str): Link Object ID
When no Link Object ID is found after all Storage Nodes polling, When no Link Object ID is found after all Storage Nodes polling,
@ -38,7 +39,8 @@ def get_link_object(wallet: str, cid: str, oid: str):
resp = neofs_verbs.head_object(wallet, cid, oid, resp = neofs_verbs.head_object(wallet, cid, oid,
endpoint=node, endpoint=node,
is_raw=True, is_raw=True,
is_direct=True) is_direct=True,
bearer_token=bearer_token)
if resp['link']: if resp['link']:
return resp['link'] return resp['link']
except Exception: except Exception:

View file

@ -264,90 +264,6 @@ def find_in_nodes_Log(line: str, nodes_logs_time: dict):
return 1 return 1
@keyword('Put Storagegroup')
def put_storagegroup(wallet: str, cid: str, bearer_token: str="", *oid_list):
cmd_oid_line = ",".join(oid_list)
if bearer_token:
bearer_token = f"--bearer {bearer_token}"
object_cmd = (
f'{NEOFS_CLI_EXEC} --rpc-endpoint {NEOFS_ENDPOINT} --wallet {wallet} --config {WALLET_PASS} '
f'storagegroup put --cid {cid} --members {cmd_oid_line} {bearer_token}'
)
output = _cmd_run(object_cmd)
oid = _parse_oid(output)
return oid
@keyword('List Storagegroup')
def list_storagegroup(wallet: str, cid: str, bearer_token: str="", *expected_list):
if bearer_token:
bearer_token = f"--bearer {bearer_token}"
object_cmd = (
f'{NEOFS_CLI_EXEC} --rpc-endpoint {NEOFS_ENDPOINT} --wallet {wallet} '
f'--config {WALLET_PASS} storagegroup list --cid {cid} {bearer_token}'
)
output = _cmd_run(object_cmd)
found_objects = re.findall(r'(\w{43,44})', output)
if expected_list:
if sorted(found_objects) == sorted(expected_list):
logger.info(f"Found storage group list '{found_objects}' is equal for expected list '{expected_list}'")
else:
raise Exception(f"Found storage group '{found_objects}' is not equal to expected list '{expected_list}'")
return found_objects
@keyword('Get Storagegroup')
def get_storagegroup(wallet: str, cid: str, oid: str, bearer_token: str, expected_size, *expected_objects_list):
if bearer_token:
bearer_token = f"--bearer {bearer_token}"
object_cmd = f'{NEOFS_CLI_EXEC} --rpc-endpoint {NEOFS_ENDPOINT} --wallet {private_key} storagegroup get --cid {cid} --id {oid} {bearer_token}'
output = _cmd_run(object_cmd)
if expected_size:
if re.search(fr'Group size: {expected_size}', output):
logger.info(f"Group size {expected_size} has been found in the output")
else:
raise Exception(f"Group size {expected_size} has not been found in the output")
found_objects = re.findall(r'\s(\w{43,44})\s', output)
if expected_objects_list:
if sorted(found_objects) == sorted(expected_objects_list):
logger.info(f"Found objects list '{found_objects}' is equal for expected list '{expected_objects_list}'")
else:
raise Exception(f"Found object list '{found_objects}' is not equal to expected list '{expected_objects_list}'")
@keyword('Delete Storagegroup')
def delete_storagegroup(wallet: str, cid: str, oid: str, bearer_token: str=""):
if bearer_token:
bearer_token = f"--bearer {bearer_token}"
object_cmd = (
f'{NEOFS_CLI_EXEC} --rpc-endpoint {NEOFS_ENDPOINT} --wallet {wallet} storagegroup '
f'delete --cid {cid} --config {WALLET_PASS} --id {oid} {bearer_token}'
)
output = _cmd_run(object_cmd)
m = re.search(r'Tombstone: ([a-zA-Z0-9-]+)', output)
if m.start() != m.end(): # e.g., if match found something
oid = m.group(1)
else:
raise Exception(f"no Tombstone ID was parsed from command output: \t{output}")
return oid
@keyword('Generate Session Token') @keyword('Generate Session Token')
def generate_session_token(owner: str, pub_key: str, cid: str = "", wildcard: bool = False) -> str: def generate_session_token(owner: str, pub_key: str, cid: str = "", wildcard: bool = False) -> str:

View file

@ -0,0 +1,126 @@
#!/usr/bin/python3
"""
This module contains keywords for work with Storage Groups.
It contains wrappers for `neofs-cli storagegroup` verbs.
"""
from cli_helpers import _cmd_run
from common import NEOFS_CLI_EXEC, NEOFS_ENDPOINT, WALLET_PASS
from robot.api.deco import keyword
ROBOT_AUTO_KEYWORDS = False
@keyword('Put Storagegroup')
def put_storagegroup(wallet: str, cid: str, objects: list, bearer_token: str=""):
"""
Wrapper for `neofs-cli storagegroup put`. Before the SG is created,
neofs-cli performs HEAD on `objects`, so this verb must be allowed
for `wallet` in `cid`.
Args:
wallet (str): path to wallet on whose behalf the SG is created
cid (str): ID of Container to put SG to
objects (list): list of Object IDs to include into the SG
bearer_token (optional, str): path to Bearer token file
Returns:
(str): Object ID of created Storage Group
"""
cmd = (
f'{NEOFS_CLI_EXEC} --rpc-endpoint {NEOFS_ENDPOINT} '
f'--wallet {wallet} --config {WALLET_PASS} '
f'storagegroup put --cid {cid} '
f'--members {",".join(objects)} '
f'{"--bearer " + bearer_token if bearer_token else ""}'
)
output = _cmd_run(cmd)
oid = output.split('\n')[1].split(': ')[1]
return oid
@keyword('List Storagegroup')
def list_storagegroup(wallet: str, cid: str, bearer_token: str=""):
"""
Wrapper for `neofs-cli storagegroup list`. This operation
requires SEARCH allowed for `wallet` in `cid`.
Args:
wallet (str): path to wallet on whose behalf the SGs are
listed in the container
cid (str): ID of Container to list
bearer_token (optional, str): path to Bearer token file
Returns:
(list): Object IDs of found Storage Groups
"""
cmd = (
f'{NEOFS_CLI_EXEC} --rpc-endpoint {NEOFS_ENDPOINT} '
f'--wallet {wallet} --config {WALLET_PASS} storagegroup list '
f'--cid {cid} {"--bearer " + bearer_token if bearer_token else ""}'
)
output = _cmd_run(cmd)
# throwing off the first string of output
found_objects = output.split('\n')[1:]
return found_objects
@keyword('Get Storagegroup')
def get_storagegroup(wallet: str, cid: str, oid: str, bearer_token: str=''):
"""
Wrapper for `neofs-cli storagegroup get`.
Args:
wallet (str): path to wallet on whose behalf the SG is got
cid (str): ID of Container where SG is stored
oid (str): ID of the Storage Group
bearer_token (optional, str): path to Bearer token file
Returns:
(dict): detailed information on the Storage Group
"""
cmd = (
f'{NEOFS_CLI_EXEC} --rpc-endpoint {NEOFS_ENDPOINT} '
f'--wallet {wallet} --config {WALLET_PASS} '
f'storagegroup get --cid {cid} --id {oid} '
f'{"--bearer " + bearer_token if bearer_token else ""}'
)
output = _cmd_run(cmd)
# TODO: temporary solution for parsing output. Needs to be replaced with
# JSON parsing when https://github.com/nspcc-dev/neofs-node/issues/1355
# is done.
strings = output.strip().split('\n')
# first three strings go to `data`;
# skip the 'Members:' string;
# the rest of strings go to `members`
data, members = strings[:3], strings[3:]
sg_dict = {}
for i in data:
key, val = i.split(': ')
sg_dict[key] = val
sg_dict['Members'] = []
for member in members[1:]:
sg_dict['Members'].append(member.strip())
return sg_dict
@keyword('Delete Storagegroup')
def delete_storagegroup(wallet: str, cid: str, oid: str, bearer_token: str=""):
"""
Wrapper for `neofs-cli storagegroup delete`.
Args:
wallet (str): path to wallet on whose behalf the SG is deleted
cid (str): ID of Container where SG is stored
oid (str): ID of the Storage Group
bearer_token (optional, str): path to Bearer token file
Returns:
(str): Tombstone ID of the deleted Storage Group
"""
cmd = (
f'{NEOFS_CLI_EXEC} --rpc-endpoint {NEOFS_ENDPOINT} '
f'--wallet {wallet} --config {WALLET_PASS} '
f'storagegroup delete --cid {cid} --id {oid} '
f'{"--bearer " + bearer_token if bearer_token else ""}'
)
output = _cmd_run(cmd)
tombstone_id = output.strip().split('\n')[1].split(': ')[1]
return tombstone_id

View file

@ -26,7 +26,6 @@ Generate file
Prepare eACL Role rules Prepare eACL Role rules
[Arguments] ${CID} [Arguments] ${CID}
Log Set eACL for different Role cases
# eACL rules for all operations and similar permissions # eACL rules for all operations and similar permissions
@{Roles} = Create List others user system @{Roles} = Create List others user system

View file

@ -11,10 +11,12 @@ Get Object Parts By Link Object
[Documentation] The keyword accepts the ID of a Large Object, retrieves its split [Documentation] The keyword accepts the ID of a Large Object, retrieves its split
... header and returns all Part Object IDs from Link Object. ... header and returns all Part Object IDs from Link Object.
[Arguments] ${WALLET} ${CID} ${LARGE_OID} [Arguments] ${WALLET} ${CID} ${LARGE_OID} ${BEARER}=${EMPTY}
${LINK_OID} = Get Link Object ${WALLET} ${CID} ${LARGE_OID} ${LINK_OID} = Get Link Object ${WALLET} ${CID} ${LARGE_OID}
&{LINK_HEADER} = Head Object ${WALLET} ${CID} ${LINK_OID} is_raw=True ... bearer_token=${BEARER}
&{LINK_HEADER} = Head Object ${WALLET} ${CID} ${LINK_OID}
... is_raw=True bearer_token=${BEARER}
[Return] ${LINK_HEADER.header.split.children} [Return] ${LINK_HEADER.header.split.children}

View file

@ -0,0 +1,131 @@
*** Settings ***
Variables common.py
Library storage_group.py
Library Collections
Resource complex_object_operations.robot
Resource payment_operations.robot
*** Variables ***
${PERMISSION_ERROR} = status: code = 2048 message = access to object operation denied
*** Keywords ***
Run Storage Group Operations And Expect Success
[Arguments] ${WALLET} ${CID} ${OBJECTS} ${OBJ_COMPLEXITY}
[Documentation] This keyword verifies if Object's owner is granted to
... Put, List, Get and Delete a Storage Group which contains
... the Object.
${SG} = Put Storagegroup ${WALLET} ${CID} ${OBJECTS}
Verify List Storage Group ${WALLET} ${CID} ${SG}
Verify Get Storage Group ${WALLET} ${CID} ${SG} ${OBJECTS} ${OBJ_COMPLEXITY}
Delete Storagegroup ${WALLET} ${CID} ${SG}
Run Storage Group Operations And Expect Failure
[Arguments] ${WALLET} ${CID} ${OBJECTS} ${SG}
[Documentation] This keyword verifies if Object's owner isn't granted to
... Put, List, Get and Delete a Storage Group which contains
... the Object.
${ERR} = Run Keyword And Expect Error *
... Put Storagegroup ${WALLET} ${CID} ${OBJECTS}
Should Contain ${ERR} ${PERMISSION_ERROR}
${ERR} = Run Keyword And Expect Error *
... List Storagegroup ${WALLET} ${CID}
Should Contain ${ERR} ${PERMISSION_ERROR}
${ERR} = Run Keyword And Expect Error *
... Get Storagegroup ${WALLET} ${CID} ${SG}
Should Contain ${ERR} ${PERMISSION_ERROR}
${ERR} = Run Keyword And Expect Error *
... Delete Storagegroup ${WALLET} ${CID} ${SG}
Should Contain ${ERR} ${PERMISSION_ERROR}
Run Storage Group Operations With Bearer Token
[Arguments] ${WALLET} ${CID} ${OBJECTS} ${BEARER} ${OBJ_COMPLEXITY}
${SG} = Put Storagegroup ${WALLET} ${CID} ${OBJECTS} bearer_token=${BEARER}
Verify List Storage Group ${WALLET} ${CID} ${SG} ${BEARER}
Verify Get Storage Group ${WALLET} ${CID} ${SG} ${OBJECTS} ${OBJ_COMPLEXITY} ${BEARER}
Delete Storagegroup ${WALLET} ${CID} ${SG} bearer_token=${BEARER}
Run Storage Group Operations On Other's Behalf In RO Container
[Arguments] ${OWNER_WALLET} ${CID} ${OBJECTS} ${OBJ_COMPLEXITY}
[Documentation] ${OWNER_WALLET}: ${OBJECTS}' owner wallet
... ${CID}: ID of read-only container
... ${OBJECTS}: list of Object IDs to include into the Storage Group
... ${OBJ_COMPLEXITY}: [Complex|Simple]
${OTHER_WALLET} ${_} ${_} = Prepare Wallet And Deposit
${SG} = Put Storagegroup ${OWNER_WALLET} ${CID} ${OBJECTS}
${ERR} = Run Keyword And Expect Error *
... Put Storagegroup ${OTHER_WALLET} ${CID} ${OBJECTS}
Should Contain ${ERR} ${PERMISSION_ERROR}
Verify List Storage Group ${OTHER_WALLET} ${CID} ${SG}
Verify Get Storage Group ${OTHER_WALLET} ${CID} ${SG} ${OBJECTS} ${OBJ_COMPLEXITY}
${ERR} = Run Keyword And Expect Error *
... Delete Storagegroup ${OTHER_WALLET} ${CID} ${SG}
Should Contain ${ERR} ${PERMISSION_ERROR}
Run Storage Group Operations On System's Behalf In RO Container
[Arguments] ${CID} ${OBJECTS} ${OBJ_COMPLEXITY}
[Documentation] ${CID}: ID of read-only container
... ${OBJECTS}: list of Object IDs to include into the Storage Group
... ${OBJ_COMPLEXITY}: [Complex|Simple]
...
... In this keyword we create Storage Group on Inner Ring's key behalf
... and include an Object created on behalf of some user. We expect
... that System key is granted to make all operations except DELETE.
# TODO: get rid of WIF and remove `payment_operations.robot` import
${IR_WALLET} ${_} = Prepare Wallet With WIF And Deposit ${NEOFS_IR_WIF}
${SG} = Put Storagegroup ${IR_WALLET} ${CID} ${OBJECTS}
Verify List Storage Group ${IR_WALLET} ${CID} ${SG}
Verify Get Storage Group ${IR_WALLET} ${CID} ${SG} ${OBJECTS} ${OBJ_COMPLEXITY}
${ERR} = Run Keyword And Expect Error *
... Delete Storagegroup ${IR_WALLET} ${CID} ${SG}
Should Contain ${ERR} ${PERMISSION_ERROR}
Verify List Storage Group
[Arguments] ${WALLET} ${CID} ${SG} ${BEARER}=${EMPTY}
@{STORAGE_GROUPS} = List Storagegroup ${WALLET} ${CID} bearer_token=${BEARER}
List Should Contain Value ${STORAGE_GROUPS} ${SG}
... msg="Storage Group hasn't been persisted"
Verify Get Storage Group
[Arguments] ${WALLET} ${CID} ${SG} ${OBJECTS} ${OBJ_COMPLEXITY} ${BEARER}=${EMPTY}
@{PART_OIDS} = Create List
IF """${OBJ_COMPLEXITY}""" == """Complex"""
FOR ${OBJ} IN @{OBJECTS}
${OIDS} = Get Object Parts By Link Object
... ${WALLET} ${CID} ${OBJ} ${BEARER}
@{PART_OIDS} = Combine Lists ${PART_OIDS} ${OIDS}
END
END
${OBJECTS_NUMBER} = Get Length ${OBJECTS}
&{SG_DATA} = Get Storagegroup ${WALLET} ${CID} ${SG} bearer_token=${BEARER}
IF """${OBJ_COMPLEXITY}""" == """Simple"""
${EXPECTED_SIZE} = Evaluate ${SIMPLE_OBJ_SIZE} * ${OBJECTS_NUMBER}
Should Be Equal As Numbers ${SG_DATA}[Group size] ${EXPECTED_SIZE}
Lists Should Be Equal ${SG_DATA}[Members] ${OBJECTS}
ELSE
${EXPECTED_SIZE} = Evaluate ${COMPLEX_OBJ_SIZE} * ${OBJECTS_NUMBER}
Should Be Equal As Numbers ${SG_DATA}[Group size] ${EXPECTED_SIZE}
Lists Should Be Equal ${SG_DATA}[Members] ${PART_OIDS}
END

View file

@ -1,33 +1,35 @@
*** Settings *** *** Settings ***
Variables common.py Variables common.py
Library container.py
Library neofs.py Library neofs.py
Library neofs_verbs.py Library neofs_verbs.py
Library payment_neogo.py Library payment_neogo.py
Library storage_group.py
Library Collections Library Collections
Resource common_steps_acl_basic.robot
Resource payment_operations.robot Resource payment_operations.robot
Resource setup_teardown.robot Resource setup_teardown.robot
Resource complex_object_operations.robot Resource storage_group.robot
Resource common_steps_acl_basic.robot
*** Test cases *** *** Test cases ***
Basic ACL Operations for Private Container Basic ACL Operations for Private Container
[Documentation] Testcase to validate NeoFS operations with ACL for Private Container. [Documentation] Storage Group operations with Private Container.
[Tags] ACL [Tags] ACL
[Timeout] 20 min [Timeout] 10 min
[Setup] Setup [Setup] Setup
${WALLET} ${_} ${_} = Prepare Wallet And Deposit ${WALLET} ${_} ${_} = Prepare Wallet And Deposit
${WALLET_OTH} ${_} ${_} = Prepare Wallet And Deposit ${WALLET_OTH} ${_} ${_} = Prepare Wallet And Deposit
${PRIV_CID} = Create Private Container ${WALLET} ${PRIV_CID} = Create Container ${WALLET}
${FILE_S} ${_} = Generate file ${SIMPLE_OBJ_SIZE} ${FILE_S} ${_} = Generate file ${SIMPLE_OBJ_SIZE}
Check Private Container Simple ${WALLET} ${FILE_S} ${PRIV_CID} ${WALLET_OTH} Check Private Container Simple ${WALLET} ${FILE_S} ${PRIV_CID} ${WALLET_OTH}
${PRIV_CID} = Create Private Container ${WALLET} ${PRIV_CID} = Create Container ${WALLET}
${FILE_S} ${_} = Generate file ${COMPLEX_OBJ_SIZE} ${FILE_S} ${_} = Generate file ${COMPLEX_OBJ_SIZE}
Check Private Container Complex ${WALLET} ${FILE_S} ${PRIV_CID} ${WALLET_OTH} Check Private Container Complex ${WALLET} ${FILE_S} ${PRIV_CID} ${WALLET_OTH}
@ -39,53 +41,18 @@ Basic ACL Operations for Private Container
Check Private Container Check Private Container
[Arguments] ${RUN_TYPE} ${USER_WALLET} ${FILE_S} ${PRIV_CID} ${OTHER_WALLET} [Arguments] ${RUN_TYPE} ${USER_WALLET} ${FILE_S} ${PRIV_CID} ${OTHER_WALLET}
${WALLET_SN} ${ADDR_SN} = Prepare Wallet with WIF And Deposit ${NEOFS_SN_WIF}
${WALLET_IR} ${ADDR_IR} = Prepare Wallet with WIF And Deposit ${NEOFS_IR_WIF} ${WALLET_IR} ${ADDR_IR} = Prepare Wallet with WIF And Deposit ${NEOFS_IR_WIF}
# Put target object to use in storage groups ${OID} = Put object ${USER_WALLET} ${FILE_S} ${PRIV_CID}
${S_OID_USER} = Put object ${USER_WALLET} ${FILE_S} ${PRIV_CID} @{OBJECTS} = Create List ${OID}
Run Storage Group Operations And Expect Success
... ${USER_WALLET} ${PRIV_CID} ${OBJECTS} ${RUN_TYPE}
# Storage group Operations (Put, List, Get, Delete) with different Keys Run Storage Group Operations And Expect Failure
# User group key ... ${OTHER_WALLET} ${PRIV_CID} ${OBJECTS} ${RUN_TYPE}
${SG_OID_INV} = Put Storagegroup ${USER_WALLET} ${PRIV_CID} ${EMPTY} ${S_OID_USER}
${SG_OID} = Put Storagegroup ${USER_WALLET} ${PRIV_CID} ${EMPTY} ${S_OID_USER}
List Storagegroup ${USER_WALLET} ${PRIV_CID} ${EMPTY} ${SG_OID} ${SG_OID_INV}
@{EXPECTED_OIDS} = Run Keyword If "${RUN_TYPE}" == "Complex"
... Get Object Parts By Link Object ${USER_WALLET} ${PRIV_CID} ${S_OID_USER}
... ELSE IF "${RUN_TYPE}" == "Simple" Create List ${S_OID_USER}
Get Storagegroup ${USER_WALLET} ${PRIV_CID} ${SG_OID} ${EMPTY} ${EMPTY} @{EXPECTED_OIDS}
Delete Storagegroup ${USER_WALLET} ${PRIV_CID} ${SG_OID} ${EMPTY}
# In private container, Inner Ring is allowed to read (Storage Group List and Get),
# "Others" group key # so using here keyword for read-only container.
Run Keyword And Expect Error * Run Storage Group Operations On System's Behalf In RO Container
... Put Storagegroup ${OTHER_WALLET} ${PRIV_CID} ${EMPTY} ${S_OID_USER} ... ${PRIV_CID} ${OBJECTS} ${RUN_TYPE}
Run Keyword And Expect Error *
... List Storagegroup ${OTHER_WALLET} ${PRIV_CID} ${EMPTY} ${SG_OID_INV}
Run Keyword And Expect Error *
... Get Storagegroup ${OTHER_WALLET} ${PRIV_CID} ${SG_OID_INV} ${EMPTY} ${EMPTY} ${S_OID_USER}
Run Keyword And Expect Error *
... Delete Storagegroup ${OTHER_WALLET} ${PRIV_CID} ${SG_OID_INV} ${EMPTY}
# System group key (Storage Node)
${SG_OID_SN} = Put Storagegroup ${WALLET_SN} ${PRIV_CID} ${EMPTY} ${S_OID_USER}
List Storagegroup ${WALLET_SN} ${PRIV_CID} ${EMPTY} ${SG_OID_SN} ${SG_OID_INV}
@{EXPECTED_OIDS} = Run Keyword If "${RUN_TYPE}" == "Complex"
... Get Object Parts By Link Object ${WALLET_SN} ${PRIV_CID} ${S_OID_USER}
... ELSE IF "${RUN_TYPE}" == "Simple" Create List ${S_OID_USER}
Get Storagegroup ${WALLET_SN} ${PRIV_CID} ${SG_OID_SN} ${EMPTY} ${EMPTY} @{EXPECTED_OIDS}
Run Keyword And Expect Error *
... Delete Storagegroup ${WALLET_SN} ${PRIV_CID} ${SG_OID_SN} ${EMPTY}
# System group key (Inner Ring Node)
${SG_OID_IR} = Put Storagegroup ${WALLET_IR} ${PRIV_CID} ${EMPTY} ${S_OID_USER}
List Storagegroup ${WALLET_IR} ${PRIV_CID} ${EMPTY} ${SG_OID_SN} ${SG_OID_IR} ${SG_OID_INV}
@{EXPECTED_OIDS} = Run Keyword If "${RUN_TYPE}" == "Complex"
... Get Object Parts By Link Object ${USER_WALLET} ${PRIV_CID} ${S_OID_USER}
... ELSE IF "${RUN_TYPE}" == "Simple" Create List ${S_OID_USER}
Get Storagegroup ${WALLET_IR} ${PRIV_CID} ${SG_OID_IR} ${EMPTY} ${EMPTY} @{EXPECTED_OIDS}
Run Keyword And Expect Error *
... Delete Storagegroup ${WALLET_IR} ${PRIV_CID} ${SG_OID_IR} ${EMPTY}

View file

@ -5,11 +5,12 @@ Library neofs.py
Library neofs_verbs.py Library neofs_verbs.py
Library payment_neogo.py Library payment_neogo.py
Library contract_keywords.py Library contract_keywords.py
Library storage_group.py
Resource common_steps_acl_basic.robot Resource common_steps_acl_basic.robot
Resource payment_operations.robot Resource payment_operations.robot
Resource setup_teardown.robot Resource setup_teardown.robot
Resource complex_object_operations.robot Resource storage_group.robot
*** Test cases *** *** Test cases ***
@ -39,37 +40,15 @@ Basic ACL Operations for Public Container
Check Public Container Check Public Container
[Arguments] ${RUN_TYPE} ${USER_WALLET} ${FILE_S} ${PUBLIC_CID} ${WALLET_OTH} [Arguments] ${RUN_TYPE} ${USER_WALLET} ${FILE_S} ${PUBLIC_CID} ${WALLET_OTH}
# Storage group Operations (Put, List, Get, Delete) ${OID} = Put object ${USER_WALLET} ${FILE_S} ${PUBLIC_CID}
Log Storage group Operations for each Role keys @{OBJECTS} = Create List ${OID}
# Put target object to use in storage groups Run Storage Group Operations And Expect Success
${S_OID} = Put object ${USER_WALLET} ${FILE_S} ${PUBLIC_CID} ... ${USER_WALLET} ${PUBLIC_CID} ${OBJECTS} ${RUN_TYPE}
${WALLET_SN} ${ADDR_SN} = Prepare Wallet with WIF And Deposit ${NEOFS_SN_WIF} Run Storage Group Operations And Expect Success
${WALLET_IR} ${ADDR_IR} = Prepare Wallet with WIF And Deposit ${NEOFS_IR_WIF} ... ${WALLET_OTH} ${PUBLIC_CID} ${OBJECTS} ${RUN_TYPE}
@{ROLES_WALLETS_PASS} = Create List ${USER_WALLET} ${WALLET_OTH} # System isn't allowed to DELETE in Public Container
@{ROLES_WALLETS_SYS} = Create List ${WALLET_IR} ${WALLET_SN} Run Storage Group Operations On System's Behalf In RO Container
... ${PUBLIC_CID} ${OBJECTS} ${RUN_TYPE}
FOR ${ROLE_WALLET} IN @{ROLES_WALLETS_PASS}
${SG_OID_USERS} = Put Storagegroup ${ROLE_WALLET} ${PUBLIC_CID} ${EMPTY} ${S_OID}
List Storagegroup ${ROLE_WALLET} ${PUBLIC_CID} ${EMPTY} ${SG_OID_USERS}
@{EXPECTED_OIDS} = Run Keyword If "${RUN_TYPE}" == "Complex"
... Get Object Parts By Link Object ${ROLE_WALLET} ${PUBLIC_CID} ${S_OID}
... ELSE IF "${RUN_TYPE}" == "Simple" Create List ${S_OID}
Get Storagegroup ${ROLE_WALLET} ${PUBLIC_CID} ${SG_OID_USERS} ${EMPTY} ${EMPTY} @{EXPECTED_OIDS}
Delete Storagegroup ${ROLE_WALLET} ${PUBLIC_CID} ${SG_OID_USERS} ${EMPTY}
Tick Epoch
END
FOR ${ROLE_WALLET} IN @{ROLES_WALLETS_SYS}
${SG_OID_SYS} = Put Storagegroup ${ROLE_WALLET} ${PUBLIC_CID} ${EMPTY} ${S_OID}
List Storagegroup ${ROLE_WALLET} ${PUBLIC_CID} ${EMPTY} ${SG_OID_SYS}
@{EXPECTED_OIDS} = Run Keyword If "${RUN_TYPE}" == "Complex"
... Get Object Parts By Link Object ${ROLE_WALLET} ${PUBLIC_CID} ${S_OID}
... ELSE IF "${RUN_TYPE}" == "Simple" Create List ${S_OID}
Get Storagegroup ${ROLE_WALLET} ${PUBLIC_CID} ${SG_OID_SYS} ${EMPTY} ${EMPTY} @{EXPECTED_OIDS}
Run Keyword And Expect Error *
... Delete Storagegroup ${ROLE_WALLET} ${PUBLIC_CID} ${SG_OID_SYS} ${EMPTY}
Delete Storagegroup ${USER_WALLET} ${PUBLIC_CID} ${SG_OID_SYS} ${EMPTY}
Tick Epoch
END

View file

@ -8,7 +8,6 @@ Library payment_neogo.py
Resource common_steps_acl_basic.robot Resource common_steps_acl_basic.robot
Resource payment_operations.robot Resource payment_operations.robot
Resource setup_teardown.robot Resource setup_teardown.robot
Resource complex_object_operations.robot
*** Test cases *** *** Test cases ***
@ -38,8 +37,8 @@ Basic ACL Operations for Read-Only Container
Check Read-Only Container Check Read-Only Container
[Arguments] ${RUN_TYPE} ${USER_WALLET} ${FILE_S} ${READONLY_CID} ${WALLET_OTH} [Arguments] ${RUN_TYPE} ${USER_WALLET} ${FILE_S} ${READONLY_CID} ${WALLET_OTH}
${WALLET_SN} ${ADDR_SN} = Prepare Wallet with WIF And Deposit ${NEOFS_SN_WIF} ${WALLET_SN} ${_} = Prepare Wallet with WIF And Deposit ${NEOFS_SN_WIF}
${WALLET_IR} ${ADDR_IR} = Prepare Wallet with WIF And Deposit ${NEOFS_IR_WIF} ${WALLET_IR} ${_} = Prepare Wallet with WIF And Deposit ${NEOFS_IR_WIF}
# Put # Put
${S_OID_USER} = Put Object ${USER_WALLET} ${FILE_S} ${READONLY_CID} ${S_OID_USER} = Put Object ${USER_WALLET} ${FILE_S} ${READONLY_CID}
@ -48,36 +47,6 @@ Check Read-Only Container
${S_OID_SYS_IR} = Put Object ${WALLET_IR} ${FILE_S} ${READONLY_CID} ${S_OID_SYS_IR} = Put Object ${WALLET_IR} ${FILE_S} ${READONLY_CID}
${S_OID_SYS_SN} = Put object ${WALLET_SN} ${FILE_S} ${READONLY_CID} ${S_OID_SYS_SN} = Put object ${WALLET_SN} ${FILE_S} ${READONLY_CID}
# Storage group Operations (Put, List, Get, Delete)
${SG_OID_INV} = Put Storagegroup ${USER_WALLET} ${READONLY_CID} ${EMPTY} ${S_OID_USER}
${SG_OID_1} = Put Storagegroup ${USER_WALLET} ${READONLY_CID} ${EMPTY} ${S_OID_USER}
List Storagegroup ${USER_WALLET} ${READONLY_CID} ${EMPTY} ${SG_OID_1} ${SG_OID_INV}
@{EXPECTED_OIDS} = Run Keyword If "${RUN_TYPE}" == "Complex"
... Get Object Parts By Link Object ${USER_WALLET} ${READONLY_CID} ${S_OID_USER}
... ELSE IF "${RUN_TYPE}" == "Simple" Create List ${S_OID_USER}
Get Storagegroup ${USER_WALLET} ${READONLY_CID} ${SG_OID_1} ${EMPTY} ${EMPTY} @{EXPECTED_OIDS}
Delete Storagegroup ${USER_WALLET} ${READONLY_CID} ${SG_OID_1} ${EMPTY}
Run Keyword And Expect Error *
... Put Storagegroup ${WALLET_OTH} ${READONLY_CID} ${EMPTY} ${S_OID_USER}
List Storagegroup ${WALLET_OTH} ${READONLY_CID} ${EMPTY} ${SG_OID_INV}
@{EXPECTED_OIDS} = Run Keyword If "${RUN_TYPE}" == "Complex"
... Get Object Parts By Link Object ${USER_WALLET} ${READONLY_CID} ${S_OID_USER}
... ELSE IF "${RUN_TYPE}" == "Simple" Create List ${S_OID_USER}
Get Storagegroup ${WALLET_OTH} ${READONLY_CID} ${SG_OID_INV} ${EMPTY} ${EMPTY} @{EXPECTED_OIDS}
Run Keyword And Expect Error *
... Delete Storagegroup ${WALLET_OTH} ${READONLY_CID} ${SG_OID_INV} ${EMPTY}
${SG_OID_IR} = Put Storagegroup ${WALLET_IR} ${READONLY_CID} ${EMPTY} ${S_OID_USER}
List Storagegroup ${WALLET_IR} ${READONLY_CID} ${EMPTY} ${SG_OID_INV} ${SG_OID_IR}
@{EXPECTED_OIDS} = Run Keyword If "${RUN_TYPE}" == "Complex"
... Get Object Parts By Link Object ${USER_WALLET} ${READONLY_CID} ${S_OID_USER}
... ELSE IF "${RUN_TYPE}" == "Simple" Create List ${S_OID_USER}
Get Storagegroup ${WALLET_IR} ${READONLY_CID} ${SG_OID_IR} ${EMPTY} ${EMPTY} @{EXPECTED_OIDS}
Run Keyword And Expect Error *
... Delete Storagegroup ${WALLET_IR} ${READONLY_CID} ${SG_OID_IR} ${EMPTY}
# Get # Get
Get object ${USER_WALLET} ${READONLY_CID} ${S_OID_USER} ${EMPTY} s_file_read Get object ${USER_WALLET} ${READONLY_CID} ${S_OID_USER} ${EMPTY} s_file_read
Get Object ${WALLET_OTH} ${READONLY_CID} ${S_OID_USER} ${EMPTY} s_file_read Get Object ${WALLET_OTH} ${READONLY_CID} ${S_OID_USER} ${EMPTY} s_file_read

View file

@ -4,11 +4,12 @@ Variables common.py
Library neofs.py Library neofs.py
Library neofs_verbs.py Library neofs_verbs.py
Library payment_neogo.py Library payment_neogo.py
Library storage_group.py
Resource common_steps_acl_basic.robot Resource common_steps_acl_basic.robot
Resource payment_operations.robot Resource payment_operations.robot
Resource setup_teardown.robot Resource setup_teardown.robot
Resource complex_object_operations.robot Resource storage_group.robot
*** Test cases *** *** Test cases ***
@ -37,41 +38,20 @@ Basic ACL Operations for Read-Only Container
Check Read-Only Container Check Read-Only Container
[Arguments] ${RUN_TYPE} ${USER_WALLET} ${FILE_S} ${READONLY_CID} ${WALLET_OTH} [Arguments] ${RUN_TYPE} ${USER_WALLET} ${FILE} ${READONLY_CID} ${WALLET_OTH}
${WALLET_IR} ${ADDR_IR} = Prepare Wallet with WIF And Deposit ${NEOFS_IR_WIF} ${WALLET_IR} ${ADDR_IR} = Prepare Wallet with WIF And Deposit ${NEOFS_IR_WIF}
# Put target object to use in storage groups ${OID} = Put object ${USER_WALLET} ${FILE} ${READONLY_CID}
${S_OID_USER} = Put object ${USER_WALLET} ${FILE_S} ${READONLY_CID} @{OBJECTS} = Create List ${OID}
# Storage group Operations (Put, List, Get, Delete) for Read-only container ${SG_1} = Put Storagegroup ${USER_WALLET} ${READONLY_CID} ${OBJECTS}
${SG_OID_INV} = Put Storagegroup ${USER_WALLET} ${READONLY_CID} ${EMPTY} ${S_OID_USER} Run Storage Group Operations And Expect Success
${SG_OID_1} = Put Storagegroup ${USER_WALLET} ${READONLY_CID} ${EMPTY} ${S_OID_USER} ... ${USER_WALLET} ${READONLY_CID} ${OBJECTS} ${RUN_TYPE}
List Storagegroup ${USER_WALLET} ${READONLY_CID} ${EMPTY} ${SG_OID_1} ${SG_OID_INV}
@{EXPECTED_OIDS} = Run Keyword If "${RUN_TYPE}" == "Complex"
... Get Object Parts By Link Object ${USER_WALLET} ${READONLY_CID} ${S_OID_USER}
... ELSE IF "${RUN_TYPE}" == "Simple" Create List ${S_OID_USER}
Get Storagegroup ${USER_WALLET} ${READONLY_CID} ${SG_OID_1} ${EMPTY} ${EMPTY} @{EXPECTED_OIDS}
Delete Storagegroup ${USER_WALLET} ${READONLY_CID} ${SG_OID_1} ${EMPTY}
Run Storage Group Operations On Other's Behalf in RO Container
... ${USER_WALLET} ${READONLY_CID} ${OBJECTS} ${RUN_TYPE}
Run Keyword And Expect Error * Run Storage Group Operations On System's Behalf in RO Container
... Put Storagegroup ${WALLET_OTH} ${READONLY_CID} ${EMPTY} ${S_OID_USER} ... ${READONLY_CID} ${OBJECTS} ${RUN_TYPE}
List Storagegroup ${WALLET_OTH} ${READONLY_CID} ${EMPTY} ${SG_OID_INV}
@{EXPECTED_OIDS} = Run Keyword If "${RUN_TYPE}" == "Complex"
... Get Object Parts By Link Object ${USER_WALLET} ${READONLY_CID} ${S_OID_USER}
... ELSE IF "${RUN_TYPE}" == "Simple" Create List ${S_OID_USER}
Get Storagegroup ${WALLET_OTH} ${READONLY_CID} ${SG_OID_INV} ${EMPTY} ${EMPTY} @{EXPECTED_OIDS}
Run Keyword And Expect Error *
... Delete Storagegroup ${WALLET_OTH} ${READONLY_CID} ${SG_OID_INV} ${EMPTY}
${SG_OID_IR} = Put Storagegroup ${WALLET_IR} ${READONLY_CID} ${EMPTY} ${S_OID_USER}
List Storagegroup ${WALLET_IR} ${READONLY_CID} ${EMPTY} ${SG_OID_INV} ${SG_OID_IR}
@{EXPECTED_OIDS} = Run Keyword If "${RUN_TYPE}" == "Complex"
... Get Object Parts By Link Object ${USER_WALLET} ${READONLY_CID} ${S_OID_USER}
... ELSE IF "${RUN_TYPE}" == "Simple" Create List ${S_OID_USER}
Get Storagegroup ${WALLET_IR} ${READONLY_CID} ${SG_OID_IR} ${EMPTY} ${EMPTY} @{EXPECTED_OIDS}
Run Keyword And Expect Error *
... Delete Storagegroup ${WALLET_IR} ${READONLY_CID} ${SG_OID_INV} ${EMPTY}

View file

@ -5,13 +5,12 @@ Library Collections
Library acl.py Library acl.py
Library neofs.py Library neofs.py
Library neofs_verbs.py Library neofs_verbs.py
Library payment_neogo.py
Resource eacl_tables.robot
Resource common_steps_acl_bearer.robot Resource common_steps_acl_bearer.robot
Resource eacl_tables.robot
Resource payment_operations.robot Resource payment_operations.robot
Resource setup_teardown.robot Resource setup_teardown.robot
Resource complex_object_operations.robot Resource storage_group.robot
*** Test cases *** *** Test cases ***
@ -24,15 +23,12 @@ BearerToken Operations
${WALLET} ${_} ${_} = Prepare Wallet And Deposit ${WALLET} ${_} ${_} = Prepare Wallet And Deposit
Log Check Bearer token with simple object
${FILE_S} = Generate file ${SIMPLE_OBJ_SIZE} ${FILE_S} = Generate file ${SIMPLE_OBJ_SIZE}
Check eACL Deny and Allow All Bearer Simple ${WALLET} ${FILE_S} Check eACL Deny and Allow All Bearer Simple ${WALLET} ${FILE_S}
Log Check Bearer token with complex object
${FILE_S} = Generate file ${COMPLEX_OBJ_SIZE} ${FILE_S} = Generate file ${COMPLEX_OBJ_SIZE}
Check eACL Deny and Allow All Bearer Complex ${WALLET} ${FILE_S} Check eACL Deny and Allow All Bearer Complex ${WALLET} ${FILE_S}
[Teardown] Teardown acl_bearer_allow_storagegroup [Teardown] Teardown acl_bearer_allow_storagegroup
@ -43,49 +39,33 @@ Check eACL Deny and Allow All Bearer
[Arguments] ${RUN_TYPE} ${WALLET} ${FILE_S} [Arguments] ${RUN_TYPE} ${WALLET} ${FILE_S}
${CID} = Create Container Public ${WALLET} ${CID} = Create Container Public ${WALLET}
${S_OID_USER} = Put object ${WALLET} ${FILE_S} ${CID} ${OID} = Put object ${WALLET} ${FILE_S} ${CID}
@{OBJECTS} = Create List ${OID}
Run Storage Group Operations and Expect Success
... ${WALLET} ${CID} ${OBJECTS} ${RUN_TYPE}
${SG} = Put Storagegroup ${WALLET} ${CID} ${OBJECTS}
Prepare eACL Role rules ${CID} Prepare eACL Role rules ${CID}
# Storage group Operations (Put, List, Get, Delete)
${SG_OID_INV} = Put Storagegroup ${WALLET} ${CID} ${EMPTY} ${S_OID_USER}
${SG_OID_1} = Put Storagegroup ${WALLET} ${CID} ${EMPTY} ${S_OID_USER}
List Storagegroup ${WALLET} ${CID} ${EMPTY} ${SG_OID_1} ${SG_OID_INV}
@{EXPECTED_OIDS} = Run Keyword If "${RUN_TYPE}" == "Complex"
... Get Object Parts By Link Object ${WALLET} ${CID} ${S_OID_USER}
... ELSE IF "${RUN_TYPE}" == "Simple" Create List ${S_OID_USER}
Get Storagegroup ${WALLET} ${CID} ${SG_OID_1} ${EMPTY} ${EMPTY} @{EXPECTED_OIDS}
Delete Storagegroup ${WALLET} ${CID} ${SG_OID_1} ${EMPTY}
Set eACL ${WALLET} ${CID} ${EACL_DENY_ALL_USER} Set eACL ${WALLET} ${CID} ${EACL_DENY_ALL_USER}
# The current ACL cache lifetime is 30 sec Run Storage Group Operations and Expect Failure
Sleep ${NEOFS_CONTRACT_CACHE_TIMEOUT} ... ${WALLET} ${CID} ${OBJECTS} ${SG}
${rule1}= Create Dictionary Operation=GET Access=ALLOW Role=USER ${RULE_GET} = Create Dictionary Operation=GET Access=ALLOW Role=USER
${rule2}= Create Dictionary Operation=HEAD Access=ALLOW Role=USER ${RULE_HEAD} = Create Dictionary Operation=HEAD Access=ALLOW Role=USER
${rule3}= Create Dictionary Operation=PUT Access=ALLOW Role=USER ${RULE_PUT} = Create Dictionary Operation=PUT Access=ALLOW Role=USER
${rule4}= Create Dictionary Operation=DELETE Access=ALLOW Role=USER ${RULE_DELETE} = Create Dictionary Operation=DELETE Access=ALLOW Role=USER
${rule5}= Create Dictionary Operation=SEARCH Access=ALLOW Role=USER ${RULE_SEARCH} = Create Dictionary Operation=SEARCH Access=ALLOW Role=USER
${rule6}= Create Dictionary Operation=GETRANGE Access=ALLOW Role=USER
${rule7}= Create Dictionary Operation=GETRANGEHASH Access=ALLOW Role=USER
${eACL_gen}= Create List ${rule1} ${rule2} ${rule3} ${rule4} ${rule5} ${rule6} ${rule7}
${eACL_gen}= Create List
... ${RULE_GET}
... ${RULE_HEAD}
... ${RULE_PUT}
... ${RULE_DELETE}
... ${RULE_SEARCH}
${EACL_TOKEN} = Form BearerToken File ${WALLET} ${CID} ${eACL_gen} ${EACL_TOKEN} = Form BearerToken File ${WALLET} ${CID} ${eACL_gen}
# All storage groups should fail without bearer token Run Storage Group Operations With Bearer Token
Run Keyword And Expect Error * ... ${WALLET} ${CID} ${OBJECTS} ${EACL_TOKEN} ${RUN_TYPE}
... Put Storagegroup ${WALLET} ${CID} ${EMPTY} ${S_OID_USER}
Run Keyword And Expect Error *
... List Storagegroup ${WALLET} ${CID} ${EMPTY} ${SG_OID_1} ${SG_OID_INV}
Run Keyword And Expect Error *
... Get Storagegroup ${WALLET} ${CID} ${SG_OID_1} ${EMPTY} ${EMPTY} @{EXPECTED_OIDS}
Run Keyword And Expect Error *
... Delete Storagegroup ${WALLET} ${CID} ${SG_OID_1} ${EMPTY}
# Storagegroup should passed with User group key and bearer token
${SG_OID_NEW} = Put Storagegroup ${WALLET} ${CID} ${EACL_TOKEN} ${S_OID_USER}
List Storagegroup ${WALLET} ${CID} ${EACL_TOKEN} ${SG_OID_NEW} ${SG_OID_INV}
Get Storagegroup ${WALLET} ${CID} ${SG_OID_INV} ${EACL_TOKEN} ${EMPTY} @{EXPECTED_OIDS}
Delete Storagegroup ${WALLET} ${CID} ${SG_OID_INV} ${EACL_TOKEN}

View file

@ -3,17 +3,16 @@ Variables common.py
Library neofs.py Library neofs.py
Library neofs_verbs.py Library neofs_verbs.py
Library payment_neogo.py Library storage_group.py
Library Collections Library Collections
Resource common_steps_object.robot Resource common_steps_object.robot
Resource setup_teardown.robot Resource setup_teardown.robot
Resource payment_operations.robot Resource payment_operations.robot
Resource complex_object_operations.robot Resource storage_group.robot
*** Variables *** *** Variables ***
${UNEXIST_OID} = B2DKvkHnLnPvapbDgfpU1oVUPuXQo5LTfKVxmNDZXQff @{UNEXIST_OID} = B2DKvkHnLnPvapbDgfpU1oVUPuXQo5LTfKVxmNDZXQff
&{USER_HEADER} = key1=1 key2=2
*** Test cases *** *** Test cases ***
NeoFS Complex Storagegroup NeoFS Complex Storagegroup
@ -23,47 +22,26 @@ NeoFS Complex Storagegroup
[Setup] Setup [Setup] Setup
${WALLET} ${ADDR} ${WIF} = Prepare Wallet And Deposit ${WALLET} ${_} ${WIF} = Prepare Wallet And Deposit
${CID} = Prepare container ${WIF} ${WALLET} ${CID} = Prepare container ${WIF} ${WALLET}
${FILE_S} = Generate file of bytes ${COMPLEX_OBJ_SIZE} ${FILE} = Generate file of bytes ${COMPLEX_OBJ_SIZE}
${FILE_HASH_S} = Get file hash ${FILE_S}
# Put two Simple Object ${OID_1} = Put object ${WALLET} ${FILE} ${CID}
${S_OID_1} = Put object ${WALLET} ${FILE_S} ${CID} ${OID_2} = Put object ${WALLET} ${FILE} ${CID}
${S_OID_2} = Put object ${WALLET} ${FILE_S} ${CID} user_headers=&{USER_HEADER}
@{S_OBJ_ALL} = Create List ${S_OID_1} ${S_OID_2} @{ONE_OBJECT} = Create List ${OID_1}
@{TWO_OBJECTS} = Create List ${OID_1} ${OID_2}
Log Storage group with 1 object Run Storage Group Operations And Expect Success
${SG_OID_1} = Put Storagegroup ${WALLET} ${CID} ${EMPTY} ${S_OID_1} ... ${WALLET} ${CID} ${ONE_OBJECT} Complex
List Storagegroup ${WALLET} ${CID} ${EMPTY} ${SG_OID_1}
@{SPLIT_OBJ_1} = Get Object Parts By Link Object ${WALLET} ${CID} ${S_OID_1}
Get Storagegroup ${WALLET} ${CID} ${SG_OID_1} ${EMPTY} ${COMPLEX_OBJ_SIZE} @{SPLIT_OBJ_1}
${Tombstone} = Delete Storagegroup ${WALLET} ${CID} ${SG_OID_1} ${EMPTY}
Verify Head tombstone ${WALLET} ${CID} ${Tombstone} ${SG_OID_1} ${ADDR}
Run Keyword And Expect Error *
... Get Storagegroup ${WALLET} ${CID} ${SG_OID_1} ${EMPTY} ${COMPLEX_OBJ_SIZE} @{SPLIT_OBJ_1}
List Storagegroup ${WALLET} ${CID} ${EMPTY} @{EMPTY}
Log Storage group with 2 objects Run Storage Group Operations And Expect Success
${SG_OID_2} = Put Storagegroup ${WALLET} ${CID} ${EMPTY} @{S_OBJ_ALL} ... ${WALLET} ${CID} ${TWO_OBJECTS} Complex
List Storagegroup ${WALLET} ${CID} ${EMPTY} ${SG_OID_2}
@{SPLIT_OBJ_2} = Get Object Parts By Link Object ${WALLET} ${CID} ${S_OID_2}
@{SPLIT_OBJ_ALL} = Combine Lists ${SPLIT_OBJ_1} ${SPLIT_OBJ_2}
${EXPECTED_SIZE} = Evaluate 2*${COMPLEX_OBJ_SIZE}
Get Storagegroup ${WALLET} ${CID} ${SG_OID_2} ${EMPTY} ${EXPECTED_SIZE} @{SPLIT_OBJ_ALL}
${Tombstone} = Delete Storagegroup ${WALLET} ${CID} ${SG_OID_2} ${EMPTY}
Verify Head tombstone ${WALLET} ${CID} ${Tombstone} ${SG_OID_2} ${ADDR}
Run Keyword And Expect Error *
... Get Storagegroup ${WALLET} ${CID} ${SG_OID_2} ${EMPTY} ${EXPECTED_SIZE} @{SPLIT_OBJ_ALL}
List Storagegroup ${WALLET} ${CID} ${EMPTY} @{EMPTY}
Log Incorrect input
Run Keyword And Expect Error * Run Keyword And Expect Error *
... Put Storagegroup ${WALLET} ${CID} ${EMPTY} ${UNEXIST_OID} ... Put Storagegroup ${WALLET} ${CID} ${UNEXIST_OID}
Run Keyword And Expect Error * Run Keyword And Expect Error *
... Delete Storagegroup ${WALLET} ${CID} ${UNEXIST_OID} ${EMPTY} ... Delete Storagegroup ${WALLET} ${CID} ${UNEXIST_OID}
[Teardown] Teardown object_storage_group_complex [Teardown] Teardown object_storage_group_complex

View file

@ -4,63 +4,44 @@ Variables common.py
Library neofs.py Library neofs.py
Library neofs_verbs.py Library neofs_verbs.py
Library payment_neogo.py Library payment_neogo.py
Library storage_group.py
Resource common_steps_object.robot Resource common_steps_object.robot
Resource setup_teardown.robot Resource setup_teardown.robot
Resource payment_operations.robot Resource payment_operations.robot
Resource storage_group.robot
*** Variables *** *** Variables ***
${UNEXIST_OID} = B2DKvkHnLnPvapbDgfpU1oVUPuXQo5LTfKVxmNDZXQff @{UNEXIST_OID} = B2DKvkHnLnPvapbDgfpU1oVUPuXQo5LTfKVxmNDZXQff
&{USER_HEADER} = key1=1 key2=2
*** Test cases *** *** Test cases ***
NeoFS Simple Storagegroup NeoFS Simple Storagegroup
[Documentation] Testcase to validate NeoFS operations with Storagegroup. [Documentation] Testcase to validate NeoFS operations with Storagegroup.
[Tags] Object NeoFS NeoCLI [Tags] Object
[Timeout] 20 min [Timeout] 20 min
[Setup] Setup [Setup] Setup
${WALLET} ${ADDR} ${WIF} = Prepare Wallet And Deposit ${WALLET} ${_} ${WIF} = Prepare Wallet And Deposit
${CID} = Prepare container ${WIF} ${WALLET} ${CID} = Prepare container ${WIF} ${WALLET}
${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}
${OID_1} = Put object ${WALLET} ${FILE_S} ${CID}
${OID_2} = Put object ${WALLET} ${FILE_S} ${CID}
# Put two Simple Object @{ONE_OBJECT} = Create List ${OID_1}
${S_OID_1} = Put object ${WALLET} ${FILE_S} ${CID} @{TWO_OBJECTS} = Create List ${OID_1} ${OID_2}
${S_OID_2} = Put object ${WALLET} ${FILE_S} ${CID} user_headers=&{USER_HEADER}
@{S_OBJ_ALL} = Create List ${S_OID_1} ${S_OID_2} Run Storage Group Operations And Expect Success
... ${WALLET} ${CID} ${ONE_OBJECT} Simple
Log Storage group with 1 object Run Storage Group Operations And Expect Success
${SG_OID_1} = Put Storagegroup ${WALLET} ${CID} ${EMPTY} ${S_OID_1} ... ${WALLET} ${CID} ${TWO_OBJECTS} Simple
List Storagegroup ${WALLET} ${CID} ${EMPTY} ${SG_OID_1}
Get Storagegroup ${WALLET} ${CID} ${SG_OID_1} ${EMPTY} ${SIMPLE_OBJ_SIZE} ${S_OID_1}
${Tombstone} = Delete Storagegroup ${WALLET} ${CID} ${SG_OID_1} ${EMPTY}
Verify Head tombstone ${WALLET} ${CID} ${Tombstone} ${SG_OID_1} ${ADDR}
Run Keyword And Expect Error *
... Get Storagegroup ${WALLET} ${CID} ${SG_OID_1} ${EMPTY} ${SIMPLE_OBJ_SIZE} ${S_OID_1}
List Storagegroup ${WALLET} ${CID} ${EMPTY} @{EMPTY}
Log Storage group with 2 objects
${SG_OID_2} = Put Storagegroup ${WALLET} ${CID} ${EMPTY} @{S_OBJ_ALL}
List Storagegroup ${WALLET} ${CID} ${EMPTY} ${SG_OID_2}
${EXPECTED_SIZE} = Evaluate 2*${SIMPLE_OBJ_SIZE}
Get Storagegroup ${WALLET} ${CID} ${SG_OID_2} ${EMPTY} ${EXPECTED_SIZE} @{S_OBJ_ALL}
${Tombstone} = Delete Storagegroup ${WALLET} ${CID} ${SG_OID_2} ${EMPTY}
Verify Head tombstone ${WALLET} ${CID} ${Tombstone} ${SG_OID_2} ${ADDR}
Run Keyword And Expect Error *
... Get Storagegroup ${WALLET} ${CID} ${SG_OID_2} ${EMPTY} ${EXPECTED_SIZE} @{S_OBJ_ALL}
List Storagegroup ${WALLET} ${CID} ${EMPTY} @{EMPTY}
Log Incorrect input
Run Keyword And Expect Error * Run Keyword And Expect Error *
... Put Storagegroup ${WALLET} ${CID} ${EMPTY} ${UNEXIST_OID} ... Put Storagegroup ${WALLET} ${CID} ${UNEXIST_OID}
Run Keyword And Expect Error * Run Keyword And Expect Error *
... Delete Storagegroup ${WALLET} ${CID} ${UNEXIST_OID} ${EMPTY} ... Delete Storagegroup ${WALLET} ${CID} ${UNEXIST_OID}
[Teardown] Teardown object_storage_group_simple [Teardown] Teardown object_storage_group_simple

View file

@ -11,8 +11,8 @@ CONTAINER_WAIT_INTERVAL = "1m"
NEOFS_EPOCH_TIMEOUT = (os.getenv("NEOFS_EPOCH_TIMEOUT") if os.getenv("NEOFS_EPOCH_TIMEOUT") NEOFS_EPOCH_TIMEOUT = (os.getenv("NEOFS_EPOCH_TIMEOUT") if os.getenv("NEOFS_EPOCH_TIMEOUT")
else os.getenv("NEOFS_IR_TIMERS_EPOCH", "300s")) else os.getenv("NEOFS_IR_TIMERS_EPOCH", "300s"))
SIMPLE_OBJ_SIZE = os.getenv("SIMPLE_OBJ_SIZE", "1000") SIMPLE_OBJ_SIZE = "1000"
COMPLEX_OBJ_SIZE = os.getenv("COMPLEX_OBJ_SIZE", "2000") COMPLEX_OBJ_SIZE = "2000"
MAINNET_BLOCK_TIME = os.getenv('MAINNET_BLOCK_TIME', "1s") MAINNET_BLOCK_TIME = os.getenv('MAINNET_BLOCK_TIME', "1s")
MAINNET_TIMEOUT = os.getenv('MAINNET_TIMEOUT', "1min") MAINNET_TIMEOUT = os.getenv('MAINNET_TIMEOUT', "1min")