From 19809c564168413affea03f2daeed24206db153e Mon Sep 17 00:00:00 2001 From: Yulia Kovshova Date: Mon, 9 Jan 2023 15:46:03 +0300 Subject: [PATCH] Rename to frostfs Signed-off-by: Yulia Kovshova --- .devenv.hosting.yaml | 82 +++++++++---------- CONTRIBUTING.md | 17 ++-- README.md | 34 ++++---- pyproject.toml | 2 +- pytest_tests/helpers/binary_version_helper.py | 20 ++--- pytest_tests/helpers/cluster.py | 14 ++-- pytest_tests/helpers/container.py | 4 +- pytest_tests/helpers/iptables_helper.py | 2 +- pytest_tests/helpers/k6.py | 6 +- pytest_tests/helpers/remote_process.py | 4 +- pytest_tests/helpers/utility.py | 2 +- pytest_tests/helpers/wallet.py | 4 +- pytest_tests/pytest.ini | 6 +- pytest_tests/steps/cluster_test_base.py | 2 +- pytest_tests/steps/load.py | 16 ++-- pytest_tests/steps/s3_gate_base.py | 6 +- pytest_tests/steps/session_token.py | 16 ++-- pytest_tests/steps/storage_object.py | 4 +- pytest_tests/testsuites/acl/conftest.py | 6 +- .../acl/storage_group/test_storagegroup.py | 4 +- pytest_tests/testsuites/acl/test_acl.py | 2 +- pytest_tests/testsuites/acl/test_bearer.py | 4 +- pytest_tests/testsuites/acl/test_eacl.py | 12 +-- .../testsuites/acl/test_eacl_filters.py | 8 +- pytest_tests/testsuites/api/aa/schema_api.py | 3 + pytest_tests/testsuites/conftest.py | 10 +-- .../failovers/test_failover_network.py | 2 +- .../failovers/test_failover_storage.py | 6 +- pytest_tests/testsuites/load/test_load.py | 2 +- .../network/test_node_management.py | 10 +-- .../testsuites/object/test_object_api.py | 4 +- .../object/test_object_api_bearer.py | 4 +- .../testsuites/object/test_object_lifetime.py | 2 +- .../testsuites/object/test_object_lock.py | 4 +- .../testsuites/payment/test_balance.py | 20 ++--- .../services/http_gate/test_http_gate.py | 30 +++---- .../services/http_gate/test_http_headers.py | 2 +- .../services/http_gate/test_http_object.py | 6 +- .../services/http_gate/test_http_streaming.py | 2 +- .../http_gate/test_http_system_header.py | 54 ++++++------ .../services/s3_gate/test_s3_gate.py | 4 +- .../services/s3_gate/test_s3_object.py | 2 +- .../testsuites/services/test_binaries.py | 2 +- .../test_object_session_token.py | 4 +- .../test_static_object_session_token.py | 4 +- .../test_static_session_token_container.py | 2 +- .../testsuites/shard/test_control_shard.py | 8 +- requirements.txt | 2 +- robot/resources/lib/python_keywords/acl.py | 24 +++--- .../lib/python_keywords/cli_helpers.py | 2 +- .../python_keywords/complex_object_actions.py | 12 +-- .../lib/python_keywords/container.py | 34 ++++---- .../lib/python_keywords/container_access.py | 2 +- .../lib/python_keywords/data_formatters.py | 2 +- robot/resources/lib/python_keywords/epoch.py | 30 +++---- .../lib/python_keywords/failover_utils.py | 2 +- .../{neofs_verbs.py => frostfs_verbs.py} | 48 +++++------ .../lib/python_keywords/http_gate.py | 4 +- .../lib/python_keywords/json_transformers.py | 2 +- .../lib/python_keywords/node_management.py | 14 ++-- .../lib/python_keywords/object_access.py | 4 +- .../lib/python_keywords/payment_neogo.py | 28 +++---- .../lib/python_keywords/storage_group.py | 54 ++++++------ .../lib/python_keywords/storage_policy.py | 10 +-- .../lib/python_keywords/tombstone.py | 4 +- robot/variables/common.py | 16 ++-- venv/local-pytest/environment.sh | 2 +- 67 files changed, 392 insertions(+), 368 deletions(-) create mode 100644 pytest_tests/testsuites/api/aa/schema_api.py rename robot/resources/lib/python_keywords/{neofs_verbs.py => frostfs_verbs.py} (90%) diff --git a/.devenv.hosting.yaml b/.devenv.hosting.yaml index 7a4c355..320f2bb 100644 --- a/.devenv.hosting.yaml +++ b/.devenv.hosting.yaml @@ -5,98 +5,98 @@ hosts: - name: s01 attributes: container_name: s01 - config_path: ../neofs-dev-env/services/storage/.storage.env - wallet_path: ../neofs-dev-env/services/storage/wallet01.json + config_path: ../frostfs-dev-env/services/storage/.storage.env + wallet_path: ../frostfs-dev-env/services/storage/wallet01.json local_config_path: ./TemporaryDir/empty-password.yml - local_wallet_path: ../neofs-dev-env/services/storage/wallet01.json + local_wallet_path: ../frostfs-dev-env/services/storage/wallet01.json wallet_password: "" volume_name: storage_storage_s01 - endpoint_data0: s01.neofs.devenv:8080 - control_endpoint: s01.neofs.devenv:8081 + endpoint_data0: s01.frostfs.devenv:8080 + control_endpoint: s01.frostfs.devenv:8081 un_locode: "RU MOW" - name: s02 attributes: container_name: s02 - config_path: ../neofs-dev-env/services/storage/.storage.env - wallet_path: ../neofs-dev-env/services/storage/wallet02.json + config_path: ../frostfs-dev-env/services/storage/.storage.env + wallet_path: ../frostfs-dev-env/services/storage/wallet02.json local_config_path: ./TemporaryDir/empty-password.yml - local_wallet_path: ../neofs-dev-env/services/storage/wallet02.json + local_wallet_path: ../frostfs-dev-env/services/storage/wallet02.json wallet_password: "" volume_name: storage_storage_s02 - endpoint_data0: s02.neofs.devenv:8080 - control_endpoint: s02.neofs.devenv:8081 + endpoint_data0: s02.frostfs.devenv:8080 + control_endpoint: s02.frostfs.devenv:8081 un_locode: "RU LED" - name: s03 attributes: container_name: s03 - config_path: ../neofs-dev-env/services/storage/.storage.env - wallet_path: ../neofs-dev-env/services/storage/wallet03.json + config_path: ../frostfs-dev-env/services/storage/.storage.env + wallet_path: ../frostfs-dev-env/services/storage/wallet03.json local_config_path: ./TemporaryDir/empty-password.yml - local_wallet_path: ../neofs-dev-env/services/storage/wallet03.json + local_wallet_path: ../frostfs-dev-env/services/storage/wallet03.json wallet_password: "" volume_name: storage_storage_s03 - endpoint_data0: s03.neofs.devenv:8080 - control_endpoint: s03.neofs.devenv:8081 + endpoint_data0: s03.frostfs.devenv:8080 + control_endpoint: s03.frostfs.devenv:8081 un_locode: "SE STO" - name: s04 attributes: container_name: s04 - config_path: ../neofs-dev-env/services/storage/.storage.env - wallet_path: ../neofs-dev-env/services/storage/wallet04.json + config_path: ../frostfs-dev-env/services/storage/.storage.env + wallet_path: ../frostfs-dev-env/services/storage/wallet04.json local_config_path: ./TemporaryDir/empty-password.yml - local_wallet_path: ../neofs-dev-env/services/storage/wallet04.json + local_wallet_path: ../frostfs-dev-env/services/storage/wallet04.json wallet_password: "" volume_name: storage_storage_s04 - endpoint_data0: s04.neofs.devenv:8080 - control_endpoint: s04.neofs.devenv:8081 + endpoint_data0: s04.frostfs.devenv:8080 + control_endpoint: s04.frostfs.devenv:8081 un_locode: "FI HEL" - name: s3-gate01 attributes: container_name: s3_gate - config_path: ../neofs-dev-env/services/s3_gate/.s3.env - wallet_path: ../neofs-dev-env/services/s3_gate/wallet.json + config_path: ../frostfs-dev-env/services/s3_gate/.s3.env + wallet_path: ../frostfs-dev-env/services/s3_gate/wallet.json local_config_path: ./TemporaryDir/password-s3.yml - local_wallet_path: ../neofs-dev-env/services/s3_gate/wallet.json + local_wallet_path: ../frostfs-dev-env/services/s3_gate/wallet.json wallet_password: "s3" - endpoint_data0: https://s3.neofs.devenv:8080 + endpoint_data0: https://s3.frostfs.devenv:8080 - name: http-gate01 attributes: container_name: http_gate - config_path: ../neofs-dev-env/services/http_gate/.http.env - wallet_path: ../neofs-dev-env/services/http_gate/wallet.json + config_path: ../frostfs-dev-env/services/http_gate/.http.env + wallet_path: ../frostfs-dev-env/services/http_gate/wallet.json local_config_path: ./TemporaryDir/password-other.yml - local_wallet_path: ../neofs-dev-env/services/http_gate/wallet.json + local_wallet_path: ../frostfs-dev-env/services/http_gate/wallet.json wallet_password: "one" - endpoint_data0: http://http.neofs.devenv + endpoint_data0: http://http.frostfs.devenv - name: ir01 attributes: container_name: ir01 - config_path: ../neofs-dev-env/services/ir/.ir.env - wallet_path: ../neofs-dev-env/services/ir/az.json + config_path: ../frostfs-dev-env/services/ir/.ir.env + wallet_path: ../frostfs-dev-env/services/ir/az.json local_config_path: ./TemporaryDir/password-other.yml - local_wallet_path: ../neofs-dev-env/services/ir/az.json + local_wallet_path: ../frostfs-dev-env/services/ir/az.json wallet_password: "one" - name: morph-chain01 attributes: container_name: morph_chain - config_path: ../neofs-dev-env/services/morph_chain/protocol.privnet.yml - wallet_path: ../neofs-dev-env/services/morph_chain/node-wallet.json + config_path: ../frostfs-dev-env/services/morph_chain/protocol.privnet.yml + wallet_path: ../frostfs-dev-env/services/morph_chain/node-wallet.json local_config_path: ./TemporaryDir/password-other.yml - local_wallet_path: ../neofs-dev-env/services/morph_chain/node-wallet.json + local_wallet_path: ../frostfs-dev-env/services/morph_chain/node-wallet.json wallet_password: "one" - endpoint_internal0: http://morph-chain.neofs.devenv:30333 + endpoint_internal0: http://morph-chain.frostfs.devenv:30333 - name: main-chain01 attributes: container_name: main_chain - config_path: ../neofs-dev-env/services/chain/protocol.privnet.yml - wallet_path: ../neofs-dev-env/services/chain/node-wallet.json + config_path: ../frostfs-dev-env/services/chain/protocol.privnet.yml + wallet_path: ../frostfs-dev-env/services/chain/node-wallet.json local_config_path: ./TemporaryDir/password-other.yml - local_wallet_path: ../neofs-dev-env/services/chain/node-wallet.json + local_wallet_path: ../frostfs-dev-env/services/chain/node-wallet.json wallet_password: "one" - endpoint_internal0: http://main-chain.neofs.devenv:30333 + endpoint_internal0: http://main-chain.frostfs.devenv:30333 - name: coredns01 attributes: container_name: coredns clis: - - name: neofs-cli - exec_path: neofs-cli + - name: frostfs-cli + exec_path: frostfs-cli diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e555ffd..81bdbac 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,8 +3,8 @@ First, thank you for contributing! We love and encourage pull requests from everyone. Please follow the guidelines: -- Check the open [issues](https://github.com/nspcc-dev/neofs-testcases/issues) and - [pull requests](https://github.com/nspcc-dev/neofs-testcases/pulls) for existing +- Check the open [issues](https://github.com/TrueCloudLab/frostfs-testcases/issues) and + [pull requests](https://github.com/TrueCloudLab/frostfs-testcases/pulls) for existing discussions. - Open an issue first, to discuss a new feature or enhancement. @@ -22,13 +22,13 @@ everyone. Please follow the guidelines: ## Development Workflow -Start by forking the `neofs-testcases` repository, make changes in a branch and then +Start by forking the `frostfs-testcases` repository, make changes in a branch and then send a pull request. We encourage pull requests to discuss code changes. Here are the steps in details: ### Set up your GitHub Repository -Fork [NeoFS testcases upstream](https://github.com/nspcc-dev/neofs-testcases/fork) source +Fork [FrosfFS testcases upstream](https://github.com/TrueCloudLab/frostfs-testcases/fork) source repository to your own personal repository. Copy the URL of your fork and clone it: ```shell @@ -36,16 +36,15 @@ $ git clone ``` ### Set up git remote as ``upstream`` - -```shell -$ cd neofs-testcases -$ git remote add upstream https://github.com/nspcc-dev/neofs-testcases +```sh +$ cd frostfs-testcases +$ git remote add upstream https://github.com/TrueCloudLab/frostfs-testcases $ git fetch upstream ``` ### Set up development environment -To setup development environment for `neofs-testcases`, please, take the following steps: +To setup development environment for `frosfs-testcases`, please, take the following steps: 1. Prepare virtualenv ```shell diff --git a/README.md b/README.md index 1252ef5..a565d43 100644 --- a/README.md +++ b/README.md @@ -14,32 +14,32 @@ These tests rely on resources and utility modules that have been originally deve ### Initial preparation -1. Install neofs-cli - - `git clone git@github.com:nspcc-dev/neofs-node.git` - - `cd neofs-node` +1. Install frostfs-cli + - `git clone git@github.com:nspcc-dev/frostfs-node.git` + - `cd frostfs-node` - `make` - - `sudo cp bin/neofs-cli /usr/local/bin/neofs-cli` + - `sudo cp bin/frostfs-cli /usr/local/bin/frostfs-cli` -2. Install neofs-authmate - - `git clone git@github.com:nspcc-dev/neofs-s3-gw.git` - - `cd neofs-s3-gw` +2. Install frostfs-authmate + - `git clone git@github.com:nspcc-dev/frostfs-s3-gw.git` + - `cd frostfs-s3-gw` - `make` - - `sudo cp bin/neofs-authmate /usr/local/bin/neofs-authmate` + - `sudo cp bin/frostfs-authmate /usr/local/bin/frostfs-authmate` 3. Install neo-go - `git clone git@github.com:nspcc-dev/neo-go.git` - `cd neo-go` - - `git checkout v0.92.0` (or the current version in the neofs-dev-env) + - `git checkout v0.92.0` (or the current version in the frostfs-dev-env) - `make` - `sudo cp bin/neo-go /usr/local/bin/neo-go` or download binary from releases: https://github.com/nspcc-dev/neo-go/releases -4. Clone neofs-dev-env -`git clone git@github.com:nspcc-dev/neofs-dev-env.git` +4. Clone frostfs-dev-env +`git clone git@github.com:nspcc-dev/frostfs-dev-env.git` -Note that we expect neofs-dev-env to be located under -the `/../neofs-dev-env` directory. If you put this repo in any other place, -manually set the full path to neofs-dev-env in the environment variable `DEVENV_PATH` at this step. +Note that we expect frostfs-dev-env to be located under +the `/../frostfs-dev-env` directory. If you put this repo in any other place, +manually set the full path to frostfs-dev-env in the environment variable `DEVENV_PATH` at this step. 5. Make sure you have installed all of the following prerequisites on your machine @@ -49,8 +49,8 @@ python3.9 python3.9-dev libssl-dev ``` -As we use neofs-dev-env, you'll also need to install -[prerequisites](https://github.com/nspcc-dev/neofs-dev-env#prerequisites) of this repository. +As we use frostfs-dev-env, you'll also need to install +[prerequisites](https://github.com/nspcc-dev/frostfs-dev-env#prerequisites) of this repository. 6. Prepare virtualenv @@ -122,7 +122,7 @@ $ docker run -p 5050:5050 -e CHECK_RESULTS_EVERY_SECONDS=30 -e KEEP_HISTORY=1 \ Then, you can check the allure report in your browser [by this link](http://localhost:5050/allure-docker-service/projects/default/reports/latest/index.html?redirect=false) -NOTE: feel free to select a different location for `allure-reports` directory, there is no requirement to have it inside `neofs-testcases`. For example, you can place it under `/tmp` path. +NOTE: feel free to select a different location for `allure-reports` directory, there is no requirement to have it inside `frostfs-testcases`. For example, you can place it under `/tmp` path. # Contributing diff --git a/pyproject.toml b/pyproject.toml index 13ca64c..c8f7731 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.isort] profile = "black" -src_paths = ["neofs-keywords", "pytest_tests", "robot"] +src_paths = ["pytest_tests", "robot"] line_length = 100 [tool.black] diff --git a/pytest_tests/helpers/binary_version_helper.py b/pytest_tests/helpers/binary_version_helper.py index 5fe334e..d3f15a3 100644 --- a/pytest_tests/helpers/binary_version_helper.py +++ b/pytest_tests/helpers/binary_version_helper.py @@ -1,10 +1,10 @@ import logging import re -from common import NEOFS_ADM_EXEC, NEOFS_CLI_EXEC, WALLET_CONFIG -from neofs_testlib.cli import NeofsAdm, NeofsCli -from neofs_testlib.hosting import Hosting -from neofs_testlib.shell import Shell +from common import FROSTFS_ADM_EXEC, FROSTFS_CLI_EXEC, WALLET_CONFIG +from frostfs_testlib.cli import FrostfsAdm, FrostfsCli +from frostfs_testlib.hosting import Hosting +from frostfs_testlib.shell import Shell logger = logging.getLogger("NeoLogger") @@ -12,18 +12,18 @@ logger = logging.getLogger("NeoLogger") def get_local_binaries_versions(shell: Shell) -> dict[str, str]: versions = {} - for binary in ["neo-go", "neofs-authmate"]: + for binary in ["neo-go", "frostfs-authmate"]: out = shell.exec(f"{binary} --version").stdout versions[binary] = _parse_version(out) - neofs_cli = NeofsCli(shell, NEOFS_CLI_EXEC, WALLET_CONFIG) - versions["neofs-cli"] = _parse_version(neofs_cli.version.get().stdout) + frostfs_cli = FrostfsCli(shell, FROSTFS_CLI_EXEC, WALLET_CONFIG) + versions["frostfs-cli"] = _parse_version(frostfs_cli.version.get().stdout) try: - neofs_adm = NeofsAdm(shell, NEOFS_ADM_EXEC) - versions["neofs-adm"] = _parse_version(neofs_adm.version.get().stdout) + frostfs_adm = FrostfsAdm(shell, FROSTFS_ADM_EXEC) + versions["frostfs-adm"] = _parse_version(frostfs_adm.version.get().stdout) except RuntimeError: - logger.info(f"neofs-adm not installed") + logger.info(f"frostfs-adm not installed") out = shell.exec("aws --version").stdout out_lines = out.split("\n") diff --git a/pytest_tests/helpers/cluster.py b/pytest_tests/helpers/cluster.py index e972c11..b8793ed 100644 --- a/pytest_tests/helpers/cluster.py +++ b/pytest_tests/helpers/cluster.py @@ -5,9 +5,9 @@ from typing import Any import data_formatters import yaml -from neofs_testlib.blockchain import RPCClient -from neofs_testlib.hosting import Host, Hosting -from neofs_testlib.hosting.config import ServiceConfig +from frostfs_testlib.blockchain import RPCClient +from frostfs_testlib.hosting import Host, Hosting +from frostfs_testlib.hosting.config import ServiceConfig from test_control import wait_for_success @@ -108,7 +108,7 @@ class InnerRingNode(NodeBase): Inner ring node is not always the same as physical host (or physical node, if you will): It can be service running in a container or on physical host For testing perspective, it's not relevant how it is actually running, - since neofs network will still treat it as "node" + since frostfs network will still treat it as "node" """ pass @@ -147,7 +147,7 @@ class MorphChain(NodeBase): Consensus node is not always the same as physical host (or physical node, if you will): It can be service running in a container or on physical host For testing perspective, it's not relevant how it is actually running, - since neofs network will still treat it as "node" + since frostfs network will still treat it as "node" """ rpc_client: RPCClient = None @@ -170,7 +170,7 @@ class MainChain(NodeBase): Consensus node is not always the same as physical host: It can be service running in a container or on physical host (or physical node, if you will): For testing perspective, it's not relevant how it is actually running, - since neofs network will still treat it as "node" + since frostfs network will still treat it as "node" """ rpc_client: RPCClient = None @@ -193,7 +193,7 @@ class StorageNode(NodeBase): Storage node is not always the same as physical host: It can be service running in a container or on physical host (or physical node, if you will): For testing perspective, it's not relevant how it is actually running, - since neofs network will still treat it as "node" + since frostfs network will still treat it as "node" """ def get_rpc_endpoint(self) -> str: diff --git a/pytest_tests/helpers/container.py b/pytest_tests/helpers/container.py index 3a94a06..3b1b49a 100644 --- a/pytest_tests/helpers/container.py +++ b/pytest_tests/helpers/container.py @@ -4,8 +4,8 @@ from typing import Optional import allure from cluster import Cluster from file_helper import generate_file, get_file_hash -from neofs_testlib.shell import Shell -from neofs_verbs import put_object, put_object_to_random_node +from frostfs_testlib.shell import Shell +from frostfs_verbs import put_object, put_object_to_random_node from storage_object import StorageObjectInfo from wallet import WalletFile diff --git a/pytest_tests/helpers/iptables_helper.py b/pytest_tests/helpers/iptables_helper.py index 50beb72..f5aa504 100644 --- a/pytest_tests/helpers/iptables_helper.py +++ b/pytest_tests/helpers/iptables_helper.py @@ -1,4 +1,4 @@ -from neofs_testlib.shell import Shell +from frostfs_testlib.shell import Shell class IpTablesHelper: diff --git a/pytest_tests/helpers/k6.py b/pytest_tests/helpers/k6.py index e6e5a72..5bb08f8 100644 --- a/pytest_tests/helpers/k6.py +++ b/pytest_tests/helpers/k6.py @@ -5,14 +5,14 @@ from time import sleep from typing import Optional import allure -from neofs_testlib.shell import Shell +from frostfs_testlib.shell import Shell from remote_process import RemoteProcess EXIT_RESULT_CODE = 0 LOAD_RESULTS_PATTERNS = { "grpc": { - "write_ops": r"neofs_obj_put_total\W*\d*\W*(?P\d*\.\d*)", - "read_ops": r"neofs_obj_get_total\W*\d*\W*(?P\d*\.\d*)", + "write_ops": r"frostfs_obj_put_total\W*\d*\W*(?P\d*\.\d*)", + "read_ops": r"frostfs_obj_get_total\W*\d*\W*(?P\d*\.\d*)", }, "s3": { "write_ops": r"aws_obj_put_total\W*\d*\W*(?P\d*\.\d*)", diff --git a/pytest_tests/helpers/remote_process.py b/pytest_tests/helpers/remote_process.py index 9137a27..916c7b7 100644 --- a/pytest_tests/helpers/remote_process.py +++ b/pytest_tests/helpers/remote_process.py @@ -4,8 +4,8 @@ import uuid from typing import Optional import allure -from neofs_testlib.shell import Shell -from neofs_testlib.shell.interfaces import CommandOptions +from frostfs_testlib.shell import Shell +from frostfs_testlib.shell.interfaces import CommandOptions from tenacity import retry, stop_after_attempt, wait_fixed diff --git a/pytest_tests/helpers/utility.py b/pytest_tests/helpers/utility.py index 69bc3ad..3993de1 100644 --- a/pytest_tests/helpers/utility.py +++ b/pytest_tests/helpers/utility.py @@ -47,7 +47,7 @@ def placement_policy_from_container(container_info: str) -> str: FILTER Country EQ Sweden AS LOC_SW Args: - container_info: output from neofs-cli container get command + container_info: output from frostfs-cli container get command Returns: placement policy as a string diff --git a/pytest_tests/helpers/wallet.py b/pytest_tests/helpers/wallet.py index 50b7b6a..f1e13a2 100644 --- a/pytest_tests/helpers/wallet.py +++ b/pytest_tests/helpers/wallet.py @@ -4,8 +4,8 @@ from dataclasses import dataclass from cluster import Cluster, NodeBase from common import FREE_STORAGE, WALLET_CONFIG, WALLET_PASS -from neofs_testlib.shell import Shell -from neofs_testlib.utils.wallet import get_last_address_from_wallet, init_wallet +from frostfs_testlib.shell import Shell +from frostfs_testlib.utils.wallet import get_last_address_from_wallet, init_wallet from python_keywords.payment_neogo import deposit_gas, transfer_gas diff --git a/pytest_tests/pytest.ini b/pytest_tests/pytest.ini index b82eac6..f0277cc 100644 --- a/pytest_tests/pytest.ini +++ b/pytest_tests/pytest.ini @@ -13,7 +13,7 @@ markers = # functional markers container: tests for container creation grpc_api: standard gRPC API tests - grpc_control: tests related to using neofs-cli control commands + grpc_control: tests related to using frostfs-cli control commands grpc_object_lock: gRPC lock tests http_gate: HTTP gate contract s3_gate: All S3 gate tests @@ -25,7 +25,7 @@ markers = s3_gate_tagging: Tagging S3 gate tests s3_gate_versioning: Versioning S3 gate tests long: long tests (with long execution time) - node_mgmt: neofs control commands + node_mgmt: frostfs control commands session_token: tests for operations with session token static_session: tests for operations with static session token bearer: tests for bearer tokens @@ -40,6 +40,6 @@ markers = failover_network: tests for network failure failover_reboot: tests for system recovery after reboot of a node add_nodes: add nodes to cluster - check_binaries: check neofs installed binaries versions + check_binaries: check frostfs installed binaries versions payments: tests for payment associated operations load: performance tests diff --git a/pytest_tests/steps/cluster_test_base.py b/pytest_tests/steps/cluster_test_base.py index aeae68d..918581b 100644 --- a/pytest_tests/steps/cluster_test_base.py +++ b/pytest_tests/steps/cluster_test_base.py @@ -2,7 +2,7 @@ import allure import epoch import pytest from cluster import Cluster -from neofs_testlib.shell import Shell +from frostfs_testlib.shell import Shell # To skip adding every mandatory singleton dependency to EACH test function diff --git a/pytest_tests/steps/load.py b/pytest_tests/steps/load.py index 9cd2fbd..60f1b1c 100644 --- a/pytest_tests/steps/load.py +++ b/pytest_tests/steps/load.py @@ -4,14 +4,14 @@ from dataclasses import asdict import allure from common import STORAGE_NODE_SERVICE_NAME_REGEX +from frostfs_testlib.cli.frostfs_authmate import FrostfsAuthmate +from frostfs_testlib.cli.neogo import NeoGo +from frostfs_testlib.hosting import Hosting +from frostfs_testlib.shell import CommandOptions, SSHShell +from frostfs_testlib.shell.interfaces import InteractiveInput from k6 import K6, LoadParams, LoadResults -from neofs_testlib.cli.neofs_authmate import NeofsAuthmate -from neofs_testlib.cli.neogo import NeoGo -from neofs_testlib.hosting import Hosting -from neofs_testlib.shell import CommandOptions, SSHShell -from neofs_testlib.shell.interfaces import InteractiveInput -NEOFS_AUTHMATE_PATH = "neofs-s3-authmate" +FROSTFS_AUTHMATE_PATH = "frostfs-s3-authmate" STOPPED_HOSTS = [] @@ -56,8 +56,8 @@ def init_s3_client( path = ssh_client.exec(r"sudo find . -name 'k6' -exec dirname {} \; -quit").stdout.strip( "\n" ) - neofs_authmate_exec = NeofsAuthmate(ssh_client, NEOFS_AUTHMATE_PATH) - issue_secret_output = neofs_authmate_exec.secret.issue( + frostfs_authmate_exec = FrostfsAuthmate(ssh_client, FROSTFS_AUTHMATE_PATH) + issue_secret_output = frostfs_authmate_exec.secret.issue( wallet=f"{path}/scenarios/files/wallet.json", peer=node_endpoint, bearer_rules=f"{path}/scenarios/files/rules.json", diff --git a/pytest_tests/steps/s3_gate_base.py b/pytest_tests/steps/s3_gate_base.py index d7aa9f2..96d1ab8 100644 --- a/pytest_tests/steps/s3_gate_base.py +++ b/pytest_tests/steps/s3_gate_base.py @@ -17,8 +17,8 @@ from botocore.exceptions import ClientError from cli_helpers import _cmd_run, _configure_aws_cli, _run_with_passwd from cluster import Cluster from cluster_test_base import ClusterTestBase -from common import NEOFS_AUTHMATE_EXEC -from neofs_testlib.shell import Shell +from common import FROSTFS_AUTHMATE_EXEC +from frostfs_testlib.shell import Shell from pytest import FixtureRequest from python_keywords.container import list_containers @@ -128,7 +128,7 @@ def init_s3_credentials( s3gate_node = cluster.s3gates[0] gate_public_key = s3gate_node.get_wallet_public_key() cmd = ( - f"{NEOFS_AUTHMATE_EXEC} --debug --with-log --timeout {CREDENTIALS_CREATE_TIMEOUT} " + f"{FROSTFS_AUTHMATE_EXEC} --debug --with-log --timeout {CREDENTIALS_CREATE_TIMEOUT} " f"issue-secret --wallet {wallet_path} --gate-public-key={gate_public_key} " f"--peer {cluster.default_rpc_endpoint} --container-friendly-name {bucket} " f"--bearer-rules {s3_bearer_rules}" diff --git a/pytest_tests/steps/session_token.py b/pytest_tests/steps/session_token.py index 206d475..d82e8a3 100644 --- a/pytest_tests/steps/session_token.py +++ b/pytest_tests/steps/session_token.py @@ -9,11 +9,11 @@ from typing import Any, Optional import allure import json_transformers -from common import ASSETS_DIR, NEOFS_CLI_EXEC, WALLET_CONFIG +from common import ASSETS_DIR, FROSTFS_CLI_EXEC, WALLET_CONFIG from data_formatters import get_wallet_public_key +from frostfs_testlib.cli import FrostfsCli +from frostfs_testlib.shell import Shell from json_transformers import encode_for_json -from neofs_testlib.cli import NeofsCli -from neofs_testlib.shell import Shell from storage_object_info import StorageObjectInfo from wallet import WalletFile @@ -249,8 +249,8 @@ def create_session_token( The path to the generated session token file. """ session_token = os.path.join(os.getcwd(), ASSETS_DIR, str(uuid.uuid4())) - neofscli = NeofsCli(shell=shell, neofs_cli_exec_path=NEOFS_CLI_EXEC) - neofscli.session.create( + frostfscli = FrostfsCli(shell=shell, frostfs_cli_exec_path=FROSTFS_CLI_EXEC) + frostfscli.session.create( rpc_endpoint=rpc_endpoint, address=owner, wallet=wallet_path, @@ -274,8 +274,10 @@ def sign_session_token(shell: Shell, session_token_file: str, wlt: WalletFile) - The path to the signed token. """ signed_token_file = os.path.join(os.getcwd(), ASSETS_DIR, str(uuid.uuid4())) - neofscli = NeofsCli(shell=shell, neofs_cli_exec_path=NEOFS_CLI_EXEC, config_file=WALLET_CONFIG) - neofscli.util.sign_session_token( + frostfscli = FrostfsCli( + shell=shell, frostfs_cli_exec_path=FROSTFS_CLI_EXEC, config_file=WALLET_CONFIG + ) + frostfscli.util.sign_session_token( wallet=wlt.path, from_file=session_token_file, to_file=signed_token_file ) return signed_token_file diff --git a/pytest_tests/steps/storage_object.py b/pytest_tests/steps/storage_object.py index e4693aa..70f004f 100644 --- a/pytest_tests/steps/storage_object.py +++ b/pytest_tests/steps/storage_object.py @@ -5,9 +5,9 @@ import allure import pytest from cluster import Cluster from epoch import tick_epoch +from frostfs_testlib.shell import Shell from grpc_responses import OBJECT_ALREADY_REMOVED -from neofs_testlib.shell import Shell -from python_keywords.neofs_verbs import delete_object, get_object +from python_keywords.frostfs_verbs import delete_object, get_object from storage_object_info import StorageObjectInfo from tombstone import verify_head_tombstone diff --git a/pytest_tests/testsuites/acl/conftest.py b/pytest_tests/testsuites/acl/conftest.py index 80a9c60..466d33d 100644 --- a/pytest_tests/testsuites/acl/conftest.py +++ b/pytest_tests/testsuites/acl/conftest.py @@ -8,11 +8,11 @@ import pytest from cluster import Cluster from common import WALLET_CONFIG, WALLET_PASS from file_helper import generate_file -from neofs_testlib.shell import Shell -from neofs_testlib.utils.wallet import init_wallet +from frostfs_testlib.shell import Shell +from frostfs_testlib.utils.wallet import init_wallet from python_keywords.acl import EACLRole from python_keywords.container import create_container -from python_keywords.neofs_verbs import put_object_to_random_node +from python_keywords.frostfs_verbs import put_object_to_random_node from wellknown_acl import PUBLIC_ACL OBJECT_COUNT = 5 diff --git a/pytest_tests/testsuites/acl/storage_group/test_storagegroup.py b/pytest_tests/testsuites/acl/storage_group/test_storagegroup.py index d36ae59..4aca204 100644 --- a/pytest_tests/testsuites/acl/storage_group/test_storagegroup.py +++ b/pytest_tests/testsuites/acl/storage_group/test_storagegroup.py @@ -8,8 +8,8 @@ import pytest from cluster_test_base import ClusterTestBase from common import ASSETS_DIR, FREE_STORAGE, WALLET_PASS from file_helper import generate_file +from frostfs_testlib.utils.wallet import init_wallet from grpc_responses import OBJECT_ACCESS_DENIED, OBJECT_NOT_FOUND -from neofs_testlib.utils.wallet import init_wallet from python_keywords.acl import ( EACLAccess, EACLOperation, @@ -20,7 +20,7 @@ from python_keywords.acl import ( set_eacl, ) from python_keywords.container import create_container -from python_keywords.neofs_verbs import put_object_to_random_node +from python_keywords.frostfs_verbs import put_object_to_random_node from python_keywords.payment_neogo import deposit_gas, transfer_gas from python_keywords.storage_group import ( delete_storagegroup, diff --git a/pytest_tests/testsuites/acl/test_acl.py b/pytest_tests/testsuites/acl/test_acl.py index dd61cb3..9225708 100644 --- a/pytest_tests/testsuites/acl/test_acl.py +++ b/pytest_tests/testsuites/acl/test_acl.py @@ -8,7 +8,7 @@ from python_keywords.container_access import ( check_no_access_to_container, check_read_only_container, ) -from python_keywords.neofs_verbs import put_object_to_random_node +from python_keywords.frostfs_verbs import put_object_to_random_node from wellknown_acl import PRIVATE_ACL_F, PUBLIC_ACL_F, READONLY_ACL_F diff --git a/pytest_tests/testsuites/acl/test_bearer.py b/pytest_tests/testsuites/acl/test_bearer.py index 262ce96..3f7bdf5 100644 --- a/pytest_tests/testsuites/acl/test_bearer.py +++ b/pytest_tests/testsuites/acl/test_bearer.py @@ -24,7 +24,9 @@ from python_keywords.container_access import ( class TestACLBearer(ClusterTestBase): @pytest.mark.parametrize("role", [EACLRole.USER, EACLRole.OTHERS]) def test_bearer_token_operations(self, wallets, eacl_container_with_objects, role): - allure.dynamic.title(f"Testcase to validate NeoFS operations with {role.value} BearerToken") + allure.dynamic.title( + f"Testcase to validate FrostFS operations with {role.value} BearerToken" + ) cid, objects_oids, file_path = eacl_container_with_objects user_wallet = wallets.get_wallet() deny_wallet = wallets.get_wallet(role) diff --git a/pytest_tests/testsuites/acl/test_eacl.py b/pytest_tests/testsuites/acl/test_eacl.py index 3ab5655..5b77974 100644 --- a/pytest_tests/testsuites/acl/test_eacl.py +++ b/pytest_tests/testsuites/acl/test_eacl.py @@ -2,7 +2,7 @@ import allure import pytest from cluster_test_base import ClusterTestBase from failover_utils import wait_object_replication -from neofs_testlib.shell import Shell +from frostfs_testlib.shell import Shell from python_keywords.acl import ( EACLAccess, EACLOperation, @@ -17,7 +17,7 @@ from python_keywords.container_access import ( check_full_access_to_container, check_no_access_to_container, ) -from python_keywords.neofs_verbs import put_object_to_random_node +from python_keywords.frostfs_verbs import put_object_to_random_node from python_keywords.node_management import drop_object from python_keywords.object_access import ( can_delete_object, @@ -74,7 +74,7 @@ class TestEACLContainer(ClusterTestBase): not_deny_role_wallet = user_wallet if deny_role == EACLRole.OTHERS else other_wallet deny_role_str = "all others" if deny_role == EACLRole.OTHERS else "user" not_deny_role_str = "user" if deny_role == EACLRole.OTHERS else "all others" - allure.dynamic.title(f"Testcase to deny NeoFS operations for {deny_role_str}.") + allure.dynamic.title(f"Testcase to deny FrostFS operations for {deny_role_str}.") cid, object_oids, file_path = eacl_container_with_objects with allure.step(f"Deny all operations for {deny_role_str} via eACL"): @@ -148,7 +148,7 @@ class TestEACLContainer(ClusterTestBase): cluster=self.cluster, ) - @allure.title("Testcase to allow NeoFS operations for only one other pubkey.") + @allure.title("Testcase to allow FrostFS operations for only one other pubkey.") def test_extended_acl_deny_all_operations_exclude_pubkey( self, wallets, eacl_container_with_objects ): @@ -209,7 +209,7 @@ class TestEACLContainer(ClusterTestBase): cluster=self.cluster, ) - @allure.title("Testcase to validate NeoFS replication with eACL deny rules.") + @allure.title("Testcase to validate FrostFS replication with eACL deny rules.") def test_extended_acl_deny_replication( self, wallets, @@ -251,7 +251,7 @@ class TestEACLContainer(ClusterTestBase): storage_nodes, ) - @allure.title("Testcase to validate NeoFS system operations with extended ACL") + @allure.title("Testcase to validate FrostFS system operations with extended ACL") def test_extended_actions_system(self, wallets, eacl_container_with_objects): user_wallet = wallets.get_wallet() ir_wallet, storage_wallet = wallets.get_wallets_list(role=EACLRole.SYSTEM)[:2] diff --git a/pytest_tests/testsuites/acl/test_eacl_filters.py b/pytest_tests/testsuites/acl/test_eacl_filters.py index 95ac02d..3290e0b 100644 --- a/pytest_tests/testsuites/acl/test_eacl_filters.py +++ b/pytest_tests/testsuites/acl/test_eacl_filters.py @@ -20,7 +20,7 @@ from python_keywords.container_access import ( check_full_access_to_container, check_no_access_to_container, ) -from python_keywords.neofs_verbs import put_object_to_random_node +from python_keywords.frostfs_verbs import put_object_to_random_node from python_keywords.object_access import can_get_head_object, can_get_object, can_put_object from wellknown_acl import PUBLIC_ACL @@ -128,7 +128,7 @@ class TestEACLFilters(ClusterTestBase): "match_type", [EACLMatchType.STRING_EQUAL, EACLMatchType.STRING_NOT_EQUAL] ) def test_extended_acl_filters_request(self, wallets, eacl_container_with_objects, match_type): - allure.dynamic.title(f"Validate NeoFS operations with request filter: {match_type.name}") + allure.dynamic.title(f"Validate FrostFS operations with request filter: {match_type.name}") user_wallet = wallets.get_wallet() other_wallet = wallets.get_wallet(EACLRole.OTHERS) ( @@ -243,7 +243,7 @@ class TestEACLFilters(ClusterTestBase): self, wallets, eacl_container_with_objects, match_type ): allure.dynamic.title( - f"Validate NeoFS operations with deny user headers filter: {match_type.name}" + f"Validate FrostFS operations with deny user headers filter: {match_type.name}" ) user_wallet = wallets.get_wallet() other_wallet = wallets.get_wallet(EACLRole.OTHERS) @@ -425,7 +425,7 @@ class TestEACLFilters(ClusterTestBase): self, wallets, eacl_container_with_objects, match_type ): allure.dynamic.title( - "Testcase to validate NeoFS operation with allow eACL user headers filters:" + "Testcase to validate FrostFS operation with allow eACL user headers filters:" f"{match_type.name}" ) user_wallet = wallets.get_wallet() diff --git a/pytest_tests/testsuites/api/aa/schema_api.py b/pytest_tests/testsuites/api/aa/schema_api.py new file mode 100644 index 0000000..3619eb9 --- /dev/null +++ b/pytest_tests/testsuites/api/aa/schema_api.py @@ -0,0 +1,3 @@ +import schemathesis + +schema = schemathesis.from_uri("http://172.26.160.223:5000/api/openapi.json") diff --git a/pytest_tests/testsuites/conftest.py b/pytest_tests/testsuites/conftest.py index b2ff887..24e95b3 100644 --- a/pytest_tests/testsuites/conftest.py +++ b/pytest_tests/testsuites/conftest.py @@ -21,6 +21,10 @@ from common import ( WALLET_PASS, ) from env_properties import save_env_properties +from frostfs_testlib.hosting import Hosting +from frostfs_testlib.reporter import AllureHandler, get_reporter +from frostfs_testlib.shell import LocalShell, Shell +from frostfs_testlib.utils.wallet import init_wallet from k6 import LoadParams from load import get_services_endpoints, prepare_k6_instances from load_params import ( @@ -32,12 +36,8 @@ from load_params import ( LOAD_NODE_SSH_USER, LOAD_NODES, ) -from neofs_testlib.hosting import Hosting -from neofs_testlib.reporter import AllureHandler, get_reporter -from neofs_testlib.shell import LocalShell, Shell -from neofs_testlib.utils.wallet import init_wallet from payment_neogo import deposit_gas, transfer_gas -from python_keywords.neofs_verbs import get_netmap_netinfo +from python_keywords.frostfs_verbs import get_netmap_netinfo from python_keywords.node_management import storage_node_healthcheck from helpers.wallet import WalletFactory diff --git a/pytest_tests/testsuites/failovers/test_failover_network.py b/pytest_tests/testsuites/failovers/test_failover_network.py index eee214b..a272880 100644 --- a/pytest_tests/testsuites/failovers/test_failover_network.py +++ b/pytest_tests/testsuites/failovers/test_failover_network.py @@ -9,7 +9,7 @@ from failover_utils import wait_all_storage_nodes_returned, wait_object_replicat from file_helper import generate_file, get_file_hash from iptables_helper import IpTablesHelper from python_keywords.container import create_container -from python_keywords.neofs_verbs import get_object, put_object_to_random_node +from python_keywords.frostfs_verbs import get_object, put_object_to_random_node from wellknown_acl import PUBLIC_ACL from steps.cluster_test_base import ClusterTestBase diff --git a/pytest_tests/testsuites/failovers/test_failover_storage.py b/pytest_tests/testsuites/failovers/test_failover_storage.py index c49ce9f..29e639d 100644 --- a/pytest_tests/testsuites/failovers/test_failover_storage.py +++ b/pytest_tests/testsuites/failovers/test_failover_storage.py @@ -5,10 +5,10 @@ import pytest from cluster import Cluster, StorageNode from failover_utils import wait_all_storage_nodes_returned, wait_object_replication from file_helper import generate_file, get_file_hash -from neofs_testlib.hosting import Host -from neofs_testlib.shell import CommandOptions +from frostfs_testlib.hosting import Host +from frostfs_testlib.shell import CommandOptions from python_keywords.container import create_container -from python_keywords.neofs_verbs import get_object, put_object_to_random_node +from python_keywords.frostfs_verbs import get_object, put_object_to_random_node from wellknown_acl import PUBLIC_ACL from steps.cluster_test_base import ClusterTestBase diff --git a/pytest_tests/testsuites/load/test_load.py b/pytest_tests/testsuites/load/test_load.py index d0e220f..7845af0 100644 --- a/pytest_tests/testsuites/load/test_load.py +++ b/pytest_tests/testsuites/load/test_load.py @@ -6,6 +6,7 @@ from common import ( S3_GATE_SERVICE_NAME_REGEX, STORAGE_NODE_SERVICE_NAME_REGEX, ) +from frostfs_testlib.hosting import Hosting from k6 import LoadParams from load import ( clear_cache_and_data, @@ -33,7 +34,6 @@ from load_params import ( STORAGE_NODE_COUNT, WRITERS, ) -from neofs_testlib.hosting import Hosting ENDPOINTS_ATTRIBUTES = { "http": {"regex": HTTP_GATE_SERVICE_NAME_REGEX, "endpoint_attribute": "endpoint"}, diff --git a/pytest_tests/testsuites/network/test_node_management.py b/pytest_tests/testsuites/network/test_node_management.py index 2710d0c..f365afc 100644 --- a/pytest_tests/testsuites/network/test_node_management.py +++ b/pytest_tests/testsuites/network/test_node_management.py @@ -7,13 +7,13 @@ import allure import pytest from cluster import StorageNode from cluster_test_base import ClusterTestBase -from common import MORPH_BLOCK_TIME, NEOFS_CONTRACT_CACHE_TIMEOUT +from common import FROSTFS_CONTRACT_CACHE_TIMEOUT, MORPH_BLOCK_TIME from epoch import tick_epoch from file_helper import generate_file from grpc_responses import OBJECT_NOT_FOUND, error_matches_status from python_keywords.container import create_container, get_container from python_keywords.failover_utils import wait_object_replication -from python_keywords.neofs_verbs import ( +from python_keywords.frostfs_verbs import ( delete_object, get_object, get_object_from_random_node, @@ -324,10 +324,10 @@ class TestNodeManagement(ClusterTestBase): self.validate_object_copies(wallet, placement_rule, file_path, expected_copies) @pytest.mark.node_mgmt - @allure.title("NeoFS object could be dropped using control command") + @allure.title("FrostFS object could be dropped using control command") def test_drop_object(self, default_wallet, complex_object_size, simple_object_size): """ - Test checks object could be dropped using `neofs-cli control drop-objects` command. + Test checks object could be dropped using `frostfs-cli control drop-objects` command. """ wallet = default_wallet endpoint = self.cluster.default_rpc_endpoint @@ -474,7 +474,7 @@ class TestNodeManagement(ClusterTestBase): if copies == expected_copies: break tick_epoch(self.shell, self.cluster) - sleep(parse_time(NEOFS_CONTRACT_CACHE_TIMEOUT)) + sleep(parse_time(FROSTFS_CONTRACT_CACHE_TIMEOUT)) else: raise AssertionError(f"There are no {expected_copies} copies during time") diff --git a/pytest_tests/testsuites/object/test_object_api.py b/pytest_tests/testsuites/object/test_object_api.py index a058f48..e45a3d6 100755 --- a/pytest_tests/testsuites/object/test_object_api.py +++ b/pytest_tests/testsuites/object/test_object_api.py @@ -7,6 +7,7 @@ import pytest from cluster import Cluster from complex_object_actions import get_complex_object_split_ranges from file_helper import generate_file, get_file_content, get_file_hash +from frostfs_testlib.shell import Shell from grpc_responses import ( INVALID_LENGTH_SPECIFIER, INVALID_OFFSET_SPECIFIER, @@ -14,10 +15,9 @@ from grpc_responses import ( INVALID_RANGE_ZERO_LENGTH, OUT_OF_RANGE, ) -from neofs_testlib.shell import Shell from pytest import FixtureRequest from python_keywords.container import create_container -from python_keywords.neofs_verbs import ( +from python_keywords.frostfs_verbs import ( get_object_from_random_node, get_range, get_range_hash, diff --git a/pytest_tests/testsuites/object/test_object_api_bearer.py b/pytest_tests/testsuites/object/test_object_api_bearer.py index 61232ba..8344715 100644 --- a/pytest_tests/testsuites/object/test_object_api_bearer.py +++ b/pytest_tests/testsuites/object/test_object_api_bearer.py @@ -3,8 +3,8 @@ import pytest from cluster import Cluster from container import REP_2_FOR_3_NODES_PLACEMENT_RULE, SINGLE_PLACEMENT_RULE, create_container from epoch import get_epoch -from neofs_testlib.shell import Shell -from neofs_verbs import delete_object, get_object +from frostfs_testlib.shell import Shell +from frostfs_verbs import delete_object, get_object from pytest import FixtureRequest from python_keywords.acl import EACLAccess, EACLOperation, EACLRole, EACLRule, form_bearertoken_file from wellknown_acl import EACL_PUBLIC_READ_WRITE diff --git a/pytest_tests/testsuites/object/test_object_lifetime.py b/pytest_tests/testsuites/object/test_object_lifetime.py index 099eea9..864abe3 100644 --- a/pytest_tests/testsuites/object/test_object_lifetime.py +++ b/pytest_tests/testsuites/object/test_object_lifetime.py @@ -7,7 +7,7 @@ from file_helper import generate_file, get_file_hash from grpc_responses import OBJECT_NOT_FOUND from pytest import FixtureRequest from python_keywords.container import create_container -from python_keywords.neofs_verbs import get_object_from_random_node, put_object_to_random_node +from python_keywords.frostfs_verbs import get_object_from_random_node, put_object_to_random_node from utility import wait_for_gc_pass_on_storage_nodes from steps.cluster_test_base import ClusterTestBase diff --git a/pytest_tests/testsuites/object/test_object_lock.py b/pytest_tests/testsuites/object/test_object_lock.py index 8e0548a..f9ec6fd 100755 --- a/pytest_tests/testsuites/object/test_object_lock.py +++ b/pytest_tests/testsuites/object/test_object_lock.py @@ -8,6 +8,7 @@ from cluster_test_base import ClusterTestBase from common import STORAGE_GC_TIME from complex_object_actions import get_link_object, get_storage_object_chunks from epoch import ensure_fresh_epoch, get_epoch, tick_epoch +from frostfs_testlib.shell import Shell from grpc_responses import ( LIFETIME_REQUIRED, LOCK_NON_REGULAR_OBJECT, @@ -17,11 +18,10 @@ from grpc_responses import ( OBJECT_IS_LOCKED, OBJECT_NOT_FOUND, ) -from neofs_testlib.shell import Shell from node_management import drop_object from pytest import FixtureRequest from python_keywords.container import create_container -from python_keywords.neofs_verbs import delete_object, head_object, lock_object +from python_keywords.frostfs_verbs import delete_object, head_object, lock_object from storage_policy import get_nodes_with_object from test_control import expect_not_raises, wait_for_success from utility import parse_time, wait_for_gc_pass_on_storage_nodes diff --git a/pytest_tests/testsuites/payment/test_balance.py b/pytest_tests/testsuites/payment/test_balance.py index 6bebc9c..f8b06a8 100644 --- a/pytest_tests/testsuites/payment/test_balance.py +++ b/pytest_tests/testsuites/payment/test_balance.py @@ -5,9 +5,9 @@ import allure import pytest import yaml from cluster_test_base import ClusterTestBase -from common import FREE_STORAGE, NEOFS_CLI_EXEC, WALLET_CONFIG -from neofs_testlib.cli import NeofsCli -from neofs_testlib.shell import CommandResult, Shell +from common import FREE_STORAGE, FROSTFS_CLI_EXEC, WALLET_CONFIG +from frostfs_testlib.cli import FrostfsCli +from frostfs_testlib.shell import CommandResult, Shell from wallet import WalletFactory, WalletFile logger = logging.getLogger("NeoLogger") @@ -27,8 +27,8 @@ class TestBalanceAccounting(ClusterTestBase): return wallet_factory.create_wallet() @pytest.fixture(scope="class") - def cli(self, client_shell: Shell) -> NeofsCli: - return NeofsCli(client_shell, NEOFS_CLI_EXEC, WALLET_CONFIG) + def cli(self, client_shell: Shell) -> FrostfsCli: + return FrostfsCli(client_shell, FROSTFS_CLI_EXEC, WALLET_CONFIG) @allure.step("Check deposit amount") def check_amount(self, result: CommandResult) -> None: @@ -53,13 +53,13 @@ class TestBalanceAccounting(ClusterTestBase): "rpc-endpoint": endpoint, "wallet": wallet, } - api_config_file = os.path.join(config_dir, "neofs-cli-api-config.yaml") + api_config_file = os.path.join(config_dir, "frostfs-cli-api-config.yaml") with open(api_config_file, "w") as file: yaml.dump(api_config, file) return api_config_file @allure.title("Test balance request with wallet and address") - def test_balance_wallet_address(self, main_wallet: WalletFile, cli: NeofsCli): + def test_balance_wallet_address(self, main_wallet: WalletFile, cli: FrostfsCli): result = cli.accounting.balance( wallet=main_wallet.path, rpc_endpoint=self.cluster.default_rpc_endpoint, @@ -69,7 +69,7 @@ class TestBalanceAccounting(ClusterTestBase): self.check_amount(result) @allure.title("Test balance request with wallet only") - def test_balance_wallet(self, main_wallet: WalletFile, cli: NeofsCli): + def test_balance_wallet(self, main_wallet: WalletFile, cli: FrostfsCli): result = cli.accounting.balance( wallet=main_wallet.path, rpc_endpoint=self.cluster.default_rpc_endpoint ) @@ -77,7 +77,7 @@ class TestBalanceAccounting(ClusterTestBase): @allure.title("Test balance request with wallet and wrong address") def test_balance_wrong_address( - self, main_wallet: WalletFile, other_wallet: WalletFile, cli: NeofsCli + self, main_wallet: WalletFile, other_wallet: WalletFile, cli: FrostfsCli ): with pytest.raises(Exception, match="address option must be specified and valid"): cli.accounting.balance( @@ -95,7 +95,7 @@ class TestBalanceAccounting(ClusterTestBase): ) logger.info(f"Config with API endpoint: {config_file}") - cli = NeofsCli(client_shell, NEOFS_CLI_EXEC, config_file=config_file) + cli = FrostfsCli(client_shell, FROSTFS_CLI_EXEC, config_file=config_file) result = cli.accounting.balance() self.check_amount(result) diff --git a/pytest_tests/testsuites/services/http_gate/test_http_gate.py b/pytest_tests/testsuites/services/http_gate/test_http_gate.py index ba04015..eabee62 100644 --- a/pytest_tests/testsuites/services/http_gate/test_http_gate.py +++ b/pytest_tests/testsuites/services/http_gate/test_http_gate.py @@ -6,6 +6,7 @@ import pytest from epoch import get_epoch, tick_epoch from file_helper import generate_file, get_file_hash from python_keywords.container import create_container +from python_keywords.frostfs_verbs import put_object_to_random_node from python_keywords.http_gate import ( attr_into_header, get_object_and_verify_hashes, @@ -17,7 +18,6 @@ from python_keywords.http_gate import ( upload_via_http_gate, upload_via_http_gate_curl, ) -from python_keywords.neofs_verbs import put_object_to_random_node from utility import wait_for_gc_pass_on_storage_nodes from wellknown_acl import PUBLIC_ACL @@ -28,10 +28,11 @@ OBJECT_NOT_FOUND_ERROR = "not found" @allure.link( - "https://github.com/nspcc-dev/neofs-http-gw#neofs-http-gateway", name="neofs-http-gateway" + "https://github.com/TrueCloudLab/frostfs-http-gw#frostfs-http-gateway", + name="frostfs-http-gateway", ) -@allure.link("https://github.com/nspcc-dev/neofs-http-gw#uploading", name="uploading") -@allure.link("https://github.com/nspcc-dev/neofs-http-gw#downloading", name="downloading") +@allure.link("https://github.com/TrueCloudLab/frostfs-http-gw#uploading", name="uploading") +@allure.link("https://github.com/TrueCloudLab/frostfs-http-gw#downloading", name="downloading") @pytest.mark.sanity @pytest.mark.http_gate class TestHttpGate(ClusterTestBase): @@ -50,9 +51,9 @@ class TestHttpGate(ClusterTestBase): Steps: 1. Create simple and large objects. - 2. Put objects using gRPC (neofs-cli). - 3. Download objects using HTTP gate (https://github.com/nspcc-dev/neofs-http-gw#downloading). - 4. Get objects using gRPC (neofs-cli). + 2. Put objects using gRPC (frostfs-cli). + 3. Download objects using HTTP gate (https://github.com/TrueCloudLab/frostfs-http-gw#downloading). + 4. Get objects using gRPC (frostfs-cli). 5. Compare hashes for got objects. 6. Compare hashes for got and original objects. @@ -97,8 +98,8 @@ class TestHttpGate(ClusterTestBase): endpoint=self.cluster.default_http_gate_endpoint, ) - @allure.link("https://github.com/nspcc-dev/neofs-http-gw#uploading", name="uploading") - @allure.link("https://github.com/nspcc-dev/neofs-http-gw#downloading", name="downloading") + @allure.link("https://github.com/TrueCloudLab/frostfs-http-gw#uploading", name="uploading") + @allure.link("https://github.com/TrueCloudLab/frostfs-http-gw#downloading", name="downloading") @allure.title("Test Put over HTTP, Get over HTTP") @pytest.mark.smoke def test_put_http_get_http(self, complex_object_size, simple_object_size): @@ -107,8 +108,8 @@ class TestHttpGate(ClusterTestBase): Steps: 1. Create simple and large objects. - 2. Upload objects using HTTP (https://github.com/nspcc-dev/neofs-http-gw#uploading). - 3. Download objects using HTTP gate (https://github.com/nspcc-dev/neofs-http-gw#downloading). + 2. Upload objects using HTTP (https://github.com/TrueCloudLab/frostfs-http-gw#uploading). + 3. Download objects using HTTP gate (https://github.com/TrueCloudLab/frostfs-http-gw#downloading). 4. Compare hashes for got and original objects. Expected result: @@ -145,7 +146,8 @@ class TestHttpGate(ClusterTestBase): ) @allure.link( - "https://github.com/nspcc-dev/neofs-http-gw#by-attributes", name="download by attributes" + "https://github.com/TrueCloudLab/frostfs-http-gw#by-attributes", + name="download by attributes", ) @allure.title("Test Put over HTTP, Get over HTTP with headers") @pytest.mark.parametrize( @@ -164,7 +166,7 @@ class TestHttpGate(ClusterTestBase): Steps: 1. Create simple and large objects. 2. Upload objects using HTTP with particular attributes in the header. - 3. Download objects by attributes using HTTP gate (https://github.com/nspcc-dev/neofs-http-gw#by-attributes). + 3. Download objects by attributes using HTTP gate (https://github.com/TrueCloudLab/frostfs-http-gw#by-attributes). 4. Compare hashes for got and original objects. Expected result: @@ -215,7 +217,7 @@ class TestHttpGate(ClusterTestBase): epochs = (curr_epoch, curr_epoch + 1, curr_epoch + 2, curr_epoch + 100) for epoch in epochs: - headers = {"X-Attribute-Neofs-Expiration-Epoch": str(epoch)} + headers = {"X-Attribute-Frostfs-Expiration-Epoch": str(epoch)} with allure.step("Put objects using HTTP with attribute Expiration-Epoch"): oids.append( diff --git a/pytest_tests/testsuites/services/http_gate/test_http_headers.py b/pytest_tests/testsuites/services/http_gate/test_http_headers.py index e6540b5..5679125 100644 --- a/pytest_tests/testsuites/services/http_gate/test_http_headers.py +++ b/pytest_tests/testsuites/services/http_gate/test_http_headers.py @@ -19,7 +19,7 @@ from http_gate import ( upload_via_http_gate_curl, ) from pytest import FixtureRequest -from python_keywords.neofs_verbs import delete_object +from python_keywords.frostfs_verbs import delete_object from wellknown_acl import PUBLIC_ACL from helpers.storage_object_info import StorageObjectInfo diff --git a/pytest_tests/testsuites/services/http_gate/test_http_object.py b/pytest_tests/testsuites/services/http_gate/test_http_object.py index 50ad72a..c92ef3b 100644 --- a/pytest_tests/testsuites/services/http_gate/test_http_object.py +++ b/pytest_tests/testsuites/services/http_gate/test_http_object.py @@ -10,7 +10,7 @@ from http_gate import ( get_object_by_attr_and_verify_hashes, try_to_get_object_via_passed_request_and_expect_error, ) -from python_keywords.neofs_verbs import put_object_to_random_node +from python_keywords.frostfs_verbs import put_object_to_random_node from wellknown_acl import PUBLIC_ACL from steps.cluster_test_base import ClusterTestBase @@ -40,8 +40,8 @@ class Test_http_object(ClusterTestBase): Steps: 1. Create object; - 2. Put objects using gRPC (neofs-cli) with attributes [--attributes chapter1=peace,chapter2=war]; - 3. Download object using HTTP gate (https://github.com/nspcc-dev/neofs-http-gw#downloading); + 2. Put objects using gRPC (frostfs-cli) with attributes [--attributes chapter1=peace,chapter2=war]; + 3. Download object using HTTP gate (https://github.com/TrueCloudLab/frostfs-http-gw#downloading); 4. Compare hashes between original and downloaded object; 5. [Negative] Try to the get object with specified attributes and `get` request: [get/$CID/chapter1/peace]; 6. Download the object with specified attributes and `get_by_attribute` request: [get_by_attribute/$CID/chapter1/peace]; diff --git a/pytest_tests/testsuites/services/http_gate/test_http_streaming.py b/pytest_tests/testsuites/services/http_gate/test_http_streaming.py index 851b2bf..25310e1 100644 --- a/pytest_tests/testsuites/services/http_gate/test_http_streaming.py +++ b/pytest_tests/testsuites/services/http_gate/test_http_streaming.py @@ -35,7 +35,7 @@ class Test_http_streaming(ClusterTestBase): Steps: 1. Create big object; 2. Put object using curl with pipe (streaming); - 3. Download object using HTTP gate (https://github.com/nspcc-dev/neofs-http-gw#downloading); + 3. Download object using HTTP gate (https://github.com/TrueCloudLab/frostfs-http-gw#downloading); 4. Compare hashes between original and downloaded object; Expected result: diff --git a/pytest_tests/testsuites/services/http_gate/test_http_system_header.py b/pytest_tests/testsuites/services/http_gate/test_http_system_header.py index a8d11c8..ba1e9cc 100644 --- a/pytest_tests/testsuites/services/http_gate/test_http_system_header.py +++ b/pytest_tests/testsuites/services/http_gate/test_http_system_header.py @@ -15,20 +15,24 @@ from http_gate import ( try_to_get_object_and_expect_error, upload_via_http_gate_curl, ) -from python_keywords.neofs_verbs import get_netmap_netinfo, get_object_from_random_node, head_object +from python_keywords.frostfs_verbs import ( + get_netmap_netinfo, + get_object_from_random_node, + head_object, +) from wellknown_acl import PUBLIC_ACL from steps.cluster_test_base import ClusterTestBase logger = logging.getLogger("NeoLogger") -EXPIRATION_TIMESTAMP_HEADER = "__NEOFS__EXPIRATION_TIMESTAMP" -EXPIRATION_EPOCH_HEADER = "__NEOFS__EXPIRATION_EPOCH" -EXPIRATION_DURATION_HEADER = "__NEOFS__EXPIRATION_DURATION" -EXPIRATION_EXPIRATION_RFC = "__NEOFS__EXPIRATION_RFC3339" -NEOFS_EXPIRATION_EPOCH = "Neofs-Expiration-Epoch" -NEOFS_EXPIRATION_DURATION = "Neofs-Expiration-Duration" -NEOFS_EXPIRATION_TIMESTAMP = "Neofs-Expiration-Timestamp" -NEOFS_EXIPRATION_RFC3339 = "Neofs-Expiration-RFC3339" +EXPIRATION_TIMESTAMP_HEADER = "__FROSRFS__EXPIRATION_TIMESTAMP" +EXPIRATION_EPOCH_HEADER = "__FROSRFS__EXPIRATION_EPOCH" +EXPIRATION_DURATION_HEADER = "__FROSRFS__EXPIRATION_DURATION" +EXPIRATION_EXPIRATION_RFC = "__FROSRFS__EXPIRATION_RFC3339" +FROSRFS_EXPIRATION_EPOCH = "Frostfs-Expiration-Epoch" +FROSRFS_EXPIRATION_DURATION = "Frostfs-Expiration-Duration" +FROSRFS_EXPIRATION_TIMESTAMP = "Frostfs-Expiration-Timestamp" +FROSRFS_EXIPRATION_RFC3339 = "Frostfs-Expiration-RFC3339" @pytest.mark.sanity @@ -94,7 +98,7 @@ class Test_http_system_header(ClusterTestBase): f"Validate that only {EXPIRATION_EPOCH_HEADER} exists in header and other headers are abesent" ) def validation_for_http_header_attr(self, head_info: dict, expected_epoch: int) -> None: - # check that __NEOFS__EXPIRATION_EPOCH attribute has corresponding epoch + # check that __FROSTFS__EXPIRATION_EPOCH attribute has corresponding epoch assert self.check_key_value_presented_header( head_info, {EXPIRATION_EPOCH_HEADER: str(expected_epoch)} ), f'Expected to find {EXPIRATION_EPOCH_HEADER}: {expected_epoch} in: {head_info["header"]["attributes"]}' @@ -140,7 +144,7 @@ class Test_http_system_header(ClusterTestBase): @allure.title("[negative] attempt to put object with expired epoch") def test_unable_put_expired_epoch(self, user_container: str, simple_object_size: int): headers = attr_into_str_header_curl( - {"Neofs-Expiration-Epoch": str(get_epoch(self.shell, self.cluster) - 1)} + {"Frostfs-Expiration-Epoch": str(get_epoch(self.shell, self.cluster) - 1)} ) file_path = generate_file(simple_object_size) with allure.step( @@ -154,12 +158,12 @@ class Test_http_system_header(ClusterTestBase): error_pattern="object has expired", ) - @allure.title("[negative] attempt to put object with negative Neofs-Expiration-Duration") + @allure.title("[negative] attempt to put object with negative Frostfs-Expiration-Duration") def test_unable_put_negative_duration(self, user_container: str, simple_object_size: int): - headers = attr_into_str_header_curl({"Neofs-Expiration-Duration": "-1h"}) + headers = attr_into_str_header_curl({"Frostfs-Expiration-Duration": "-1h"}) file_path = generate_file(simple_object_size) with allure.step( - "Put object using HTTP with attribute Neofs-Expiration-Duration where duration is negative" + "Put object using HTTP with attribute Frostfs-Expiration-Duration where duration is negative" ): upload_via_http_gate_curl( cid=user_container, @@ -170,13 +174,13 @@ class Test_http_system_header(ClusterTestBase): ) @allure.title( - "[negative] attempt to put object with Neofs-Expiration-Timestamp value in the past" + "[negative] attempt to put object with Frostfs-Expiration-Timestamp value in the past" ) def test_unable_put_expired_timestamp(self, user_container: str, simple_object_size: int): - headers = attr_into_str_header_curl({"Neofs-Expiration-Timestamp": "1635075727"}) + headers = attr_into_str_header_curl({"Frostfs-Expiration-Timestamp": "1635075727"}) file_path = generate_file(simple_object_size) with allure.step( - "Put object using HTTP with attribute Neofs-Expiration-Timestamp where duration is in the past" + "Put object using HTTP with attribute Frostfs-Expiration-Timestamp where duration is in the past" ): upload_via_http_gate_curl( cid=user_container, @@ -187,10 +191,10 @@ class Test_http_system_header(ClusterTestBase): ) @allure.title( - "[negative] Put object using HTTP with attribute Neofs-Expiration-RFC3339 where duration is in the past" + "[negative] Put object using HTTP with attribute Frostfs-Expiration-RFC3339 where duration is in the past" ) def test_unable_put_expired_rfc(self, user_container: str, simple_object_size: int): - headers = attr_into_str_header_curl({"Neofs-Expiration-RFC3339": "2021-11-22T09:55:49Z"}) + headers = attr_into_str_header_curl({"Frostfs-Expiration-RFC3339": "2021-11-22T09:55:49Z"}) file_path = generate_file(simple_object_size) upload_via_http_gate_curl( cid=user_container, @@ -215,7 +219,7 @@ class Test_http_system_header(ClusterTestBase): logger.info( f"epoch duration={epoch_duration}, current_epoch= {get_epoch(self.shell, self.cluster)} expected_epoch {expected_epoch}" ) - attributes = {NEOFS_EXPIRATION_EPOCH: expected_epoch, NEOFS_EXPIRATION_DURATION: "1m"} + attributes = {FROSTFS_EXPIRATION_EPOCH: expected_epoch, FROSTFS_EXPIRATION_DURATION: "1m"} file_path = generate_file(object_size) with allure.step( f"Put objects using HTTP with attributes and head command should display {EXPIRATION_EPOCH_HEADER}: {expected_epoch} attr" @@ -263,10 +267,10 @@ class Test_http_system_header(ClusterTestBase): f"epoch duration={epoch_duration}, current_epoch= {get_epoch(self.shell, self.cluster)} expected_epoch {expected_epoch}" ) attributes = { - NEOFS_EXPIRATION_DURATION: self.epoch_count_into_mins( + FROSTFS_EXPIRATION_DURATION: self.epoch_count_into_mins( epoch_duration=epoch_duration, epoch=2 ), - NEOFS_EXPIRATION_TIMESTAMP: self.epoch_count_into_timestamp( + FROSTFS_EXPIRATION_TIMESTAMP: self.epoch_count_into_timestamp( epoch_duration=epoch_duration, epoch=1 ), } @@ -317,10 +321,10 @@ class Test_http_system_header(ClusterTestBase): f"epoch duration={epoch_duration}, current_epoch= {get_epoch(self.shell, self.cluster)} expected_epoch {expected_epoch}" ) attributes = { - NEOFS_EXPIRATION_TIMESTAMP: self.epoch_count_into_timestamp( + FROSTFS_EXPIRATION_TIMESTAMP: self.epoch_count_into_timestamp( epoch_duration=epoch_duration, epoch=2 ), - NEOFS_EXIPRATION_RFC3339: self.epoch_count_into_timestamp( + FROSTFS_EXIPRATION_RFC3339: self.epoch_count_into_timestamp( epoch_duration=epoch_duration, epoch=1, rfc3339=True ), } @@ -369,7 +373,7 @@ class Test_http_system_header(ClusterTestBase): f"epoch duration={epoch_duration}, current_epoch= {get_epoch(self.shell, self.cluster)} expected_epoch {expected_epoch}" ) attributes = { - NEOFS_EXIPRATION_RFC3339: self.epoch_count_into_timestamp( + FROSTFS_EXIPRATION_RFC3339: self.epoch_count_into_timestamp( epoch_duration=epoch_duration, epoch=2, rfc3339=True ) } diff --git a/pytest_tests/testsuites/services/s3_gate/test_s3_gate.py b/pytest_tests/testsuites/services/s3_gate/test_s3_gate.py index 4487c61..b89e1a2 100644 --- a/pytest_tests/testsuites/services/s3_gate/test_s3_gate.py +++ b/pytest_tests/testsuites/services/s3_gate/test_s3_gate.py @@ -33,7 +33,9 @@ def pytest_generate_tests(metafunc): metafunc.parametrize("s3_client", ["aws cli", "boto3"], indirect=True) -@allure.link("https://github.com/nspcc-dev/neofs-s3-gw#neofs-s3-gateway", name="neofs-s3-gateway") +@allure.link( + "https://github.com/TrueCloudLab/frostfs-s3-gw#frostfs-s3-gw", name="frostfs-s3-gateway" +) @pytest.mark.sanity @pytest.mark.s3_gate @pytest.mark.s3_gate_base diff --git a/pytest_tests/testsuites/services/s3_gate/test_s3_object.py b/pytest_tests/testsuites/services/s3_gate/test_s3_object.py index ed6cefe..94e9e8e 100644 --- a/pytest_tests/testsuites/services/s3_gate/test_s3_object.py +++ b/pytest_tests/testsuites/services/s3_gate/test_s3_object.py @@ -10,7 +10,7 @@ from aws_cli_client import AwsCliClient from common import ASSETS_DIR, FREE_STORAGE, WALLET_PASS from data_formatters import get_wallet_public_key from file_helper import concat_files, generate_file, generate_file_with_content, get_file_hash -from neofs_testlib.utils.wallet import init_wallet +from frostfs_testlib.utils.wallet import init_wallet from python_keywords.payment_neogo import deposit_gas, transfer_gas from s3_helper import ( assert_object_lock_mode, diff --git a/pytest_tests/testsuites/services/test_binaries.py b/pytest_tests/testsuites/services/test_binaries.py index 8058294..3e3fae0 100644 --- a/pytest_tests/testsuites/services/test_binaries.py +++ b/pytest_tests/testsuites/services/test_binaries.py @@ -8,7 +8,7 @@ import requests from binary_version_helper import get_remote_binaries_versions from common import BIN_VERSIONS_FILE from env_properties import read_env_properties, save_env_properties -from neofs_testlib.hosting import Hosting +from frostfs_testlib.hosting import Hosting logger = logging.getLogger("NeoLogger") diff --git a/pytest_tests/testsuites/session_token/test_object_session_token.py b/pytest_tests/testsuites/session_token/test_object_session_token.py index a879989..8c517bc 100644 --- a/pytest_tests/testsuites/session_token/test_object_session_token.py +++ b/pytest_tests/testsuites/session_token/test_object_session_token.py @@ -5,10 +5,10 @@ import pytest from cluster_test_base import ClusterTestBase from common import WALLET_PASS from file_helper import generate_file +from frostfs_testlib.utils.wallet import get_last_address_from_wallet from grpc_responses import SESSION_NOT_FOUND -from neofs_testlib.utils.wallet import get_last_address_from_wallet from python_keywords.container import create_container -from python_keywords.neofs_verbs import delete_object, put_object, put_object_to_random_node +from python_keywords.frostfs_verbs import delete_object, put_object, put_object_to_random_node from steps.session_token import create_session_token diff --git a/pytest_tests/testsuites/session_token/test_static_object_session_token.py b/pytest_tests/testsuites/session_token/test_static_object_session_token.py index 701ecba..9d381bf 100644 --- a/pytest_tests/testsuites/session_token/test_static_object_session_token.py +++ b/pytest_tests/testsuites/session_token/test_static_object_session_token.py @@ -6,16 +6,16 @@ from cluster import Cluster from cluster_test_base import ClusterTestBase from epoch import ensure_fresh_epoch from file_helper import generate_file +from frostfs_testlib.shell import Shell from grpc_responses import ( EXPIRED_SESSION_TOKEN, MALFORMED_REQUEST, OBJECT_ACCESS_DENIED, OBJECT_NOT_FOUND, ) -from neofs_testlib.shell import Shell from pytest import FixtureRequest from python_keywords.container import create_container -from python_keywords.neofs_verbs import ( +from python_keywords.frostfs_verbs import ( delete_object, get_object, get_object_from_random_node, diff --git a/pytest_tests/testsuites/session_token/test_static_session_token_container.py b/pytest_tests/testsuites/session_token/test_static_session_token_container.py index 8e73137..529b138 100644 --- a/pytest_tests/testsuites/session_token/test_static_session_token_container.py +++ b/pytest_tests/testsuites/session_token/test_static_session_token_container.py @@ -1,7 +1,7 @@ import allure import pytest from file_helper import generate_file -from neofs_testlib.shell import Shell +from frostfs_testlib.shell import Shell from python_keywords.acl import ( EACLAccess, EACLOperation, diff --git a/pytest_tests/testsuites/shard/test_control_shard.py b/pytest_tests/testsuites/shard/test_control_shard.py index b760096..22f89cd 100644 --- a/pytest_tests/testsuites/shard/test_control_shard.py +++ b/pytest_tests/testsuites/shard/test_control_shard.py @@ -10,9 +10,9 @@ import yaml from cluster import Cluster, StorageNode from common import WALLET_CONFIG from configobj import ConfigObj -from neofs_testlib.cli import NeofsCli +from frostfs_testlib.cli import FrostfsCli -SHARD_PREFIX = "NEOFS_STORAGE_SHARD_" +SHARD_PREFIX = "FROSTFS_STORAGE_SHARD_" BLOBSTOR_PREFIX = "_BLOBSTOR_" @@ -134,9 +134,9 @@ class TestControlShard: wallet_password = node.get_wallet_password() control_endpoint = node.get_control_endpoint() - cli_config = node.host.get_cli_config("neofs-cli") + cli_config = node.host.get_cli_config("frostfs-cli") - cli = NeofsCli(node.host.get_shell(), cli_config.exec_path, WALLET_CONFIG) + cli = FrostfsCli(node.host.get_shell(), cli_config.exec_path, WALLET_CONFIG) result = cli.shards.list( endpoint=control_endpoint, wallet=wallet_path, diff --git a/requirements.txt b/requirements.txt index ef2bb74..9a51135 100644 --- a/requirements.txt +++ b/requirements.txt @@ -30,7 +30,7 @@ mmh3==3.0.0 multidict==6.0.2 mypy==0.950 mypy-extensions==0.4.3 -neofs-testlib==1.1.1 +frostfs-testlib==1.2.0 netaddr==0.8.0 packaging==21.3 paramiko==2.10.3 diff --git a/robot/resources/lib/python_keywords/acl.py b/robot/resources/lib/python_keywords/acl.py index 1ffd8dc..9b46d74 100644 --- a/robot/resources/lib/python_keywords/acl.py +++ b/robot/resources/lib/python_keywords/acl.py @@ -10,14 +10,14 @@ from typing import Any, Dict, List, Optional, Union import allure import base58 -from common import ASSETS_DIR, NEOFS_CLI_EXEC, WALLET_CONFIG +from common import ASSETS_DIR, FROSTFS_CLI_EXEC, WALLET_CONFIG from data_formatters import get_wallet_public_key -from neofs_testlib.cli import NeofsCli -from neofs_testlib.shell import Shell +from frostfs_testlib.cli import FrostfsCli +from frostfs_testlib.shell import Shell logger = logging.getLogger("NeoLogger") EACL_LIFETIME = 100500 -NEOFS_CONTRACT_CACHE_TIMEOUT = 30 +FROSTFS_CONTRACT_CACHE_TIMEOUT = 30 class EACLOperation(Enum): @@ -44,7 +44,7 @@ class EACLRole(Enum): class EACLHeaderType(Enum): REQUEST = "req" # Filter request headers OBJECT = "obj" # Filter object headers - SERVICE = "SERVICE" # Filter service headers. These are not processed by NeoFS nodes and exist for service use only + SERVICE = "SERVICE" # Filter service headers. These are not processed by FrostFS nodes and exist for service use only class EACLMatchType(Enum): @@ -117,7 +117,7 @@ class EACLRule: @allure.title("Get extended ACL") def get_eacl(wallet_path: str, cid: str, shell: Shell, endpoint: str) -> Optional[str]: - cli = NeofsCli(shell, NEOFS_CLI_EXEC, WALLET_CONFIG) + cli = FrostfsCli(shell, FROSTFS_CLI_EXEC, WALLET_CONFIG) try: result = cli.container.get_eacl(wallet=wallet_path, rpc_endpoint=endpoint, cid=cid) except RuntimeError as exc: @@ -138,7 +138,7 @@ def set_eacl( endpoint: str, session_token: Optional[str] = None, ) -> None: - cli = NeofsCli(shell, NEOFS_CLI_EXEC, WALLET_CONFIG) + cli = FrostfsCli(shell, FROSTFS_CLI_EXEC, WALLET_CONFIG) cli.container.set_eacl( wallet=wallet_path, rpc_endpoint=endpoint, @@ -156,7 +156,7 @@ def _encode_cid_for_eacl(cid: str) -> str: def create_eacl(cid: str, rules_list: List[EACLRule], shell: Shell) -> str: table_file_path = os.path.join(os.getcwd(), ASSETS_DIR, f"eacl_table_{str(uuid.uuid4())}.json") - cli = NeofsCli(shell, NEOFS_CLI_EXEC, WALLET_CONFIG) + cli = FrostfsCli(shell, FROSTFS_CLI_EXEC, WALLET_CONFIG) cli.acl.extended_create(cid=cid, out=table_file_path, rule=rules_list) with open(table_file_path, "r") as file: @@ -257,15 +257,17 @@ def eacl_rules(access: str, verbs: list, user: str) -> list[str]: def sign_bearer( shell: Shell, wallet_path: str, eacl_rules_file_from: str, eacl_rules_file_to: str, json: bool ) -> None: - neofscli = NeofsCli(shell=shell, neofs_cli_exec_path=NEOFS_CLI_EXEC, config_file=WALLET_CONFIG) - neofscli.util.sign_bearer_token( + frostfscli = FrostfsCli( + shell=shell, frostfs_cli_exec_path=FROSTFS_CLI_EXEC, config_file=WALLET_CONFIG + ) + frostfscli.util.sign_bearer_token( wallet=wallet_path, from_file=eacl_rules_file_from, to_file=eacl_rules_file_to, json=json ) @allure.title("Wait for eACL cache expired") def wait_for_cache_expired(): - sleep(NEOFS_CONTRACT_CACHE_TIMEOUT) + sleep(FROSTFS_CONTRACT_CACHE_TIMEOUT) return diff --git a/robot/resources/lib/python_keywords/cli_helpers.py b/robot/resources/lib/python_keywords/cli_helpers.py index 4fdcfb1..17d24eb 100644 --- a/robot/resources/lib/python_keywords/cli_helpers.py +++ b/robot/resources/lib/python_keywords/cli_helpers.py @@ -1,7 +1,7 @@ #!/usr/bin/python3.9 """ -Helper functions to use with `neofs-cli`, `neo-go` and other CLIs. +Helper functions to use with `frostfs-cli`, `neo-go` and other CLIs. """ import json import logging diff --git a/robot/resources/lib/python_keywords/complex_object_actions.py b/robot/resources/lib/python_keywords/complex_object_actions.py index fe58d36..bf1fe6b 100644 --- a/robot/resources/lib/python_keywords/complex_object_actions.py +++ b/robot/resources/lib/python_keywords/complex_object_actions.py @@ -14,11 +14,11 @@ import logging from typing import Optional, Tuple import allure -import neofs_verbs +import frostfs_verbs from cluster import Cluster, StorageNode from common import WALLET_CONFIG -from neofs_testlib.shell import Shell -from neofs_verbs import head_object +from frostfs_testlib.shell import Shell +from frostfs_verbs import head_object from storage_object import StorageObjectInfo logger = logging.getLogger("NeoLogger") @@ -122,7 +122,7 @@ def get_link_object( shell: executor for cli command nodes: list of nodes to do search on bearer (optional, str): path to Bearer token file - wallet_config (optional, str): path to the neofs-cli config file + wallet_config (optional, str): path to the frostfs-cli config file is_direct: send request directly to the node or not; this flag turns into `--ttl 1` key Returns: @@ -133,7 +133,7 @@ def get_link_object( for node in nodes: endpoint = node.get_rpc_endpoint() try: - resp = neofs_verbs.head_object( + resp = frostfs_verbs.head_object( wallet, cid, oid, @@ -172,7 +172,7 @@ def get_last_object( for node in nodes: endpoint = node.get_rpc_endpoint() try: - resp = neofs_verbs.head_object( + resp = frostfs_verbs.head_object( wallet, cid, oid, shell=shell, endpoint=endpoint, is_raw=True, is_direct=True ) if resp["lastPart"]: diff --git a/robot/resources/lib/python_keywords/container.py b/robot/resources/lib/python_keywords/container.py index 31c239f..812b4e3 100644 --- a/robot/resources/lib/python_keywords/container.py +++ b/robot/resources/lib/python_keywords/container.py @@ -1,7 +1,7 @@ #!/usr/bin/python3.9 """ - This module contains keywords that utilize `neofs-cli container` commands. + This module contains keywords that utilize `frostfs-cli container` commands. """ import json @@ -11,9 +11,9 @@ from typing import Optional, Union import allure import json_transformers -from common import NEOFS_CLI_EXEC, WALLET_CONFIG -from neofs_testlib.cli import NeofsCli -from neofs_testlib.shell import Shell +from common import FROSTFS_CLI_EXEC, WALLET_CONFIG +from frostfs_testlib.cli import FrostfsCli +from frostfs_testlib.shell import Shell logger = logging.getLogger("NeoLogger") @@ -38,7 +38,7 @@ def create_container( wait_for_creation: bool = True, ) -> str: """ - A wrapper for `neofs-cli container create` call. + A wrapper for `frostfs-cli container create` call. Args: wallet (str): a wallet on whose behalf a container is created @@ -52,7 +52,7 @@ def create_container( the session token; this parameter makes sense when paired with `session_token` shell: executor for cli command - endpoint: NeoFS endpoint to send request to, appends to `--rpc-endpoint` key + endpoint: FrostFS endpoint to send request to, appends to `--rpc-endpoint` key options (optional, dict): any other options to pass to the call name (optional, str): container name attribute await_mode (bool): block execution until container is persisted @@ -62,7 +62,7 @@ def create_container( (str): CID of the created container """ - cli = NeofsCli(shell, NEOFS_CLI_EXEC, WALLET_CONFIG) + cli = FrostfsCli(shell, FROSTFS_CLI_EXEC, WALLET_CONFIG) result = cli.container.create( rpc_endpoint=endpoint, wallet=session_wallet if session_wallet else wallet, @@ -117,16 +117,16 @@ def wait_for_container_deletion( @allure.step("List Containers") def list_containers(wallet: str, shell: Shell, endpoint: str) -> list[str]: """ - A wrapper for `neofs-cli container list` call. It returns all the + A wrapper for `frostfs-cli container list` call. It returns all the available containers for the given wallet. Args: wallet (str): a wallet on whose behalf we list the containers shell: executor for cli command - endpoint: NeoFS endpoint to send request to, appends to `--rpc-endpoint` key + endpoint: FrostFS endpoint to send request to, appends to `--rpc-endpoint` key Returns: (list): list of containers """ - cli = NeofsCli(shell, NEOFS_CLI_EXEC, WALLET_CONFIG) + cli = FrostfsCli(shell, FROSTFS_CLI_EXEC, WALLET_CONFIG) result = cli.container.list(rpc_endpoint=endpoint, wallet=wallet) logger.info(f"Containers: \n{result}") return result.stdout.split() @@ -141,19 +141,19 @@ def get_container( json_mode: bool = True, ) -> Union[dict, str]: """ - A wrapper for `neofs-cli container get` call. It extracts container's + A wrapper for `frostfs-cli container get` call. It extracts container's attributes and rearranges them into a more compact view. Args: wallet (str): path to a wallet on whose behalf we get the container cid (str): ID of the container to get shell: executor for cli command - endpoint: NeoFS endpoint to send request to, appends to `--rpc-endpoint` key + endpoint: FrostFS endpoint to send request to, appends to `--rpc-endpoint` key json_mode (bool): return container in JSON format Returns: (dict, str): dict of container attributes """ - cli = NeofsCli(shell, NEOFS_CLI_EXEC, WALLET_CONFIG) + cli = FrostfsCli(shell, FROSTFS_CLI_EXEC, WALLET_CONFIG) result = cli.container.get(rpc_endpoint=endpoint, wallet=wallet, cid=cid, json_mode=json_mode) if not json_mode: @@ -170,7 +170,7 @@ def get_container( @allure.step("Delete Container") # TODO: make the error message about a non-found container more user-friendly -# https://github.com/nspcc-dev/neofs-contract/issues/121 +# https://github.com/nspcc-dev/frostfs-contract/issues/121 def delete_container( wallet: str, cid: str, @@ -181,18 +181,18 @@ def delete_container( await_mode: bool = False, ) -> None: """ - A wrapper for `neofs-cli container delete` call. + A wrapper for `frostfs-cli container delete` call. Args: wallet (str): path to a wallet on whose behalf we delete the container cid (str): ID of the container to delete shell: executor for cli command - endpoint: NeoFS endpoint to send request to, appends to `--rpc-endpoint` key + endpoint: FrostFS endpoint to send request to, appends to `--rpc-endpoint` key force (bool): do not check whether container contains locks and remove immediately session_token: a path to session token file This function doesn't return anything. """ - cli = NeofsCli(shell, NEOFS_CLI_EXEC, WALLET_CONFIG) + cli = FrostfsCli(shell, FROSTFS_CLI_EXEC, WALLET_CONFIG) cli.container.delete( wallet=wallet, cid=cid, diff --git a/robot/resources/lib/python_keywords/container_access.py b/robot/resources/lib/python_keywords/container_access.py index 1e09406..67eb4c5 100644 --- a/robot/resources/lib/python_keywords/container_access.py +++ b/robot/resources/lib/python_keywords/container_access.py @@ -2,7 +2,7 @@ from typing import List, Optional from acl import EACLOperation from cluster import Cluster -from neofs_testlib.shell import Shell +from frostfs_testlib.shell import Shell from python_keywords.object_access import ( can_delete_object, can_get_head_object, diff --git a/robot/resources/lib/python_keywords/data_formatters.py b/robot/resources/lib/python_keywords/data_formatters.py index f3366c9..fd293fc 100644 --- a/robot/resources/lib/python_keywords/data_formatters.py +++ b/robot/resources/lib/python_keywords/data_formatters.py @@ -8,7 +8,7 @@ from neo3.wallet import wallet def dict_to_attrs(attrs: dict) -> str: """ This function takes a dictionary of object's attributes and converts them - into string. The string is passed to `--attributes` key of neofs-cli. + into string. The string is passed to `--attributes` key of frostfs-cli. Args: attrs (dict): object attributes in {"a": "b", "c": "d"} format. diff --git a/robot/resources/lib/python_keywords/epoch.py b/robot/resources/lib/python_keywords/epoch.py index 2a2dc75..889f50d 100644 --- a/robot/resources/lib/python_keywords/epoch.py +++ b/robot/resources/lib/python_keywords/epoch.py @@ -5,15 +5,15 @@ from typing import Optional import allure from cluster import Cluster, StorageNode from common import ( + FROSTFS_ADM_CONFIG_PATH, + FROSTFS_ADM_EXEC, + FROSTFS_CLI_EXEC, MAINNET_BLOCK_TIME, - NEOFS_ADM_CONFIG_PATH, - NEOFS_ADM_EXEC, - NEOFS_CLI_EXEC, NEOGO_EXECUTABLE, ) -from neofs_testlib.cli import NeofsAdm, NeofsCli, NeoGo -from neofs_testlib.shell import Shell -from neofs_testlib.utils.wallet import get_last_address_from_wallet +from frostfs_testlib.cli import FrostfsAdm, FrostfsCli, NeoGo +from frostfs_testlib.shell import Shell +from frostfs_testlib.utils.wallet import get_last_address_from_wallet from payment_neogo import get_contract_hash from test_control import wait_for_success from utility import parse_time @@ -53,7 +53,7 @@ def get_epoch(shell: Shell, cluster: Cluster, alive_node: Optional[StorageNode] wallet_path = alive_node.get_wallet_path() wallet_config = alive_node.get_wallet_config_path() - cli = NeofsCli(shell=shell, neofs_cli_exec_path=NEOFS_CLI_EXEC, config_file=wallet_config) + cli = FrostfsCli(shell=shell, frostfs_cli_exec_path=FROSTFS_CLI_EXEC, config_file=wallet_config) epoch = cli.netmap.epoch(endpoint, wallet_path) return int(epoch.stdout) @@ -62,7 +62,7 @@ def get_epoch(shell: Shell, cluster: Cluster, alive_node: Optional[StorageNode] @allure.step("Tick Epoch") def tick_epoch(shell: Shell, cluster: Cluster, alive_node: Optional[StorageNode] = None): """ - Tick epoch using neofs-adm or NeoGo if neofs-adm is not available (DevEnv) + Tick epoch using frostfs-adm or NeoGo if frostfs-adm is not available (DevEnv) Args: shell: local shell to make queries about current epoch. Remote shell will be used to tick new one cluster: cluster instance under test @@ -72,14 +72,14 @@ def tick_epoch(shell: Shell, cluster: Cluster, alive_node: Optional[StorageNode] alive_node = alive_node if alive_node else cluster.storage_nodes[0] remote_shell = alive_node.host.get_shell() - if NEOFS_ADM_EXEC and NEOFS_ADM_CONFIG_PATH: - # If neofs-adm is available, then we tick epoch with it (to be consistent with UAT tests) - neofsadm = NeofsAdm( + if FROSTFS_ADM_EXEC and FROSTFS_ADM_CONFIG_PATH: + # If frostfs-adm is available, then we tick epoch with it (to be consistent with UAT tests) + frostfsadm = FrostfsAdm( shell=remote_shell, - neofs_adm_exec_path=NEOFS_ADM_EXEC, - config_file=NEOFS_ADM_CONFIG_PATH, + frostfs_adm_exec_path=FROSTFS_ADM_EXEC, + config_file=FROSTFS_ADM_CONFIG_PATH, ) - neofsadm.morph.force_new_epoch() + frostfsadm.morph.force_new_epoch() return # Otherwise we tick epoch using transaction @@ -99,7 +99,7 @@ def tick_epoch(shell: Shell, cluster: Cluster, alive_node: Optional[StorageNode] neogo.contract.invokefunction( wallet=ir_wallet_path, wallet_password=ir_wallet_pass, - scripthash=get_contract_hash(morph_chain, "netmap.neofs", shell=shell), + scripthash=get_contract_hash(morph_chain, "netmap.frostfs", shell=shell), method="newEpoch", arguments=f"int:{cur_epoch + 1}", multisig_hash=f"{ir_address}:Global", diff --git a/robot/resources/lib/python_keywords/failover_utils.py b/robot/resources/lib/python_keywords/failover_utils.py index 118a772..0f86228 100644 --- a/robot/resources/lib/python_keywords/failover_utils.py +++ b/robot/resources/lib/python_keywords/failover_utils.py @@ -3,7 +3,7 @@ from time import sleep import allure from cluster import Cluster, StorageNode -from neofs_testlib.shell import Shell +from frostfs_testlib.shell import Shell from python_keywords.node_management import storage_node_healthcheck from storage_policy import get_nodes_with_object diff --git a/robot/resources/lib/python_keywords/neofs_verbs.py b/robot/resources/lib/python_keywords/frostfs_verbs.py similarity index 90% rename from robot/resources/lib/python_keywords/neofs_verbs.py rename to robot/resources/lib/python_keywords/frostfs_verbs.py index 2501dc4..8855d22 100644 --- a/robot/resources/lib/python_keywords/neofs_verbs.py +++ b/robot/resources/lib/python_keywords/frostfs_verbs.py @@ -8,9 +8,9 @@ from typing import Any, Optional import allure import json_transformers from cluster import Cluster -from common import ASSETS_DIR, NEOFS_CLI_EXEC, WALLET_CONFIG -from neofs_testlib.cli import NeofsCli -from neofs_testlib.shell import Shell +from common import ASSETS_DIR, FROSTFS_CLI_EXEC, WALLET_CONFIG +from frostfs_testlib.cli import FrostfsCli +from frostfs_testlib.shell import Shell logger = logging.getLogger("NeoLogger") @@ -30,7 +30,7 @@ def get_object_from_random_node( session: Optional[str] = None, ) -> str: """ - GET from NeoFS random storage node + GET from FrostFS random storage node Args: wallet: wallet on whose behalf GET is done @@ -39,7 +39,7 @@ def get_object_from_random_node( shell: executor for cli command bearer (optional, str): path to Bearer Token file, appends to `--bearer` key write_object (optional, str): path to downloaded file, appends to `--file` key - endpoint: NeoFS endpoint to send request to, appends to `--rpc-endpoint` key + endpoint: FrostFS endpoint to send request to, appends to `--rpc-endpoint` key wallet_config(optional, str): path to the wallet config no_progress(optional, bool): do not show progress bar xhdr (optional, dict): Request X-Headers in form of Key=Value @@ -78,7 +78,7 @@ def get_object( session: Optional[str] = None, ) -> str: """ - GET from NeoFS. + GET from FrostFS. Args: wallet (str): wallet on whose behalf GET is done @@ -87,7 +87,7 @@ def get_object( shell: executor for cli command bearer: path to Bearer Token file, appends to `--bearer` key write_object: path to downloaded file, appends to `--file` key - endpoint: NeoFS endpoint to send request to, appends to `--rpc-endpoint` key + endpoint: FrostFS endpoint to send request to, appends to `--rpc-endpoint` key wallet_config(optional, str): path to the wallet config no_progress(optional, bool): do not show progress bar xhdr (optional, dict): Request X-Headers in form of Key=Value @@ -100,7 +100,7 @@ def get_object( write_object = str(uuid.uuid4()) file_path = os.path.join(ASSETS_DIR, write_object) - cli = NeofsCli(shell, NEOFS_CLI_EXEC, wallet_config or WALLET_CONFIG) + cli = FrostfsCli(shell, FROSTFS_CLI_EXEC, wallet_config or WALLET_CONFIG) cli.object.get( rpc_endpoint=endpoint, wallet=wallet, @@ -140,14 +140,14 @@ def get_range_hash( bearer: path to Bearer Token file, appends to `--bearer` key range_cut: Range to take hash from in the form offset1:length1,..., value to pass to the `--range` parameter - endpoint: NeoFS endpoint to send request to, appends to `--rpc-endpoint` key + endpoint: FrostFS endpoint to send request to, appends to `--rpc-endpoint` key wallet_config: path to the wallet config xhdr: Request X-Headers in form of Key=Values session: Filepath to a JSON- or binary-encoded token of the object RANGEHASH session. Returns: None """ - cli = NeofsCli(shell, NEOFS_CLI_EXEC, wallet_config or WALLET_CONFIG) + cli = FrostfsCli(shell, FROSTFS_CLI_EXEC, wallet_config or WALLET_CONFIG) result = cli.object.hash( rpc_endpoint=endpoint, wallet=wallet, @@ -241,7 +241,7 @@ def put_object( shell: executor for cli command bearer: path to Bearer Token file, appends to `--bearer` key attributes: User attributes in form of Key1=Value1,Key2=Value2 - endpoint: NeoFS endpoint to send request to, appends to `--rpc-endpoint` key + endpoint: FrostFS endpoint to send request to, appends to `--rpc-endpoint` key wallet_config: path to the wallet config no_progress: do not show progress bar expire_at: Last epoch in the life of the object @@ -251,7 +251,7 @@ def put_object( (str): ID of uploaded Object """ - cli = NeofsCli(shell, NEOFS_CLI_EXEC, wallet_config or WALLET_CONFIG) + cli = FrostfsCli(shell, FROSTFS_CLI_EXEC, wallet_config or WALLET_CONFIG) result = cli.object.put( rpc_endpoint=endpoint, wallet=wallet, @@ -292,7 +292,7 @@ def delete_object( oid: ID of Object we are going to delete shell: executor for cli command bearer: path to Bearer Token file, appends to `--bearer` key - endpoint: NeoFS endpoint to send request to, appends to `--rpc-endpoint` key + endpoint: FrostFS endpoint to send request to, appends to `--rpc-endpoint` key wallet_config: path to the wallet config xhdr: Request X-Headers in form of Key=Value session: path to a JSON-encoded container session token @@ -300,7 +300,7 @@ def delete_object( (str): Tombstone ID """ - cli = NeofsCli(shell, NEOFS_CLI_EXEC, wallet_config or WALLET_CONFIG) + cli = FrostfsCli(shell, FROSTFS_CLI_EXEC, wallet_config or WALLET_CONFIG) result = cli.object.delete( rpc_endpoint=endpoint, wallet=wallet, @@ -338,7 +338,7 @@ def get_range( oid: ID of Object we are going to request range_cut: range to take data from in the form offset:length shell: executor for cli command - endpoint: NeoFS endpoint to send request to, appends to `--rpc-endpoint` key + endpoint: FrostFS endpoint to send request to, appends to `--rpc-endpoint` key bearer: path to Bearer Token file, appends to `--bearer` key wallet_config: path to the wallet config xhdr: Request X-Headers in form of Key=Value @@ -348,7 +348,7 @@ def get_range( """ range_file_path = os.path.join(ASSETS_DIR, str(uuid.uuid4())) - cli = NeofsCli(shell, NEOFS_CLI_EXEC, wallet_config or WALLET_CONFIG) + cli = FrostfsCli(shell, FROSTFS_CLI_EXEC, wallet_config or WALLET_CONFIG) cli.object.range( rpc_endpoint=endpoint, wallet=wallet, @@ -393,7 +393,7 @@ def lock_object( lifetime: Lock lifetime. expire_at: Lock expiration epoch. shell: executor for cli command - endpoint: NeoFS endpoint to send request to, appends to `--rpc-endpoint` key + endpoint: FrostFS endpoint to send request to, appends to `--rpc-endpoint` key session: Path to a JSON-encoded container session token. ttl: TTL value in request meta header (default 2). wallet: WIF (NEP-2) string or path to the wallet or binary key. @@ -403,7 +403,7 @@ def lock_object( Lock object ID """ - cli = NeofsCli(shell, NEOFS_CLI_EXEC, wallet_config or WALLET_CONFIG) + cli = FrostfsCli(shell, FROSTFS_CLI_EXEC, wallet_config or WALLET_CONFIG) result = cli.object.lock( rpc_endpoint=endpoint, lifetime=lifetime, @@ -447,7 +447,7 @@ def search_object( cid: ID of Container where we get the Object from shell: executor for cli command bearer: path to Bearer Token file, appends to `--bearer` key - endpoint: NeoFS endpoint to send request to, appends to `--rpc-endpoint` key + endpoint: FrostFS endpoint to send request to, appends to `--rpc-endpoint` key filters: key=value pairs to filter Objects expected_objects_list: a list of ObjectIDs to compare found Objects with wallet_config: path to the wallet config @@ -460,7 +460,7 @@ def search_object( list of found ObjectIDs """ - cli = NeofsCli(shell, NEOFS_CLI_EXEC, wallet_config or WALLET_CONFIG) + cli = FrostfsCli(shell, FROSTFS_CLI_EXEC, wallet_config or WALLET_CONFIG) result = cli.object.search( rpc_endpoint=endpoint, wallet=wallet, @@ -508,7 +508,7 @@ def get_netmap_netinfo( Args: wallet (str): wallet on whose behalf request is done shell: executor for cli command - endpoint (optional, str): NeoFS endpoint to send request to, appends to `--rpc-endpoint` key + endpoint (optional, str): FrostFS endpoint to send request to, appends to `--rpc-endpoint` key address: Address of wallet account ttl: TTL value in request meta header (default 2) wallet: Path to the wallet or binary key @@ -518,7 +518,7 @@ def get_netmap_netinfo( (dict): dict of parsed command output """ - cli = NeofsCli(shell, NEOFS_CLI_EXEC, wallet_config or WALLET_CONFIG) + cli = FrostfsCli(shell, FROSTFS_CLI_EXEC, wallet_config or WALLET_CONFIG) output = cli.netmap.netinfo( wallet=wallet, rpc_endpoint=endpoint, @@ -565,7 +565,7 @@ def head_object( oid (str): ObjectID to HEAD shell: executor for cli command bearer (optional, str): path to Bearer Token file, appends to `--bearer` key - endpoint(optional, str): NeoFS endpoint to send request to + endpoint(optional, str): FrostFS endpoint to send request to json_output(optional, bool): return response in JSON format or not; this flag turns into `--json` key is_raw(optional, bool): send "raw" request or not; this flag @@ -582,7 +582,7 @@ def head_object( (str): HEAD response as a plain text """ - cli = NeofsCli(shell, NEOFS_CLI_EXEC, wallet_config or WALLET_CONFIG) + cli = FrostfsCli(shell, FROSTFS_CLI_EXEC, wallet_config or WALLET_CONFIG) result = cli.object.head( rpc_endpoint=endpoint, wallet=wallet, diff --git a/robot/resources/lib/python_keywords/http_gate.py b/robot/resources/lib/python_keywords/http_gate.py index 99d92e7..68d9ca8 100644 --- a/robot/resources/lib/python_keywords/http_gate.py +++ b/robot/resources/lib/python_keywords/http_gate.py @@ -16,8 +16,8 @@ from cli_helpers import _cmd_run from cluster import StorageNode from common import SIMPLE_OBJECT_SIZE from file_helper import get_file_hash -from neofs_testlib.shell import Shell -from python_keywords.neofs_verbs import get_object +from frostfs_testlib.shell import Shell +from python_keywords.frostfs_verbs import get_object from python_keywords.storage_policy import get_nodes_without_object logger = logging.getLogger("NeoLogger") diff --git a/robot/resources/lib/python_keywords/json_transformers.py b/robot/resources/lib/python_keywords/json_transformers.py index 317383e..ac4ba56 100644 --- a/robot/resources/lib/python_keywords/json_transformers.py +++ b/robot/resources/lib/python_keywords/json_transformers.py @@ -1,5 +1,5 @@ """ - When doing requests to NeoFS, we get JSON output as an automatically decoded + When doing requests to FrostFS, we get JSON output as an automatically decoded structure from protobuf. Some fields are decoded with boilerplates and binary values are Base64-encoded. diff --git a/robot/resources/lib/python_keywords/node_management.py b/robot/resources/lib/python_keywords/node_management.py index 828735f..2a70880 100644 --- a/robot/resources/lib/python_keywords/node_management.py +++ b/robot/resources/lib/python_keywords/node_management.py @@ -7,10 +7,10 @@ from typing import Optional import allure from cluster import Cluster, StorageNode -from common import MORPH_BLOCK_TIME, NEOFS_CLI_EXEC +from common import FROSTFS_CLI_EXEC, MORPH_BLOCK_TIME from epoch import tick_epoch -from neofs_testlib.cli import NeofsCli -from neofs_testlib.shell import Shell +from frostfs_testlib.cli import FrostfsCli +from frostfs_testlib.shell import Shell from utility import parse_time logger = logging.getLogger("NeoLogger") @@ -107,7 +107,7 @@ def get_netmap_snapshot(node: StorageNode, shell: Shell) -> str: storage_wallet_config = node.get_wallet_config_path() storage_wallet_path = node.get_wallet_path() - cli = NeofsCli(shell, NEOFS_CLI_EXEC, config_file=storage_wallet_config) + cli = FrostfsCli(shell, FROSTFS_CLI_EXEC, config_file=storage_wallet_config) return cli.netmap.snapshot( rpc_endpoint=node.get_rpc_endpoint(), wallet=storage_wallet_path, @@ -187,7 +187,7 @@ def include_node_to_network_map( storage_node_set_status(node_to_include, status="online") # Per suggestion of @fyrchik we need to wait for 2 blocks after we set status and after tick epoch. - # First sleep can be omitted after https://github.com/nspcc-dev/neofs-node/issues/1790 complete. + # First sleep can be omitted after https://github.com/nspcc-dev/frostfs-node/issues/1790 complete. time.sleep(parse_time(MORPH_BLOCK_TIME) * 2) tick_epoch(shell, cluster) @@ -235,10 +235,10 @@ def _run_control_command(node: StorageNode, command: str) -> None: wallet_config = f'password: "{wallet_password}"' shell.exec(f"echo '{wallet_config}' > {wallet_config_path}") - cli_config = host.get_cli_config("neofs-cli") + cli_config = host.get_cli_config("frostfs-cli") # TODO: implement cli.control - # cli = NeofsCli(shell, cli_config.exec_path, wallet_config_path) + # cli = frostfsCli(shell, cli_config.exec_path, wallet_config_path) result = shell.exec( f"{cli_config.exec_path} {command} --endpoint {control_endpoint} " f"--wallet {wallet_path} --config {wallet_config_path}" diff --git a/robot/resources/lib/python_keywords/object_access.py b/robot/resources/lib/python_keywords/object_access.py index 79e8ba8..a358ecb 100644 --- a/robot/resources/lib/python_keywords/object_access.py +++ b/robot/resources/lib/python_keywords/object_access.py @@ -3,9 +3,9 @@ from typing import Optional import allure from cluster import Cluster from file_helper import get_file_hash +from frostfs_testlib.shell import Shell from grpc_responses import OBJECT_ACCESS_DENIED, error_matches_status -from neofs_testlib.shell import Shell -from python_keywords.neofs_verbs import ( +from python_keywords.frostfs_verbs import ( delete_object, get_object_from_random_node, get_range, diff --git a/robot/resources/lib/python_keywords/payment_neogo.py b/robot/resources/lib/python_keywords/payment_neogo.py index d347c4c..4efcd52 100644 --- a/robot/resources/lib/python_keywords/payment_neogo.py +++ b/robot/resources/lib/python_keywords/payment_neogo.py @@ -7,13 +7,13 @@ from typing import Optional import allure from cluster import MainChain, MorphChain -from common import GAS_HASH, MAINNET_BLOCK_TIME, NEOFS_CONTRACT, NEOGO_EXECUTABLE +from common import FROSTFS_CONTRACT, GAS_HASH, MAINNET_BLOCK_TIME, NEOGO_EXECUTABLE +from frostfs_testlib.cli import NeoGo +from frostfs_testlib.shell import Shell +from frostfs_testlib.utils.converters import contract_hash_to_address +from frostfs_testlib.utils.wallet import get_last_address_from_wallet from neo3.wallet import utils as neo3_utils from neo3.wallet import wallet as neo3_wallet -from neofs_testlib.cli import NeoGo -from neofs_testlib.shell import Shell -from neofs_testlib.utils.converters import contract_hash_to_address -from neofs_testlib.utils.wallet import get_last_address_from_wallet from utility import parse_time logger = logging.getLogger("NeoLogger") @@ -51,7 +51,7 @@ def withdraw_mainnet_gas(shell: Shell, main_chain: MainChain, wlt: str, amount: wallet=wlt, address=address, rpc_endpoint=main_chain.get_endpoint(), - scripthash=NEOFS_CONTRACT, + scripthash=FROSTFS_CONTRACT, method="withdraw", arguments=f"{scripthash} int:{amount}", multisig_hash=f"{scripthash}:Global", @@ -88,10 +88,10 @@ def transaction_accepted(main_chain: MainChain, tx_id: str): return False -@allure.step("Get NeoFS Balance") +@allure.step("Get FrostFS Balance") def get_balance(shell: Shell, morph_chain: MorphChain, wallet_path: str, wallet_password: str = ""): """ - This function returns NeoFS balance for given wallet. + This function returns FrostFS balance for given wallet. """ with open(wallet_path) as wallet_file: wallet = neo3_wallet.Wallet.from_json(json.load(wallet_file), password=wallet_password) @@ -99,7 +99,7 @@ def get_balance(shell: Shell, morph_chain: MorphChain, wallet_path: str, wallet_ payload = [{"type": "Hash160", "value": str(acc.script_hash)}] try: resp = morph_chain.rpc_client.invoke_function( - get_contract_hash(morph_chain, "balance.neofs", shell=shell), "balanceOf", payload + get_contract_hash(morph_chain, "balance.frostfs", shell=shell), "balanceOf", payload ) logger.info(f"Got response \n{resp}") value = int(resp["stack"][0]["value"]) @@ -166,7 +166,7 @@ def transfer_gas( time.sleep(parse_time(MAINNET_BLOCK_TIME)) -@allure.step("NeoFS Deposit") +@allure.step("FrostFS Deposit") def deposit_gas( shell: Shell, main_chain: MainChain, @@ -175,11 +175,11 @@ def deposit_gas( wallet_from_password: str, ): """ - Transferring GAS from given wallet to NeoFS contract address. + Transferring GAS from given wallet to FrostFS contract address. """ - # get NeoFS contract address - deposit_addr = contract_hash_to_address(NEOFS_CONTRACT) - logger.info(f"NeoFS contract address: {deposit_addr}") + # get FrostFS contract address + deposit_addr = contract_hash_to_address(FROSTFS_CONTRACT) + logger.info(f"FrostFS contract address: {deposit_addr}") address_from = get_last_address_from_wallet( wallet_path=wallet_from_path, wallet_password=wallet_from_password ) diff --git a/robot/resources/lib/python_keywords/storage_group.py b/robot/resources/lib/python_keywords/storage_group.py index 0309fec..1941fe7 100644 --- a/robot/resources/lib/python_keywords/storage_group.py +++ b/robot/resources/lib/python_keywords/storage_group.py @@ -1,17 +1,17 @@ """ This module contains keywords for work with Storage Groups. - It contains wrappers for `neofs-cli storagegroup` verbs. + It contains wrappers for `frostfs-cli storagegroup` verbs. """ import logging from typing import Optional import allure from cluster import Cluster -from common import NEOFS_CLI_EXEC, WALLET_CONFIG +from common import FROSTFS_CLI_EXEC, WALLET_CONFIG from complex_object_actions import get_link_object -from neofs_testlib.cli import NeofsCli -from neofs_testlib.shell import Shell -from neofs_verbs import head_object +from frostfs_testlib.cli import FrostfsCli +from frostfs_testlib.shell import Shell +from frostfs_verbs import head_object logger = logging.getLogger("NeoLogger") @@ -28,8 +28,8 @@ def put_storagegroup( lifetime: int = 10, ) -> str: """ - Wrapper for `neofs-cli storagegroup put`. Before the SG is created, - neofs-cli performs HEAD on `objects`, so this verb must be allowed + Wrapper for `frostfs-cli storagegroup put`. Before the SG is created, + frostfs-cli performs HEAD on `objects`, so this verb must be allowed for `wallet` in `cid`. Args: shell: Shell instance. @@ -38,12 +38,14 @@ def put_storagegroup( lifetime: Storage group lifetime in epochs. objects: List of Object IDs to include into the SG. bearer: Path to Bearer token file. - wallet_config: Path to neofs-cli config file. + wallet_config: Path to frostfs-cli config file. Returns: Object ID of created Storage Group. """ - neofscli = NeofsCli(shell=shell, neofs_cli_exec_path=NEOFS_CLI_EXEC, config_file=wallet_config) - result = neofscli.storagegroup.put( + frostfscli = FrostfsCli( + shell=shell, frostfs_cli_exec_path=FROSTFS_CLI_EXEC, config_file=wallet_config + ) + result = frostfscli.storagegroup.put( wallet=wallet, cid=cid, lifetime=lifetime, @@ -65,19 +67,21 @@ def list_storagegroup( wallet_config: str = WALLET_CONFIG, ) -> list: """ - Wrapper for `neofs-cli storagegroup list`. This operation + Wrapper for `frostfs-cli storagegroup list`. This operation requires SEARCH allowed for `wallet` in `cid`. Args: shell: Shell instance. wallet: Path to wallet on whose behalf the SGs are listed in the container cid: ID of Container to list. bearer: Path to Bearer token file. - wallet_config: Path to neofs-cli config file. + wallet_config: Path to frostfs-cli config file. Returns: Object IDs of found Storage Groups. """ - neofscli = NeofsCli(shell=shell, neofs_cli_exec_path=NEOFS_CLI_EXEC, config_file=wallet_config) - result = neofscli.storagegroup.list( + frostfscli = FrostfsCli( + shell=shell, frostfs_cli_exec_path=FROSTFS_CLI_EXEC, config_file=wallet_config + ) + result = frostfscli.storagegroup.list( wallet=wallet, cid=cid, bearer=bearer, @@ -99,19 +103,21 @@ def get_storagegroup( wallet_config: str = WALLET_CONFIG, ) -> dict: """ - Wrapper for `neofs-cli storagegroup get`. + Wrapper for `frostfs-cli storagegroup get`. Args: shell: Shell instance. wallet: Path to wallet on whose behalf the SG is got. cid: ID of Container where SG is stored. gid: ID of the Storage Group. bearer: Path to Bearer token file. - wallet_config: Path to neofs-cli config file. + wallet_config: Path to frostfs-cli config file. Returns: Detailed information on the Storage Group. """ - neofscli = NeofsCli(shell=shell, neofs_cli_exec_path=NEOFS_CLI_EXEC, config_file=wallet_config) - result = neofscli.storagegroup.get( + frostfscli = FrostfsCli( + shell=shell, frostfs_cli_exec_path=FROSTFS_CLI_EXEC, config_file=wallet_config + ) + result = frostfscli.storagegroup.get( wallet=wallet, cid=cid, bearer=bearer, @@ -120,7 +126,7 @@ def get_storagegroup( ) # TODO: temporary solution for parsing output. Needs to be replaced with - # JSON parsing when https://github.com/nspcc-dev/neofs-node/issues/1355 + # JSON parsing when https://github.com/nspcc-dev/frostfs-node/issues/1355 # is done. strings = result.stdout.strip().split("\n") # first three strings go to `data`; @@ -148,19 +154,21 @@ def delete_storagegroup( wallet_config: str = WALLET_CONFIG, ) -> str: """ - Wrapper for `neofs-cli storagegroup delete`. + Wrapper for `frostfs-cli storagegroup delete`. Args: shell: Shell instance. wallet: Path to wallet on whose behalf the SG is deleted. cid: ID of Container where SG is stored. gid: ID of the Storage Group. bearer: Path to Bearer token file. - wallet_config: Path to neofs-cli config file. + wallet_config: Path to frostfs-cli config file. Returns: Tombstone ID of the deleted Storage Group. """ - neofscli = NeofsCli(shell=shell, neofs_cli_exec_path=NEOFS_CLI_EXEC, config_file=wallet_config) - result = neofscli.storagegroup.delete( + frostfscli = FrostfsCli( + shell=shell, frostfs_cli_exec_path=FROSTFS_CLI_EXEC, config_file=wallet_config + ) + result = frostfscli.storagegroup.delete( wallet=wallet, cid=cid, bearer=bearer, diff --git a/robot/resources/lib/python_keywords/storage_policy.py b/robot/resources/lib/python_keywords/storage_policy.py index 4e0492b..ff75e39 100644 --- a/robot/resources/lib/python_keywords/storage_policy.py +++ b/robot/resources/lib/python_keywords/storage_policy.py @@ -10,10 +10,10 @@ from typing import List import allure import complex_object_actions -import neofs_verbs +import frostfs_verbs from cluster import StorageNode +from frostfs_testlib.shell import Shell from grpc_responses import OBJECT_NOT_FOUND, error_matches_status -from neofs_testlib.shell import Shell logger = logging.getLogger("NeoLogger") @@ -66,7 +66,7 @@ def get_simple_object_copies( copies = 0 for node in nodes: try: - response = neofs_verbs.head_object( + response = frostfs_verbs.head_object( wallet, cid, oid, shell=shell, endpoint=node.get_rpc_endpoint(), is_direct=True ) if response: @@ -123,7 +123,7 @@ def get_nodes_with_object( wallet = node.get_wallet_path() wallet_config = node.get_wallet_config_path() try: - res = neofs_verbs.head_object( + res = frostfs_verbs.head_object( wallet, cid, oid, @@ -160,7 +160,7 @@ def get_nodes_without_object( nodes_list = [] for node in nodes: try: - res = neofs_verbs.head_object( + res = frostfs_verbs.head_object( wallet, cid, oid, shell=shell, endpoint=node.get_rpc_endpoint(), is_direct=True ) if res is None: diff --git a/robot/resources/lib/python_keywords/tombstone.py b/robot/resources/lib/python_keywords/tombstone.py index 096356e..a363040 100644 --- a/robot/resources/lib/python_keywords/tombstone.py +++ b/robot/resources/lib/python_keywords/tombstone.py @@ -2,9 +2,9 @@ import json import logging import allure +from frostfs_testlib.shell import Shell +from frostfs_verbs import head_object from neo3.wallet import wallet -from neofs_testlib.shell import Shell -from neofs_verbs import head_object logger = logging.getLogger("NeoLogger") diff --git a/robot/variables/common.py b/robot/variables/common.py index 1dda2dc..1f81786 100644 --- a/robot/variables/common.py +++ b/robot/variables/common.py @@ -11,7 +11,7 @@ COMPLEX_OBJECT_TAIL_SIZE = os.getenv("COMPLEX_OBJECT_TAIL_SIZE", "1000") MAINNET_BLOCK_TIME = os.getenv("MAINNET_BLOCK_TIME", "1s") MAINNET_TIMEOUT = os.getenv("MAINNET_TIMEOUT", "1min") MORPH_BLOCK_TIME = os.getenv("MORPH_BLOCK_TIME", "1s") -NEOFS_CONTRACT_CACHE_TIMEOUT = os.getenv("NEOFS_CONTRACT_CACHE_TIMEOUT", "30s") +FROSTFS_CONTRACT_CACHE_TIMEOUT = os.getenv("FROSTFS_CONTRACT_CACHE_TIMEOUT", "30s") # Time interval that allows a GC pass on storage node (this includes GC sleep interval # of 1min plus 15 seconds for GC pass itself) @@ -19,10 +19,10 @@ STORAGE_GC_TIME = os.getenv("STORAGE_GC_TIME", "75s") GAS_HASH = os.getenv("GAS_HASH", "0xd2a4cff31913016155e38e474a2c06d08be276cf") -NEOFS_CONTRACT = os.getenv("NEOFS_IR_CONTRACTS_NEOFS") +FROSTFS_CONTRACT = os.getenv("FROSTFS_IR_CONTRACTS_FROSTFS") ASSETS_DIR = os.getenv("ASSETS_DIR", "TemporaryDir") -DEVENV_PATH = os.getenv("DEVENV_PATH", os.path.join("..", "neofs-dev-env")) +DEVENV_PATH = os.getenv("DEVENV_PATH", os.path.join("..", "frostfs-dev-env")) # Password of wallet owned by user on behalf of whom we are running tests WALLET_PASS = os.getenv("WALLET_PASS", "") @@ -30,12 +30,12 @@ WALLET_PASS = os.getenv("WALLET_PASS", "") # Paths to CLI executables on machine that runs tests NEOGO_EXECUTABLE = os.getenv("NEOGO_EXECUTABLE", "neo-go") -NEOFS_CLI_EXEC = os.getenv("NEOFS_CLI_EXEC", "neofs-cli") -NEOFS_AUTHMATE_EXEC = os.getenv("NEOFS_AUTHMATE_EXEC", "neofs-authmate") -NEOFS_ADM_EXEC = os.getenv("NEOFS_ADM_EXEC", "neofs-adm") +FROSTFS_CLI_EXEC = os.getenv("FROSTFS_CLI_EXEC", "frostfs-cli") +FROSTFS_AUTHMATE_EXEC = os.getenv("FROSTFS_AUTHMATE_EXEC", "frostfs-authmate") +FROSTFS_ADM_EXEC = os.getenv("FROSTFS_ADM_EXEC", "frostfs-adm") -# Config for neofs-adm utility. Optional if tests are running against devenv -NEOFS_ADM_CONFIG_PATH = os.getenv("NEOFS_ADM_CONFIG_PATH") +# Config for frostfs-adm utility. Optional if tests are running against devenv +FROSTFS_ADM_CONFIG_PATH = os.getenv("FROSTFS_ADM_CONFIG_PATH") FREE_STORAGE = os.getenv("FREE_STORAGE", "false").lower() == "true" BIN_VERSIONS_FILE = os.getenv("BIN_VERSIONS_FILE") diff --git a/venv/local-pytest/environment.sh b/venv/local-pytest/environment.sh index ff17637..4a08be5 100644 --- a/venv/local-pytest/environment.sh +++ b/venv/local-pytest/environment.sh @@ -1,6 +1,6 @@ # DevEnv variables export NEOFS_MORPH_DISABLE_CACHE=true -export DEVENV_PATH="${DEVENV_PATH:-${VIRTUAL_ENV}/../../neofs-dev-env}" +export DEVENV_PATH="${DEVENV_PATH:-${VIRTUAL_ENV}/../../frostfs-dev-env}" pushd $DEVENV_PATH > /dev/null export `make env` popd > /dev/null