forked from TrueCloudLab/frostfs-testcases
Testcases to cover S3 in the smoke test and updates in accordance with NeoFS 0.13.0 have been updated (#5)
* Coverage of the S3 gateway and "S3-gate - NeoFS - HTTP-gate" interaction has been added to the Selectel smoke test.
This commit is contained in:
parent
a20ec58614
commit
bb3c2bd208
14 changed files with 259 additions and 162 deletions
82
README.md
82
README.md
|
@ -1,96 +1,98 @@
|
||||||
## Запуск тесткейсов
|
## Testcases execution
|
||||||
|
|
||||||
### Первичная подготовка
|
### Initial preparation
|
||||||
|
|
||||||
1. Установить neofs-cli
|
1. Install neofs-cli
|
||||||
- `git clone git@github.com:nspcc-dev/neofs-node.git`
|
- `git clone git@github.com:nspcc-dev/neofs-node.git`
|
||||||
- `cd neofs-node`
|
- `cd neofs-node`
|
||||||
- `make`
|
- `make`
|
||||||
- `sudo cp bin/neofs-cli /usr/local/bin/neofs-cli` or add alias path to bin/neofs-cli
|
- `sudo cp bin/neofs-cli /usr/local/bin/neofs-cli` or add alias path to bin/neofs-cli
|
||||||
|
|
||||||
2. Установить cdn-authmate
|
2. Install cdn-authmate
|
||||||
- `git clone git@github.com:nspcc-dev/cdn-authmate.git`
|
- `git clone git@github.com:nspcc-dev/cdn-authmate.git`
|
||||||
- `cd cdn-authmate`
|
- `cd cdn-authmate`
|
||||||
- `make build`
|
- `make build`
|
||||||
- `sudo cp bin/cdn-authmate /usr/local/bin/cdn-authmate` or add alias path to bin/cdn-authmate
|
- `sudo cp bin/cdn-authmate /usr/local/bin/cdn-authmate` or add alias path to bin/cdn-authmate
|
||||||
|
|
||||||
3. Устаносить зависимости для Testcases
|
3. Install Testcases dependencies
|
||||||
- `pip3 install robotframework`
|
- `pip3 install robotframework`
|
||||||
- `pip3 install pexpect`
|
- `pip3 install pexpect`
|
||||||
- `pip3 install requests`
|
- `pip3 install requests`
|
||||||
- `pip3 install boto3`
|
- `pip3 install boto3`
|
||||||
|
- `pip3 install docker`
|
||||||
|
|
||||||
(pip3 заменить на соответсвующий менеджер пакетов python в системе).
|
(replace pip3 with the appropriate python package manager on the system).
|
||||||
|
|
||||||
При этом должен быть запущен dev-env с тестируемым окружением.
|
In this case, dev-env should be running with the tested environment.
|
||||||
|
|
||||||
### Запуск тесткейсов
|
### Run
|
||||||
|
|
||||||
1. Выполнить `make run`
|
1. Execute the command `make run`
|
||||||
|
|
||||||
2. Логи будут доступны в папке artifacts/ после завершения тестов с любым из статусов.
|
2. Logs will be available in the artifacts/ directory after tests with any of the statuses are completed.
|
||||||
|
|
||||||
|
|
||||||
### Запуск произвольного тесткейса
|
### Running an arbitrary test case
|
||||||
|
|
||||||
Для запуска произвольного тесткейса нужно выполнить команду:
|
To run an arbitrary testcase, you need to run the command:
|
||||||
`robot --timestampoutputs --outputdir artifacts/ robot/testsuites/integration/<testsuite name>.robot `
|
`robot --timestampoutputs --outputdir artifacts/ robot/testsuites/integration/<testsuite name>.robot `
|
||||||
|
|
||||||
Для запуска доступны следущие сценарии:
|
The following scripts are available for execution:
|
||||||
|
|
||||||
* acl_basic.robot - базовый ACL
|
* acl_basic.robot
|
||||||
* acl_extended.robot - extended ACL
|
* acl_extended.robot
|
||||||
* acl_baearer.robot - Bearer Token ACL
|
* acl_baearer.robot
|
||||||
* object_complex.robot - операции над простым объектом
|
* object_complex.robot
|
||||||
* object_simple.robot - операции над большим объектом
|
* object_simple.robot
|
||||||
* withdraw.robot - оперция Deposit и Withdraw с счета NeoFS
|
* withdraw.robot
|
||||||
* netmap_simple.robot - проверка Placement policy
|
* netmap_simple.robot
|
||||||
* replication.robot - базовый тесткейс проверки репликации объектов
|
* replication.robot
|
||||||
* http_gate.robot - проверка HTTP-gate и интеграции с NeoFS
|
* http_gate.robot
|
||||||
* s3_gate.robot - проверка S3-gate и интеграции с NeoFS
|
* s3_gate.robot
|
||||||
|
|
||||||
|
|
||||||
## Запуск smoke-тестов
|
## Smoke test execution
|
||||||
|
|
||||||
Есть сьют со smoke-тестами для CDN-гейтов `robot/testsuites/smoke/selectelcdn_smoke.robot`.
|
There is a suite with smoke tests for CDN gates `robot/testsuites/smoke/selectelcdn_smoke.robot`.
|
||||||
|
|
||||||
По умолчанию кейворды используют переменные из файла `robot/resources/lib/neofs_int_vars.py`.
|
By default, keywords use variables from a file `robot/resources/lib/neofs_int_vars.py`.
|
||||||
```
|
```
|
||||||
robot --outputdir artifacts/ robot/testsuites/smoke/selectelcdn_smoke.robot
|
robot --outputdir artifacts/ robot/testsuites/smoke/selectelcdn_smoke.robot
|
||||||
```
|
```
|
||||||
|
|
||||||
### Первичная подготовка
|
### Initial preparation
|
||||||
|
|
||||||
1. Ему требуются отдельные переменные, в отличие от сьютов NeoFS, которые запускаются на
|
1. It requires separate variables, unlike the NeoFS suites, which run on
|
||||||
девэнве. Чтобы библиотеки кейвордов их использовали, нужно установить переменную
|
dev-env. In order for the keyword libraries to use them, you need to set the environment variable
|
||||||
окружения
|
|
||||||
```
|
```
|
||||||
export ROBOT_PROFILE=selectel_smoke
|
export ROBOT_PROFILE=selectel_smoke
|
||||||
```
|
```
|
||||||
|
|
||||||
Dev-env не нужен. Но нужно установить neo-go.
|
Dev-env is not needed. But you need to install neo-go.
|
||||||
|
|
||||||
2. Установить neo-go
|
2. Install neo-go
|
||||||
- `git clone git@github.com:nspcc-dev/neo-go.git`
|
- `git clone git@github.com:nspcc-dev/neo-go.git`
|
||||||
- `cd neo-go`
|
- `cd neo-go`
|
||||||
- `make`
|
- `make`
|
||||||
- `sudo cp bin/neo-go /usr/local/bin/neo-go` or add alias path to bin/neo-go
|
- `sudo cp bin/neo-go /usr/local/bin/neo-go` or add alias path to bin/neo-go
|
||||||
|
|
||||||
|
3. To run smoke test: `robot --timestampoutputs --outputdir artifacts/ robot/testsuites/smoke/selectelcdn_smoke.robot`
|
||||||
|
|
||||||
## Генерация документации
|
|
||||||
|
|
||||||
Для генерации документации по шагам:
|
## Generation of documentation
|
||||||
|
|
||||||
|
To generate Keywords documentation:
|
||||||
```
|
```
|
||||||
python3 -m robot.libdoc robot/resources/lib/neofs.py docs/NeoFS_Library.html
|
python3 -m robot.libdoc robot/resources/lib/neofs.py docs/NeoFS_Library.html
|
||||||
python3 -m robot.libdoc robot/resources/lib/payment_neogo.py docs/Payment_Library.html
|
python3 -m robot.libdoc robot/resources/lib/payment_neogo.py docs/Payment_Library.html
|
||||||
```
|
```
|
||||||
|
|
||||||
Для генерации документации по тесткейсам:
|
To generate testcases documentation:
|
||||||
```
|
```
|
||||||
python3 -m robot.testdoc robot/testsuites/integration/ docs/testcases.html
|
python3 -m robot.testdoc robot/testsuites/integration/ docs/testcases.html
|
||||||
```
|
```
|
||||||
|
|
||||||
## Создание тесткейсов
|
## Testcases implementation
|
||||||
|
|
||||||
### Source code overview
|
### Source code overview
|
||||||
|
|
||||||
|
@ -102,11 +104,11 @@ python3 -m robot.testdoc robot/testsuites/integration/ docs/testcases.html
|
||||||
|
|
||||||
`robot/variables/` - All variables for tests. It is possible to add the auto-loading logic of parameters from the smart-contract in the future. Contain python files.
|
`robot/variables/` - All variables for tests. It is possible to add the auto-loading logic of parameters from the smart-contract in the future. Contain python files.
|
||||||
|
|
||||||
`robot/testsuites/` - Robot Test Suites and Test Cases.
|
`robot/testsuites/` - Robot TestSuites and TestCases.
|
||||||
|
|
||||||
`robot/testsuites/integration/` - Integration test suites and test cases
|
`robot/testsuites/integration/` - Integration test suites and testcases
|
||||||
|
|
||||||
`robot/testsuites/fi/` - Fault Injection test suites and test cases
|
`robot/testsuites/fi/` - Fault Injection testsuites and testcases
|
||||||
|
|
||||||
### Code style
|
### Code style
|
||||||
|
|
||||||
|
@ -129,7 +131,7 @@ On keywords definition, one should specify variable type, e.g. path: str
|
||||||
|
|
||||||
### Robot style
|
### Robot style
|
||||||
|
|
||||||
Следует всегда заполнять секции [Tags] и [Documentation] для Testcase'ов и Documentation для Test Suite'ов.
|
You should always complete the [Tags] and [Documentation] sections for Testcases and Documentation for Test Suites.
|
||||||
|
|
||||||
### Robot-framework User Guide
|
### Robot-framework User Guide
|
||||||
|
|
||||||
|
|
1
keys/s3_selectel_hcs.pub.key
Normal file
1
keys/s3_selectel_hcs.pub.key
Normal file
|
@ -0,0 +1 @@
|
||||||
|
=b–•|vn¾b®%ü“ÐþaåÙÍ-ie×ðŒ=
|
|
@ -33,7 +33,7 @@ def init_s3_credentials(private_key: str, s3_key):
|
||||||
logger.info("Cmd: %s" % Cmd)
|
logger.info("Cmd: %s" % Cmd)
|
||||||
try:
|
try:
|
||||||
complProc = subprocess.run(Cmd, check=True, universal_newlines=True,
|
complProc = subprocess.run(Cmd, check=True, universal_newlines=True,
|
||||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE, timeout=150, shell=True)
|
stdout=subprocess.PIPE, stderr=subprocess.PIPE, timeout=360, shell=True)
|
||||||
output = complProc.stdout
|
output = complProc.stdout
|
||||||
logger.info("Output: %s" % output)
|
logger.info("Output: %s" % output)
|
||||||
|
|
||||||
|
|
|
@ -9,13 +9,16 @@ import hashlib
|
||||||
from robot.api.deco import keyword
|
from robot.api.deco import keyword
|
||||||
from robot.api import logger
|
from robot.api import logger
|
||||||
import random
|
import random
|
||||||
|
import base64
|
||||||
|
import base58
|
||||||
|
import docker
|
||||||
|
|
||||||
if os.getenv('ROBOT_PROFILE') == 'selectel_smoke':
|
if os.getenv('ROBOT_PROFILE') == 'selectel_smoke':
|
||||||
from selectelcdn_smoke_vars import (NEOGO_CLI_PREFIX, NEO_MAINNET_ENDPOINT,
|
from selectelcdn_smoke_vars import (NEOGO_CLI_PREFIX, NEO_MAINNET_ENDPOINT,
|
||||||
NEOFS_NEO_API_ENDPOINT, NEOFS_ENDPOINT)
|
NEOFS_NEO_API_ENDPOINT, NEOFS_ENDPOINT, NEOFS_NETMAP)
|
||||||
else:
|
else:
|
||||||
from neofs_int_vars import (NEOGO_CLI_PREFIX, NEO_MAINNET_ENDPOINT,
|
from neofs_int_vars import (NEOGO_CLI_PREFIX, NEO_MAINNET_ENDPOINT,
|
||||||
NEOFS_NEO_API_ENDPOINT, NEOFS_ENDPOINT)
|
NEOFS_NEO_API_ENDPOINT, NEOFS_ENDPOINT, NEOFS_NETMAP)
|
||||||
|
|
||||||
ROBOT_AUTO_KEYWORDS = False
|
ROBOT_AUTO_KEYWORDS = False
|
||||||
|
|
||||||
|
@ -64,22 +67,13 @@ def stop_nodes(down_num: int, *nodes_list):
|
||||||
|
|
||||||
# select nodes to stop from list
|
# select nodes to stop from list
|
||||||
stop_nodes = random.sample(nodes_list, down_num)
|
stop_nodes = random.sample(nodes_list, down_num)
|
||||||
|
|
||||||
for node in stop_nodes:
|
for node in stop_nodes:
|
||||||
m = re.search(r'(s\d+).', node)
|
m = re.search(r'(s\d+).', node)
|
||||||
node = m.group(1)
|
node = m.group(1)
|
||||||
|
|
||||||
Cmd = f'docker stop {node}'
|
client = docker.APIClient()
|
||||||
logger.info("Cmd: %s" % Cmd)
|
client.stop(node)
|
||||||
|
|
||||||
try:
|
|
||||||
complProc = subprocess.run(Cmd, check=True, universal_newlines=True,
|
|
||||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE, timeout=150, shell=True)
|
|
||||||
output = complProc.stdout
|
|
||||||
logger.info("Output: %s" % output)
|
|
||||||
|
|
||||||
except subprocess.CalledProcessError as e:
|
|
||||||
raise Exception("command '{}' return with error (code {}): {}".format(e.cmd, e.returncode, e.output))
|
|
||||||
|
|
||||||
return stop_nodes
|
return stop_nodes
|
||||||
|
|
||||||
|
@ -90,20 +84,9 @@ def start_nodes(*nodes_list):
|
||||||
for node in nodes_list:
|
for node in nodes_list:
|
||||||
m = re.search(r'(s\d+).', node)
|
m = re.search(r'(s\d+).', node)
|
||||||
node = m.group(1)
|
node = m.group(1)
|
||||||
|
client = docker.APIClient()
|
||||||
Cmd = f'docker start {node}'
|
client.start(node)
|
||||||
logger.info("Cmd: %s" % Cmd)
|
|
||||||
|
|
||||||
try:
|
|
||||||
complProc = subprocess.run(Cmd, check=True, universal_newlines=True,
|
|
||||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE, timeout=150, shell=True)
|
|
||||||
output = complProc.stdout
|
|
||||||
logger.info("Output: %s" % output)
|
|
||||||
|
|
||||||
except subprocess.CalledProcessError as e:
|
|
||||||
raise Exception("command '{}' return with error (code {}): {}".format(e.cmd, e.returncode, e.output))
|
|
||||||
|
|
||||||
|
|
||||||
@keyword('Get nodes with object')
|
@keyword('Get nodes with object')
|
||||||
def get_nodes_with_object(private_key: str, cid: str, oid: str):
|
def get_nodes_with_object(private_key: str, cid: str, oid: str):
|
||||||
storage_nodes = _get_storage_nodes(private_key)
|
storage_nodes = _get_storage_nodes(private_key)
|
||||||
|
@ -205,6 +188,10 @@ def form_bearertoken_file_for_all_ops(file_name: str, private_key: str, cid: str
|
||||||
|
|
||||||
eacl = get_eacl(private_key, cid)
|
eacl = get_eacl(private_key, cid)
|
||||||
input_records = ""
|
input_records = ""
|
||||||
|
|
||||||
|
cid_base58_b = base58.b58decode(cid)
|
||||||
|
cid_base64 = base64.b64encode(cid_base58_b).decode("utf-8")
|
||||||
|
|
||||||
if eacl:
|
if eacl:
|
||||||
res_json = re.split(r'[\s\n]+\][\s\n]+\}[\s\n]+Signature:', eacl)
|
res_json = re.split(r'[\s\n]+\][\s\n]+\}[\s\n]+Signature:', eacl)
|
||||||
records = re.split(r'"records": \[', res_json[0])
|
records = re.split(r'"records": \[', res_json[0])
|
||||||
|
@ -215,7 +202,7 @@ def form_bearertoken_file_for_all_ops(file_name: str, private_key: str, cid: str
|
||||||
"body": {
|
"body": {
|
||||||
"eaclTable": {
|
"eaclTable": {
|
||||||
"containerID": {
|
"containerID": {
|
||||||
"value": \"""" + cid + """"
|
"value": \"""" + str(cid_base64) + """"
|
||||||
},
|
},
|
||||||
"records": [
|
"records": [
|
||||||
{
|
{
|
||||||
|
@ -317,6 +304,10 @@ def form_bearertoken_file_filter_for_all_ops(file_name: str, private_key: str, c
|
||||||
# SEARCH should be allowed without filters to use GET, HEAD, DELETE, and SEARCH? Need to clarify.
|
# SEARCH should be allowed without filters to use GET, HEAD, DELETE, and SEARCH? Need to clarify.
|
||||||
|
|
||||||
eacl = get_eacl(private_key, cid)
|
eacl = get_eacl(private_key, cid)
|
||||||
|
|
||||||
|
cid_base58_b = base58.b58decode(cid)
|
||||||
|
cid_base64 = base64.b64encode(cid_base58_b).decode("utf-8")
|
||||||
|
|
||||||
input_records = ""
|
input_records = ""
|
||||||
if eacl:
|
if eacl:
|
||||||
res_json = re.split(r'[\s\n]+\][\s\n]+\}[\s\n]+Signature:', eacl)
|
res_json = re.split(r'[\s\n]+\][\s\n]+\}[\s\n]+Signature:', eacl)
|
||||||
|
@ -328,7 +319,7 @@ def form_bearertoken_file_filter_for_all_ops(file_name: str, private_key: str, c
|
||||||
"body": {
|
"body": {
|
||||||
"eaclTable": {
|
"eaclTable": {
|
||||||
"containerID": {
|
"containerID": {
|
||||||
"value": \"""" + cid + """"
|
"value": \"""" + str(cid_base64) + """"
|
||||||
},
|
},
|
||||||
"records": [
|
"records": [
|
||||||
{
|
{
|
||||||
|
@ -535,7 +526,7 @@ def create_container(private_key: str, basic_acl:str="", rule:str="REP 2 IN X CB
|
||||||
createContainerCmd = f'neofs-cli --rpc-endpoint {NEOFS_ENDPOINT} --key {private_key} container create --policy "{rule}" {basic_acl} --await'
|
createContainerCmd = f'neofs-cli --rpc-endpoint {NEOFS_ENDPOINT} --key {private_key} container create --policy "{rule}" {basic_acl} --await'
|
||||||
logger.info("Cmd: %s" % createContainerCmd)
|
logger.info("Cmd: %s" % createContainerCmd)
|
||||||
complProc = subprocess.run(createContainerCmd, check=True, universal_newlines=True,
|
complProc = subprocess.run(createContainerCmd, check=True, universal_newlines=True,
|
||||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE, timeout=150, shell=True)
|
stdout=subprocess.PIPE, stderr=subprocess.PIPE, timeout=300, shell=True)
|
||||||
output = complProc.stdout
|
output = complProc.stdout
|
||||||
logger.info("Output: %s" % output)
|
logger.info("Output: %s" % output)
|
||||||
cid = _parse_cid(output)
|
cid = _parse_cid(output)
|
||||||
|
@ -816,9 +807,10 @@ def delete_object(private_key: str, cid: str, oid: str, bearer: str):
|
||||||
bearer_token = f"--bearer {bearer}"
|
bearer_token = f"--bearer {bearer}"
|
||||||
|
|
||||||
ObjectCmd = f'neofs-cli --rpc-endpoint {NEOFS_ENDPOINT} --key {private_key} object delete --cid {cid} --oid {oid} {bearer_token}'
|
ObjectCmd = f'neofs-cli --rpc-endpoint {NEOFS_ENDPOINT} --key {private_key} object delete --cid {cid} --oid {oid} {bearer_token}'
|
||||||
|
logger.info("Cmd: %s" % ObjectCmd)
|
||||||
try:
|
try:
|
||||||
complProc = subprocess.run(ObjectCmd, check=True, universal_newlines=True,
|
complProc = subprocess.run(ObjectCmd, check=True, universal_newlines=True,
|
||||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE, timeout=15, shell=True)
|
stdout=subprocess.PIPE, stderr=subprocess.PIPE, timeout=30, shell=True)
|
||||||
logger.info("Output: %s" % complProc.stdout)
|
logger.info("Output: %s" % complProc.stdout)
|
||||||
except subprocess.CalledProcessError as e:
|
except subprocess.CalledProcessError as e:
|
||||||
raise Exception("command '{}' return with error (code {}): {}".format(e.cmd, e.returncode, e.output))
|
raise Exception("command '{}' return with error (code {}): {}".format(e.cmd, e.returncode, e.output))
|
||||||
|
@ -995,7 +987,7 @@ def _parse_cid(output: str):
|
||||||
return cid
|
return cid
|
||||||
|
|
||||||
def _get_storage_nodes(private_key: bytes):
|
def _get_storage_nodes(private_key: bytes):
|
||||||
storage_nodes = ['s01.neofs.devenv:8080', 's02.neofs.devenv:8080','s03.neofs.devenv:8080','s04.neofs.devenv:8080']
|
#storage_nodes = ['s01.neofs.devenv:8080', 's02.neofs.devenv:8080','s03.neofs.devenv:8080','s04.neofs.devenv:8080']
|
||||||
#NetmapCmd = f'{CLI_PREFIX}neofs-cli --host {NEOFS_ENDPOINT} --key {binascii.hexlify(private_key).decode()} status netmap'
|
#NetmapCmd = f'{CLI_PREFIX}neofs-cli --host {NEOFS_ENDPOINT} --key {binascii.hexlify(private_key).decode()} status netmap'
|
||||||
#complProc = subprocess.run(NetmapCmd, check=True, universal_newlines=True,
|
#complProc = subprocess.run(NetmapCmd, check=True, universal_newlines=True,
|
||||||
# stdout=subprocess.PIPE, stderr=subprocess.PIPE, timeout=15, shell=True)
|
# stdout=subprocess.PIPE, stderr=subprocess.PIPE, timeout=15, shell=True)
|
||||||
|
@ -1011,8 +1003,8 @@ def _get_storage_nodes(private_key: bytes):
|
||||||
# Will be fixed when netmap will be added to cli
|
# Will be fixed when netmap will be added to cli
|
||||||
|
|
||||||
#storage_nodes.append()
|
#storage_nodes.append()
|
||||||
logger.info("Storage nodes: %s" % storage_nodes)
|
logger.info("Storage nodes: %s" % NEOFS_NETMAP)
|
||||||
return storage_nodes
|
return NEOFS_NETMAP
|
||||||
|
|
||||||
|
|
||||||
def _search_object(node:str, private_key: str, cid:str, oid: str):
|
def _search_object(node:str, private_key: str, cid:str, oid: str):
|
||||||
|
|
|
@ -8,3 +8,5 @@ NEO_MAINNET_ENDPOINT = "main_chain.neofs.devenv:30333"
|
||||||
NEOFS_NEO_API_ENDPOINT = 'http://main_chain.neofs.devenv:30333'
|
NEOFS_NEO_API_ENDPOINT = 'http://main_chain.neofs.devenv:30333'
|
||||||
HTTP_GATE = 'http://http.neofs.devenv'
|
HTTP_GATE = 'http://http.neofs.devenv'
|
||||||
S3_GATE = 'https://s3.neofs.devenv:8080'
|
S3_GATE = 'https://s3.neofs.devenv:8080'
|
||||||
|
NEOFS_CONTRACT = "5f490fbd8010fd716754073ee960067d28549b7d"
|
||||||
|
NEOFS_NETMAP = ['s01.neofs.devenv:8080', 's02.neofs.devenv:8080','s03.neofs.devenv:8080','s04.neofs.devenv:8080']
|
|
@ -15,6 +15,7 @@ import robot.errors
|
||||||
from robot.libraries.BuiltIn import BuiltIn
|
from robot.libraries.BuiltIn import BuiltIn
|
||||||
|
|
||||||
ROBOT_AUTO_KEYWORDS = False
|
ROBOT_AUTO_KEYWORDS = False
|
||||||
|
NEOFS_CONTRACT = "5f490fbd8010fd716754073ee960067d28549b7d"
|
||||||
|
|
||||||
if os.getenv('ROBOT_PROFILE') == 'selectel_smoke':
|
if os.getenv('ROBOT_PROFILE') == 'selectel_smoke':
|
||||||
from selectelcdn_smoke_vars import (NEOGO_CLI_PREFIX, NEO_MAINNET_ENDPOINT,
|
from selectelcdn_smoke_vars import (NEOGO_CLI_PREFIX, NEO_MAINNET_ENDPOINT,
|
||||||
|
@ -24,8 +25,6 @@ else:
|
||||||
NEOFS_NEO_API_ENDPOINT, NEOFS_ENDPOINT)
|
NEOFS_NEO_API_ENDPOINT, NEOFS_ENDPOINT)
|
||||||
|
|
||||||
|
|
||||||
NEOFS_CONTRACT = "5f490fbd8010fd716754073ee960067d28549b7d"
|
|
||||||
|
|
||||||
@keyword('Init wallet')
|
@keyword('Init wallet')
|
||||||
def init_wallet():
|
def init_wallet():
|
||||||
|
|
||||||
|
@ -98,12 +97,12 @@ def dump_privkey(wallet: str, address: str):
|
||||||
return out
|
return out
|
||||||
|
|
||||||
@keyword('Transfer Mainnet Gas')
|
@keyword('Transfer Mainnet Gas')
|
||||||
def transfer_mainnet_gas(wallet: str, address: str, address_to: str, amount: int):
|
def transfer_mainnet_gas(wallet: str, address: str, address_to: str, amount: int, wallet_pass:str=''):
|
||||||
cmd = ( f"{NEOGO_CLI_PREFIX} wallet nep5 transfer -w {wallet} -r http://main_chain.neofs.devenv:30333 --from {address} "
|
cmd = ( f"{NEOGO_CLI_PREFIX} wallet nep5 transfer -w {wallet} -r {NEOFS_NEO_API_ENDPOINT} --from {address} "
|
||||||
f"--to {address_to} --token gas --amount {amount}" )
|
f"--to {address_to} --token gas --amount {amount}" )
|
||||||
|
|
||||||
logger.info(f"Executing command: {cmd}")
|
logger.info(f"Executing command: {cmd}")
|
||||||
out = _run_sh_with_passwd('', cmd)
|
out = _run_sh_with_passwd(wallet_pass, cmd)
|
||||||
logger.info(f"Command completed with output: {out}")
|
logger.info(f"Command completed with output: {out}")
|
||||||
|
|
||||||
if not re.match(r'^(\w{64})$', out):
|
if not re.match(r'^(\w{64})$', out):
|
||||||
|
@ -113,7 +112,7 @@ def transfer_mainnet_gas(wallet: str, address: str, address_to: str, amount: int
|
||||||
|
|
||||||
@keyword('Withdraw Mainnet Gas')
|
@keyword('Withdraw Mainnet Gas')
|
||||||
def withdraw_mainnet_gas(wallet: str, address: str, scripthash: str, amount: int):
|
def withdraw_mainnet_gas(wallet: str, address: str, scripthash: str, amount: int):
|
||||||
cmd = ( f"{NEOGO_CLI_PREFIX} contract invokefunction -w {wallet} -a {address} -r http://main_chain.neofs.devenv:30333 "
|
cmd = ( f"{NEOGO_CLI_PREFIX} contract invokefunction -w {wallet} -a {address} -r {NEOFS_NEO_API_ENDPOINT} "
|
||||||
f"{NEOFS_CONTRACT} withdraw {scripthash} int:{amount} -- {scripthash}" )
|
f"{NEOFS_CONTRACT} withdraw {scripthash} int:{amount} -- {scripthash}" )
|
||||||
|
|
||||||
logger.info(f"Executing command: {cmd}")
|
logger.info(f"Executing command: {cmd}")
|
||||||
|
|
|
@ -7,4 +7,6 @@ NEO_MAINNET_ENDPOINT = "http://92.53.71.51:20332"
|
||||||
# selectel main chain on lobachevsky-1
|
# selectel main chain on lobachevsky-1
|
||||||
NEOFS_NEO_API_ENDPOINT = "http://92.53.71.51:20332"
|
NEOFS_NEO_API_ENDPOINT = "http://92.53.71.51:20332"
|
||||||
HTTP_GATE = 'http://92.53.71.51:38080'
|
HTTP_GATE = 'http://92.53.71.51:38080'
|
||||||
S3_GATE = 'https://92.53.71.51:28080'
|
S3_GATE = 'https://92.53.71.51:28080'
|
||||||
|
NEOFS_CONTRACT = "5f490fbd8010fd716754073ee960067d28549b7d"
|
||||||
|
NEOFS_NETMAP = ['92.53.71.51:18080', '92.53.71.52:18080','92.53.71.53:18080','92.53.71.54:18080', '92.53.71.55:18080']
|
|
@ -19,15 +19,25 @@ BearerToken Operations
|
||||||
[Timeout] 20 min
|
[Timeout] 20 min
|
||||||
|
|
||||||
Generate Keys
|
Generate Keys
|
||||||
Generate file
|
|
||||||
Prepare eACL Role rules
|
Prepare eACL Role rules
|
||||||
|
|
||||||
|
|
||||||
|
Log Check Bearer token with simple object
|
||||||
|
Generate file 1024
|
||||||
Check Container Inaccessible and Allow All Bearer
|
Check Container Inaccessible and Allow All Bearer
|
||||||
Check eACL Deny and Allow All Bearer
|
Check eACL Deny and Allow All Bearer
|
||||||
|
|
||||||
Check eACL Deny and Allow All Bearer Filter OID Equal
|
Check eACL Deny and Allow All Bearer Filter OID Equal
|
||||||
Check eACL Deny and Allow All Bearer Filter OID NotEqual
|
Check eACL Deny and Allow All Bearer Filter OID NotEqual
|
||||||
|
Check eACL Deny and Allow All Bearer Filter UserHeader Equal
|
||||||
|
|
||||||
|
|
||||||
|
Log Check Bearer token with complex object
|
||||||
|
Cleanup Files ${FILE_S}
|
||||||
|
Generate file 20e+6
|
||||||
|
Check Container Inaccessible and Allow All Bearer
|
||||||
|
Check eACL Deny and Allow All Bearer
|
||||||
|
Check eACL Deny and Allow All Bearer Filter OID Equal
|
||||||
|
Check eACL Deny and Allow All Bearer Filter OID NotEqual
|
||||||
Check eACL Deny and Allow All Bearer Filter UserHeader Equal
|
Check eACL Deny and Allow All Bearer Filter UserHeader Equal
|
||||||
|
|
||||||
[Teardown] Cleanup
|
[Teardown] Cleanup
|
||||||
|
@ -82,22 +92,23 @@ Payment Operations
|
||||||
|
|
||||||
|
|
||||||
Create Container Public
|
Create Container Public
|
||||||
Log Create Public Container
|
Log Create Public Container
|
||||||
${PUBLIC_CID_GEN} = Create container ${USER_KEY} 0x0FFFFFFF
|
${PUBLIC_CID_GEN} = Create container ${USER_KEY} 0x0FFFFFFF
|
||||||
[Return] ${PUBLIC_CID_GEN}
|
[Return] ${PUBLIC_CID_GEN}
|
||||||
|
|
||||||
|
|
||||||
Create Container Inaccessible
|
Create Container Inaccessible
|
||||||
Log Create Inaccessible Container
|
Log Create Inaccessible Container
|
||||||
${PUBLIC_CID_GEN} = Create container ${USER_KEY} 0x40000000
|
${PUBLIC_CID_GEN} = Create container ${USER_KEY} 0x40000000
|
||||||
[Return] ${PUBLIC_CID_GEN}
|
[Return] ${PUBLIC_CID_GEN}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Generate file
|
Generate file
|
||||||
# Generate small file
|
[Arguments] ${SIZE}
|
||||||
${FILE_S_GEN} = Generate file of bytes 1024
|
|
||||||
Set Global Variable ${FILE_S} ${FILE_S_GEN}
|
${FILE_S_GEN} = Generate file of bytes ${SIZE}
|
||||||
|
Set Global Variable ${FILE_S} ${FILE_S_GEN}
|
||||||
|
|
||||||
|
|
||||||
Prepare eACL Role rules
|
Prepare eACL Role rules
|
||||||
|
@ -215,14 +226,13 @@ Check eACL Deny and Allow All Bearer Filter OID Equal
|
||||||
Run Keyword And Expect Error *
|
Run Keyword And Expect Error *
|
||||||
... Get object from NeoFS ${USER_KEY} ${CID} ${S_OID_USER_2} bearer_allow_all_user local_file_eacl
|
... Get object from NeoFS ${USER_KEY} ${CID} ${S_OID_USER_2} bearer_allow_all_user local_file_eacl
|
||||||
|
|
||||||
# Preiodical issue: https://github.com/nspcc-dev/neofs-node/issues/225
|
|
||||||
Get object from NeoFS ${USER_KEY} ${CID} ${S_OID_USER} bearer_allow_all_user local_file_eacl
|
Get object from NeoFS ${USER_KEY} ${CID} ${S_OID_USER} bearer_allow_all_user local_file_eacl
|
||||||
Get Range ${USER_KEY} ${CID} ${S_OID_USER} s_get_range bearer_allow_all_user 0:256
|
Get Range ${USER_KEY} ${CID} ${S_OID_USER} s_get_range bearer_allow_all_user 0:256
|
||||||
|
|
||||||
# https://github.com/nspcc-dev/neofs-node/issues/215
|
Head object ${USER_KEY} ${CID} ${S_OID_USER} bearer_allow_all_user
|
||||||
# Head object ${USER_KEY} ${CID} ${S_OID_USER} bearer_allow_all_user
|
Delete object ${USER_KEY} ${CID} ${S_OID_USER} bearer_allow_all_user
|
||||||
# Delete object ${USER_KEY} ${CID} ${D_OID_USER} bearer_allow_all_user
|
Run Keyword And Expect Error *
|
||||||
|
... Delete object ${USER_KEY} ${CID} ${D_OID_USER} bearer_allow_all_user
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -275,10 +285,10 @@ Check eACL Deny and Allow All Bearer Filter OID NotEqual
|
||||||
Run Keyword And Expect Error *
|
Run Keyword And Expect Error *
|
||||||
... Head object ${USER_KEY} ${CID} ${S_OID_USER_2} bearer_allow_all_user
|
... Head object ${USER_KEY} ${CID} ${S_OID_USER_2} bearer_allow_all_user
|
||||||
|
|
||||||
# https://github.com/nspcc-dev/neofs-node/issues/215
|
Delete object ${USER_KEY} ${CID} ${S_OID_USER} bearer_allow_all_user
|
||||||
# Delete object ${USER_KEY} ${CID} ${D_OID_USER} bearer_allow_all_user
|
|
||||||
# Run Keyword And Expect Error *
|
Run Keyword And Expect Error *
|
||||||
# ... Delete object ${USER_KEY} ${CID} ${D_OID_USER_2} bearer_allow_all_user
|
... Delete object ${USER_KEY} ${CID} ${D_OID_USER_2} bearer_allow_all_user
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -319,21 +329,27 @@ Check eACL Deny and Allow All Bearer Filter UserHeader Equal
|
||||||
|
|
||||||
Run Keyword And Expect Error *
|
Run Keyword And Expect Error *
|
||||||
... Put object to NeoFS ${USER_KEY} ${FILE_S} ${CID} bearer_allow_all_user ${FILE_OTH_HEADER}
|
... Put object to NeoFS ${USER_KEY} ${FILE_S} ${CID} bearer_allow_all_user ${FILE_OTH_HEADER}
|
||||||
|
|
||||||
|
Get object from NeoFS ${USER_KEY} ${CID} ${S_OID_USER} bearer_allow_all_user local_file_eacl
|
||||||
Run Keyword And Expect Error *
|
Run Keyword And Expect Error *
|
||||||
... Get object from NeoFS ${USER_KEY} ${CID} ${S_OID_USER_2} bearer_allow_all_user local_file_eacl
|
... Get object from NeoFS ${USER_KEY} ${CID} ${S_OID_USER_2} bearer_allow_all_user local_file_eacl
|
||||||
|
|
||||||
# Preiodical issue: https://github.com/nspcc-dev/neofs-node/issues/225
|
Run Keyword And Expect Error *
|
||||||
Get object from NeoFS ${USER_KEY} ${CID} ${S_OID_USER} bearer_allow_all_user local_file_eacl
|
... Get Range ${USER_KEY} ${CID} ${S_OID_USER} s_get_range bearer_allow_all_user 0:256
|
||||||
Get Range ${USER_KEY} ${CID} ${S_OID_USER} s_get_range bearer_allow_all_user 0:256
|
|
||||||
|
|
||||||
# https://github.com/nspcc-dev/neofs-node/issues/215
|
Run Keyword And Expect Error *
|
||||||
# Head object ${USER_KEY} ${CID} ${S_OID_USER} bearer_allow_all_user
|
... Get Range Hash ${USER_KEY} ${CID} ${S_OID_USER} bearer_allow_all_user 0:256
|
||||||
# Delete object ${USER_KEY} ${CID} ${D_OID_USER} bearer_allow_all_user
|
|
||||||
|
Head object ${USER_KEY} ${CID} ${S_OID_USER} bearer_allow_all_user
|
||||||
|
Run Keyword And Expect Error *
|
||||||
|
... Head object ${USER_KEY} ${CID} ${S_OID_USER_2} bearer_allow_all_user
|
||||||
|
|
||||||
|
Delete object ${USER_KEY} ${CID} ${S_OID_USER} bearer_allow_all_user
|
||||||
|
Run Keyword And Expect Error *
|
||||||
|
... Delete object ${USER_KEY} ${CID} ${S_OID_USER_2} bearer_allow_all_user
|
||||||
|
|
||||||
|
|
||||||
# Check eACL Deny and Allow All Bearer Filter UserHeader NotEqual
|
# Check eACL Deny and Allow All Bearer Filter UserHeader NotEqual
|
||||||
# Check eACL Deny and Allow All Bearer for big object
|
|
||||||
# Check eACL Deny and Allow All Bearer Filter UserHeader Equal for big object
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Cleanup
|
Cleanup
|
||||||
|
|
|
@ -17,9 +17,17 @@ Extended ACL Operations
|
||||||
[Timeout] 20 min
|
[Timeout] 20 min
|
||||||
|
|
||||||
Generate Keys
|
Generate Keys
|
||||||
Generate file
|
|
||||||
Prepare eACL Role rules
|
Prepare eACL Role rules
|
||||||
|
|
||||||
|
Log Check extended ACL with simple object
|
||||||
|
Generate files 1024
|
||||||
|
Check Actions
|
||||||
|
Check Filters
|
||||||
|
|
||||||
|
Cleanup Files ${FILE_S} ${FILE_S_2}
|
||||||
|
|
||||||
|
Log Check extended ACL with complex object
|
||||||
|
Generate files 20e+6
|
||||||
Check Actions
|
Check Actions
|
||||||
Check Filters
|
Check Filters
|
||||||
|
|
||||||
|
@ -151,9 +159,10 @@ Create Container Public
|
||||||
[Return] ${PUBLIC_CID_GEN}
|
[Return] ${PUBLIC_CID_GEN}
|
||||||
|
|
||||||
|
|
||||||
Generate file
|
Generate files
|
||||||
${FILE_S_GEN_1} = Generate file of bytes 1024
|
[Arguments] ${SIZE}
|
||||||
${FILE_S_GEN_2} = Generate file of bytes 2048
|
${FILE_S_GEN_1} = Generate file of bytes ${SIZE}
|
||||||
|
${FILE_S_GEN_2} = Generate file of bytes ${SIZE}
|
||||||
Set Global Variable ${FILE_S} ${FILE_S_GEN_1}
|
Set Global Variable ${FILE_S} ${FILE_S_GEN_1}
|
||||||
Set Global Variable ${FILE_S_2} ${FILE_S_GEN_2}
|
Set Global Variable ${FILE_S_2} ${FILE_S_GEN_2}
|
||||||
|
|
||||||
|
@ -205,6 +214,9 @@ Check eACL Deny and Allow All System
|
||||||
Get Range ${SYSTEM_KEY} ${CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
Get Range ${SYSTEM_KEY} ${CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
||||||
Get Range ${SYSTEM_KEY_SN} ${CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
Get Range ${SYSTEM_KEY_SN} ${CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
||||||
|
|
||||||
|
Get Range Hash ${SYSTEM_KEY} ${CID} ${S_OID_USER} ${EMPTY} 0:256
|
||||||
|
Get Range Hash ${SYSTEM_KEY_SN} ${CID} ${S_OID_USER} ${EMPTY} 0:256
|
||||||
|
|
||||||
Delete object ${SYSTEM_KEY} ${CID} ${D_OID_USER_S} ${EMPTY}
|
Delete object ${SYSTEM_KEY} ${CID} ${D_OID_USER_S} ${EMPTY}
|
||||||
Delete object ${SYSTEM_KEY_SN} ${CID} ${D_OID_USER_SN} ${EMPTY}
|
Delete object ${SYSTEM_KEY_SN} ${CID} ${D_OID_USER_SN} ${EMPTY}
|
||||||
|
|
||||||
|
@ -231,15 +243,22 @@ Check eACL Deny and Allow All System
|
||||||
|
|
||||||
|
|
||||||
Run Keyword And Expect Error *
|
Run Keyword And Expect Error *
|
||||||
... Head object ${SYSTEM_KEY} ${CID} ${S_OID_USER} ${EMPTY}
|
... Head object ${SYSTEM_KEY} ${CID} ${S_OID_USER} ${EMPTY}
|
||||||
Run Keyword And Expect Error *
|
Run Keyword And Expect Error *
|
||||||
... Head object ${SYSTEM_KEY_SN} ${CID} ${S_OID_USER} ${EMPTY}
|
... Head object ${SYSTEM_KEY_SN} ${CID} ${S_OID_USER} ${EMPTY}
|
||||||
|
|
||||||
Run Keyword And Expect Error *
|
Run Keyword And Expect Error *
|
||||||
... Get Range ${SYSTEM_KEY} ${CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
... Get Range ${SYSTEM_KEY} ${CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
||||||
Run Keyword And Expect Error *
|
Run Keyword And Expect Error *
|
||||||
... Get Range ${SYSTEM_KEY_SN} ${CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
... Get Range ${SYSTEM_KEY_SN} ${CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
||||||
|
|
||||||
|
|
||||||
|
Run Keyword And Expect Error *
|
||||||
|
... Get Range Hash ${SYSTEM_KEY} ${CID} ${S_OID_USER} ${EMPTY} 0:256
|
||||||
|
Run Keyword And Expect Error *
|
||||||
|
... Get Range Hash ${SYSTEM_KEY_SN} ${CID} ${S_OID_USER} ${EMPTY} 0:256
|
||||||
|
|
||||||
|
|
||||||
Run Keyword And Expect Error *
|
Run Keyword And Expect Error *
|
||||||
... Delete object ${SYSTEM_KEY} ${CID} ${S_OID_USER} ${EMPTY}
|
... Delete object ${SYSTEM_KEY} ${CID} ${S_OID_USER} ${EMPTY}
|
||||||
Run Keyword And Expect Error *
|
Run Keyword And Expect Error *
|
||||||
|
@ -268,8 +287,11 @@ Check eACL Deny and Allow All System
|
||||||
Get Range ${SYSTEM_KEY} ${CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
Get Range ${SYSTEM_KEY} ${CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
||||||
Get Range ${SYSTEM_KEY_SN} ${CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
Get Range ${SYSTEM_KEY_SN} ${CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
||||||
|
|
||||||
|
Get Range Hash ${SYSTEM_KEY} ${CID} ${S_OID_USER} ${EMPTY} 0:256
|
||||||
|
Get Range Hash ${SYSTEM_KEY_SN} ${CID} ${S_OID_USER} ${EMPTY} 0:256
|
||||||
|
|
||||||
Delete object ${SYSTEM_KEY} ${CID} ${D_OID_USER_S} ${EMPTY}
|
Delete object ${SYSTEM_KEY} ${CID} ${D_OID_USER_S} ${EMPTY}
|
||||||
Delete object ${SYSTEM_KEY_SN} ${CID} ${D_OID_USER_SN} ${EMPTY}
|
Delete object ${SYSTEM_KEY_SN} ${CID} ${D_OID_USER_SN} ${EMPTY}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -285,6 +307,7 @@ Check eACL Deny All Other and Allow All Pubkey
|
||||||
Search object ${EACL_KEY} ${CID} ${EMPTY} ${EMPTY} ${FILE_USR_HEADER} @{S_OBJ_H}
|
Search object ${EACL_KEY} ${CID} ${EMPTY} ${EMPTY} ${FILE_USR_HEADER} @{S_OBJ_H}
|
||||||
Head object ${EACL_KEY} ${CID} ${S_OID_USER} ${EMPTY}
|
Head object ${EACL_KEY} ${CID} ${S_OID_USER} ${EMPTY}
|
||||||
Get Range ${EACL_KEY} ${CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
Get Range ${EACL_KEY} ${CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
||||||
|
Get Range Hash ${EACL_KEY} ${CID} ${S_OID_USER} ${EMPTY} 0:256
|
||||||
Delete object ${EACL_KEY} ${CID} ${D_OID_USER} ${EMPTY}
|
Delete object ${EACL_KEY} ${CID} ${D_OID_USER} ${EMPTY}
|
||||||
|
|
||||||
Set eACL ${USER_KEY} ${CID} ${EACL_ALLOW_ALL_Pubkey} --await
|
Set eACL ${USER_KEY} ${CID} ${EACL_ALLOW_ALL_Pubkey} --await
|
||||||
|
@ -301,6 +324,8 @@ Check eACL Deny All Other and Allow All Pubkey
|
||||||
Run Keyword And Expect Error *
|
Run Keyword And Expect Error *
|
||||||
... Get Range ${OTHER_KEY} ${CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
... Get Range ${OTHER_KEY} ${CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
||||||
Run Keyword And Expect Error *
|
Run Keyword And Expect Error *
|
||||||
|
... Get Range Hash ${OTHER_KEY} ${CID} ${S_OID_USER} ${EMPTY} 0:256
|
||||||
|
Run Keyword And Expect Error *
|
||||||
... Delete object ${OTHER_KEY} ${CID} ${S_OID_USER} ${EMPTY}
|
... Delete object ${OTHER_KEY} ${CID} ${S_OID_USER} ${EMPTY}
|
||||||
|
|
||||||
Put object to NeoFS ${EACL_KEY} ${FILE_S} ${CID} ${EMPTY} ${FILE_OTH_HEADER}
|
Put object to NeoFS ${EACL_KEY} ${FILE_S} ${CID} ${EMPTY} ${FILE_OTH_HEADER}
|
||||||
|
@ -308,6 +333,7 @@ Check eACL Deny All Other and Allow All Pubkey
|
||||||
Search object ${EACL_KEY} ${CID} ${EMPTY} ${EMPTY} ${FILE_USR_HEADER} @{S_OBJ_H}
|
Search object ${EACL_KEY} ${CID} ${EMPTY} ${EMPTY} ${FILE_USR_HEADER} @{S_OBJ_H}
|
||||||
Head object ${EACL_KEY} ${CID} ${S_OID_USER} ${EMPTY}
|
Head object ${EACL_KEY} ${CID} ${S_OID_USER} ${EMPTY}
|
||||||
Get Range ${EACL_KEY} ${CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
Get Range ${EACL_KEY} ${CID} ${S_OID_USER} s_get_range ${EMPTY} 0:256
|
||||||
|
Get Range Hash ${EACL_KEY} ${CID} ${S_OID_USER} ${EMPTY} 0:256
|
||||||
Delete object ${EACL_KEY} ${CID} ${S_OID_USER} ${EMPTY}
|
Delete object ${EACL_KEY} ${CID} ${S_OID_USER} ${EMPTY}
|
||||||
|
|
||||||
|
|
||||||
|
@ -325,8 +351,8 @@ Check eACL Deny and Allow All
|
||||||
Search object ${KEY} ${CID} ${EMPTY} ${EMPTY} ${FILE_USR_HEADER} @{S_OBJ_H}
|
Search object ${KEY} ${CID} ${EMPTY} ${EMPTY} ${FILE_USR_HEADER} @{S_OBJ_H}
|
||||||
Head object ${KEY} ${CID} ${S_OID_USER} ${EMPTY}
|
Head object ${KEY} ${CID} ${S_OID_USER} ${EMPTY}
|
||||||
|
|
||||||
|
|
||||||
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
|
||||||
|
Get Range Hash ${KEY} ${CID} ${S_OID_USER} ${EMPTY} 0:256
|
||||||
Delete object ${KEY} ${CID} ${D_OID_USER} ${EMPTY}
|
Delete object ${KEY} ${CID} ${D_OID_USER} ${EMPTY}
|
||||||
|
|
||||||
Set eACL ${USER_KEY} ${CID} ${DENY_EACL}
|
Set eACL ${USER_KEY} ${CID} ${DENY_EACL}
|
||||||
|
@ -343,18 +369,19 @@ Check eACL Deny and Allow All
|
||||||
Run Keyword And Expect Error *
|
Run Keyword And Expect Error *
|
||||||
... 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
|
||||||
Run Keyword And Expect Error *
|
Run Keyword And Expect Error *
|
||||||
|
... Get Range Hash ${KEY} ${CID} ${S_OID_USER} ${EMPTY} 0:256
|
||||||
|
Run Keyword And Expect Error *
|
||||||
... Delete object ${KEY} ${CID} ${S_OID_USER} ${EMPTY}
|
... Delete object ${KEY} ${CID} ${S_OID_USER} ${EMPTY}
|
||||||
|
|
||||||
|
|
||||||
Set eACL ${USER_KEY} ${CID} ${ALLOW_EACL}
|
Set eACL ${USER_KEY} ${CID} ${ALLOW_EACL}
|
||||||
Sleep ${MORPH_BLOCK_TIMEOUT}
|
Sleep ${MORPH_BLOCK_TIMEOUT}
|
||||||
|
|
||||||
|
|
||||||
Put object to NeoFS ${KEY} ${FILE_S} ${CID} ${EMPTY} ${FILE_OTH_HEADER}
|
Put object to NeoFS ${KEY} ${FILE_S} ${CID} ${EMPTY} ${FILE_OTH_HEADER}
|
||||||
Get object from NeoFS ${KEY} ${CID} ${S_OID_USER} ${EMPTY} local_file_eacl
|
Get object from NeoFS ${KEY} ${CID} ${S_OID_USER} ${EMPTY} local_file_eacl
|
||||||
Search object ${KEY} ${CID} ${EMPTY} ${EMPTY} ${FILE_USR_HEADER} @{S_OBJ_H}
|
Search object ${KEY} ${CID} ${EMPTY} ${EMPTY} ${FILE_USR_HEADER} @{S_OBJ_H}
|
||||||
Head object ${KEY} ${CID} ${S_OID_USER} ${EMPTY}
|
Head object ${KEY} ${CID} ${S_OID_USER} ${EMPTY}
|
||||||
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
|
||||||
|
Get Range Hash ${KEY} ${CID} ${S_OID_USER} ${EMPTY} 0:256
|
||||||
Delete object ${KEY} ${CID} ${S_OID_USER} ${EMPTY}
|
Delete object ${KEY} ${CID} ${S_OID_USER} ${EMPTY}
|
||||||
|
|
||||||
Cleanup
|
Cleanup
|
||||||
|
|
|
@ -27,9 +27,6 @@ NeoFS Object Replication
|
||||||
Wait Until Keyword Succeeds 1 min 15 sec
|
Wait Until Keyword Succeeds 1 min 15 sec
|
||||||
... Transaction accepted in block ${TX_DEPOSIT}
|
... Transaction accepted in block ${TX_DEPOSIT}
|
||||||
Get Transaction ${TX_DEPOSIT}
|
Get Transaction ${TX_DEPOSIT}
|
||||||
|
|
||||||
Sleep 1 min
|
|
||||||
|
|
||||||
|
|
||||||
${CID} = Create container ${PRIV_KEY} ${EMPTY} REP 2 IN X CBF 1 SELECT 4 FROM * AS X
|
${CID} = Create container ${PRIV_KEY} ${EMPTY} REP 2 IN X CBF 1 SELECT 4 FROM * AS X
|
||||||
Container Existing ${PRIV_KEY} ${CID}
|
Container Existing ${PRIV_KEY} ${CID}
|
||||||
|
@ -40,12 +37,23 @@ NeoFS Object Replication
|
||||||
|
|
||||||
${S_OID} = Put object to NeoFS ${PRIV_KEY} ${FILE} ${CID} ${EMPTY} ${EMPTY}
|
${S_OID} = Put object to NeoFS ${PRIV_KEY} ${FILE} ${CID} ${EMPTY} ${EMPTY}
|
||||||
Validate storage policy for object ${PRIV_KEY} 2 ${CID} ${S_OID}
|
Validate storage policy for object ${PRIV_KEY} 2 ${CID} ${S_OID}
|
||||||
|
|
||||||
@{NODES_OBJ} = Get nodes with object ${PRIV_KEY} ${CID} ${S_OID}
|
@{NODES_OBJ} = Get nodes with object ${PRIV_KEY} ${CID} ${S_OID}
|
||||||
@{NODES_OBJ_STOPPED} = Stop nodes 1 @{NODES_OBJ}
|
@{NODES_OBJ_STOPPED} = Stop nodes 1 @{NODES_OBJ}
|
||||||
|
|
||||||
Sleep 1 min
|
Sleep 1 min
|
||||||
|
|
||||||
Validate storage policy for object ${PRIV_KEY} 2 ${CID} ${S_OID}
|
Validate storage policy for object ${PRIV_KEY} 2 ${CID} ${S_OID}
|
||||||
Start nodes @{NODES_OBJ_STOPPED}
|
Start nodes @{NODES_OBJ_STOPPED}
|
||||||
|
|
||||||
[Teardown] Cleanup Files ${FILE}
|
[Teardown] Cleanup ${FILE} @{NODES_OBJ_STOPPED}
|
||||||
|
|
||||||
|
|
||||||
|
*** Keywords ***
|
||||||
|
|
||||||
|
Cleanup
|
||||||
|
[Arguments] ${FILE} @{NODES_OBJ_STOPPED}
|
||||||
|
Start nodes @{NODES_OBJ_STOPPED}
|
||||||
|
Cleanup Files ${FILE}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -25,11 +25,11 @@ NeoFS S3 Gateway
|
||||||
... Transaction accepted in block ${TX_DEPOSIT}
|
... Transaction accepted in block ${TX_DEPOSIT}
|
||||||
Get Transaction ${TX_DEPOSIT}
|
Get Transaction ${TX_DEPOSIT}
|
||||||
|
|
||||||
${FILE_S3} = Generate file of bytes 256
|
${FILE_S3} = Generate file of bytes 20e+6
|
||||||
${FILE_S3_HASH} = Get file hash ${FILE_S3}
|
${FILE_S3_HASH} = Get file hash ${FILE_S3}
|
||||||
${FILE_S3_NAME} = Get file name ${FILE_S3}
|
${FILE_S3_NAME} = Get file name ${FILE_S3}
|
||||||
|
|
||||||
${FILE_FS} = Generate file of bytes 256
|
${FILE_FS} = Generate file of bytes 20e+6
|
||||||
${FILE_FS_HASH} = Get file hash ${FILE_FS}
|
${FILE_FS_HASH} = Get file hash ${FILE_FS}
|
||||||
${FILE_FS_NAME} = Get file name ${FILE_FS}
|
${FILE_FS_NAME} = Get file name ${FILE_FS}
|
||||||
|
|
||||||
|
@ -86,5 +86,5 @@ NeoFS S3 Gateway
|
||||||
List Should Not Contain Value ${LIST_S3_OBJECTS} FILE_S3_NAME
|
List Should Not Contain Value ${LIST_S3_OBJECTS} FILE_S3_NAME
|
||||||
|
|
||||||
[Teardown] Cleanup Files s3_obj_get_fs fs_obj_get_fs s3_obj_get_s3 fs_obj_get_s3
|
[Teardown] Cleanup Files s3_obj_get_fs fs_obj_get_fs s3_obj_get_s3 fs_obj_get_s3
|
||||||
... ${FILE_S3} ${FILE_FS} hcs.pub.key
|
... ${FILE_S3} ${FILE_FS}
|
||||||
|
|
||||||
|
|
|
@ -1,33 +1,93 @@
|
||||||
# -*- coding: robot -*-
|
# -*- coding: robot -*-
|
||||||
|
|
||||||
*** Settings ***
|
*** Settings ***
|
||||||
Variables ../../variables/common.py
|
Variables ../../variables/common.py
|
||||||
Variables ../../variables/selectelcdn_smoke.py
|
|
||||||
|
|
||||||
|
|
||||||
Library ${RESOURCES}/neofs.py
|
Library Collections
|
||||||
Library ${RESOURCES}/payment_neogo.py
|
Library ${RESOURCES}/neofs.py
|
||||||
Library ${RESOURCES}/gates.py
|
Library ${RESOURCES}/payment_neogo.py
|
||||||
|
Library ${RESOURCES}/gates.py
|
||||||
|
|
||||||
|
|
||||||
|
*** Variables ***
|
||||||
|
# wallet that has assets in selectel mainnet
|
||||||
|
${WALLET_ROOT} = wallets/selectel_mainnet_wallet.json
|
||||||
|
|
||||||
|
|
||||||
*** Test cases ***
|
*** Test cases ***
|
||||||
|
|
||||||
NeoFS Storage Smoke
|
NeoFS Storage Smoke
|
||||||
[Documentation] Creates container and does PUT, GET and LIST on it via CLI and via HTTP Gate
|
[Documentation] Creates container and does PUT, GET and LIST on it via CLI and via HTTP Gate
|
||||||
[Timeout] 5 min
|
[Timeout] 5 min
|
||||||
|
|
||||||
|
# user.key, container owner
|
||||||
|
${PRIV_KEY} = Form WIF from String 1dd37fba80fec4e6a6f13fd708d8dcb3b29def768017052f6c930fa1c5d90bbb
|
||||||
|
|
||||||
|
${WALLET} = Init wallet
|
||||||
|
|
||||||
|
Generate wallet from WIF ${WALLET} ${PRIV_KEY}
|
||||||
|
${ADDR} = Dump Address ${WALLET}
|
||||||
|
Dump PrivKey ${WALLET} ${ADDR}
|
||||||
|
${SCRIPT_HASH} = Get ScripHash ${PRIV_KEY}
|
||||||
|
|
||||||
|
|
||||||
${TX_DEPOSIT} = NeoFS Deposit ${WALLET} ${ADDR} ${SCRIPT_HASH} 50 one
|
|
||||||
Wait Until Keyword Succeeds 1 min 15 sec
|
|
||||||
... Transaction accepted in block ${TX_DEPOSIT}
|
|
||||||
Get Transaction ${TX_DEPOSIT}
|
|
||||||
|
|
||||||
${CID} = Create container ${PRIV_KEY} public
|
${TX} = Transfer Mainnet Gas ${WALLET_ROOT} NbTiM6h8r99kpRtb428XcsUk1TzKed2gTc ${ADDR} 2 one
|
||||||
Wait Until Keyword Succeeds 2 min 30 sec
|
Wait Until Keyword Succeeds 2 min 15 sec
|
||||||
... Container Existing ${PRIV_KEY} ${CID}
|
... Transaction accepted in block ${TX}
|
||||||
|
|
||||||
|
Get Transaction ${TX}
|
||||||
|
|
||||||
${FILE} = Generate file of bytes 1024
|
|
||||||
${S_OID} = Put object to NeoFS ${PRIV_KEY} ${FILE} ${CID} ${EMPTY} ${EMPTY}
|
|
||||||
Get object from NeoFS ${PRIV_KEY} ${CID} ${S_OID} ${EMPTY} s_file_read
|
|
||||||
|
|
||||||
${FILEPATH} = Get via HTTP Gate ${CID} ${S_OID}
|
${TX_DEPOSIT} = NeoFS Deposit ${WALLET} ${ADDR} ${SCRIPT_HASH} 1
|
||||||
|
Wait Until Keyword Succeeds 1 min 15 sec
|
||||||
|
... Transaction accepted in block ${TX_DEPOSIT}
|
||||||
|
Get Transaction ${TX_DEPOSIT}
|
||||||
|
Get Balance ${PRIV_KEY}
|
||||||
|
|
||||||
|
${CID}
|
||||||
|
... ${BUCKET}
|
||||||
|
... ${ACCESS_KEY_ID}
|
||||||
|
... ${SEC_ACCESS_KEY}
|
||||||
|
... ${OWNER_PRIV_KEY} = Init S3 Credentials ${PRIV_KEY} keys/s3_selectel_hcs.pub.key
|
||||||
|
|
||||||
|
${S3_CLIENT} = Config S3 client ${ACCESS_KEY_ID} ${SEC_ACCESS_KEY}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
${CONTEINERS_LIST} = Container List ${PRIV_KEY}
|
||||||
|
List Should Contain Value ${CONTEINERS_LIST} ${CID}
|
||||||
|
|
||||||
|
${FILE_S3} = Generate file of bytes 1024
|
||||||
|
${FILE_S3_HASH} = Get file hash ${FILE_S3}
|
||||||
|
${FILE_S3_NAME} = Get file name ${FILE_S3}
|
||||||
|
|
||||||
|
${FILE_FS} = Generate file of bytes 1024
|
||||||
|
${FILE_FS_HASH} = Get file hash ${FILE_FS}
|
||||||
|
${FILE_FS_NAME} = Get file name ${FILE_FS}
|
||||||
|
|
||||||
|
${OID_FS} = Put object to NeoFS ${PRIV_KEY} ${FILE_FS} ${CID} ${EMPTY} ${EMPTY}
|
||||||
|
Put object S3 ${S3_CLIENT} ${BUCKET} ${FILE_S3}
|
||||||
|
|
||||||
|
${OID_LIST_S3} = Search object ${PRIV_KEY} ${CID} ${EMPTY} ${EMPTY} FileName=${FILE_S3_NAME}
|
||||||
|
${OID_S3} = Get From List ${OID_LIST_S3} 0
|
||||||
|
|
||||||
|
Get object from NeoFS ${PRIV_KEY} ${CID} ${OID_FS} ${EMPTY} s_file_read
|
||||||
|
Get object S3 ${S3_CLIENT} ${BUCKET} ${FILE_FS_NAME} fs_obj_get_s3
|
||||||
|
${FILEPATH_FS} = Get via HTTP Gate ${CID} ${OID_FS}
|
||||||
|
|
||||||
|
Verify file hash fs_obj_get_s3 ${FILE_FS_HASH}
|
||||||
|
Verify file hash s_file_read ${FILE_FS_HASH}
|
||||||
|
Verify file hash ${FILEPATH_FS} ${FILE_FS_HASH}
|
||||||
|
|
||||||
|
Get object from NeoFS ${PRIV_KEY} ${CID} ${OID_S3} ${EMPTY} s_file_read
|
||||||
|
Get object S3 ${S3_CLIENT} ${BUCKET} ${FILE_S3_NAME} s3_obj_get_s3
|
||||||
|
${FILEPATH_S3} = Get via HTTP Gate ${CID} ${OID_S3}
|
||||||
|
|
||||||
|
Verify file hash s3_obj_get_s3 ${FILE_S3_HASH}
|
||||||
|
Verify file hash s_file_read ${FILE_S3_HASH}
|
||||||
|
Verify file hash ${FILEPATH_S3} ${FILE_S3_HASH}
|
||||||
|
|
||||||
|
[Teardown] Cleanup Files ${FILE_S3} ${FILE_FS} s_file_read s3_obj_get_s3
|
||||||
|
... fs_obj_get_s3 ${FILEPATH_S3} ${FILEPATH_FS}
|
|
@ -9,9 +9,5 @@ CERT="%s/../../ca" % ROOT
|
||||||
# in case when test is run from root in docker
|
# in case when test is run from root in docker
|
||||||
ABSOLUTE_FILE_PATH="/robot/testsuites/integration"
|
ABSOLUTE_FILE_PATH="/robot/testsuites/integration"
|
||||||
|
|
||||||
JF_TOKEN = os.getenv('JF_TOKEN')
|
|
||||||
REG_USR = os.getenv('REG_USR')
|
|
||||||
REG_PWD = os.getenv('REG_PWD')
|
|
||||||
|
|
||||||
MORPH_BLOCK_TIMEOUT = "10sec"
|
MORPH_BLOCK_TIMEOUT = "10sec"
|
||||||
NEOFS_EPOCH_TIMEOUT = "30sec"
|
NEOFS_EPOCH_TIMEOUT = "30sec"
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
#!/usr/bin/python3
|
|
||||||
|
|
||||||
# wallet that has assets in selectel mainnet
|
|
||||||
WALLET = 'wallets/selectel_mainnet_wallet.json'
|
|
||||||
# address from this wallet anf its representations
|
|
||||||
ADDR = 'NbTiM6h8r99kpRtb428XcsUk1TzKed2gTc'
|
|
||||||
SCRIPT_HASH = 'eb88a496178256213f674eb302e44f9d85cf8aaa'
|
|
||||||
PRIV_KEY = 'KxyjQ8eUa4FHt3Gvioyt1Wz29cTUrE4eTqX3yFSk1YFCsPL8uNsY'
|
|
Loading…
Reference in a new issue