Move shared code to testlib
Signed-off-by: Andrey Berezin <a.berezin@yadro.com>
This commit is contained in:
parent
b13f0ec33d
commit
c77123f301
78 changed files with 1384 additions and 8768 deletions
|
@ -1,45 +1,33 @@
|
|||
import logging
|
||||
import os
|
||||
import shutil
|
||||
import uuid
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
|
||||
import allure
|
||||
import pytest
|
||||
import yaml
|
||||
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 import wallet_utils
|
||||
|
||||
from pytest_tests.helpers import binary_version, env_properties
|
||||
from pytest_tests.helpers.cluster import Cluster
|
||||
from pytest_tests.helpers.frostfs_verbs import get_netmap_netinfo
|
||||
from pytest_tests.helpers.k6 import LoadParams
|
||||
from pytest_tests.helpers.node_management import storage_node_healthcheck
|
||||
from pytest_tests.helpers.payment_neogo import deposit_gas, transfer_gas
|
||||
from pytest_tests.helpers.wallet import WalletFactory
|
||||
from pytest_tests.resources.common import (
|
||||
from frostfs_testlib.resources.common import (
|
||||
ASSETS_DIR,
|
||||
COMPLEX_OBJECT_CHUNKS_COUNT,
|
||||
COMPLEX_OBJECT_TAIL_SIZE,
|
||||
FREE_STORAGE,
|
||||
HOSTING_CONFIG_FILE,
|
||||
DEFAULT_WALLET_PASS,
|
||||
SIMPLE_OBJECT_SIZE,
|
||||
STORAGE_NODE_SERVICE_NAME_REGEX,
|
||||
TEST_CYCLES_COUNT,
|
||||
WALLET_PASS,
|
||||
)
|
||||
from pytest_tests.resources.load_params import (
|
||||
BACKGROUND_LOAD_MAX_TIME,
|
||||
BACKGROUND_OBJ_SIZE,
|
||||
BACKGROUND_READERS_COUNT,
|
||||
BACKGROUND_WRITERS_COUNT,
|
||||
LOAD_NODE_SSH_PRIVATE_KEY_PATH,
|
||||
LOAD_NODE_SSH_USER,
|
||||
LOAD_NODES,
|
||||
)
|
||||
from pytest_tests.steps.load import get_services_endpoints, prepare_k6_instances
|
||||
from frostfs_testlib.s3.interfaces import S3ClientWrapper, VersioningStatus
|
||||
from frostfs_testlib.shell import LocalShell, Shell
|
||||
from frostfs_testlib.steps.cli.container import list_containers
|
||||
from frostfs_testlib.steps.cli.object import get_netmap_netinfo
|
||||
from frostfs_testlib.steps.node_management import storage_node_healthcheck
|
||||
from frostfs_testlib.steps.s3 import s3_helper
|
||||
from frostfs_testlib.storage.cluster import Cluster
|
||||
from frostfs_testlib.storage.dataclasses.wallet import WalletFactory
|
||||
from frostfs_testlib.testing.cluster_test_base import ClusterTestBase
|
||||
from frostfs_testlib.utils import env_utils, version_utils
|
||||
|
||||
from pytest_tests.resources.common import HOSTING_CONFIG_FILE, TEST_CYCLES_COUNT
|
||||
|
||||
logger = logging.getLogger("NeoLogger")
|
||||
|
||||
|
@ -81,6 +69,7 @@ def pytest_generate_tests(metafunc: pytest.Metafunc):
|
|||
@pytest.fixture(scope="session")
|
||||
def configure_testlib():
|
||||
get_reporter().register_handler(AllureHandler())
|
||||
logging.getLogger("paramiko").setLevel(logging.INFO)
|
||||
yield
|
||||
|
||||
|
||||
|
@ -139,25 +128,95 @@ def wallet_factory(temp_directory: str, client_shell: Shell, cluster: Cluster) -
|
|||
|
||||
|
||||
@pytest.fixture(scope="session")
|
||||
def cluster(temp_directory: str, hosting: Hosting) -> Cluster:
|
||||
def cluster(temp_directory: str, hosting: Hosting, client_shell: Shell) -> Cluster:
|
||||
cluster = Cluster(hosting)
|
||||
if cluster.is_local_devevn():
|
||||
if cluster.is_local_devenv():
|
||||
cluster.create_wallet_configs(hosting)
|
||||
|
||||
ClusterTestBase.shell = client_shell
|
||||
ClusterTestBase.cluster = cluster
|
||||
|
||||
yield cluster
|
||||
|
||||
|
||||
@allure.step("[Class]: Provide S3 policy")
|
||||
@pytest.fixture(scope="class")
|
||||
def s3_policy(request: pytest.FixtureRequest):
|
||||
policy = None
|
||||
if "param" in request.__dict__:
|
||||
policy = request.param
|
||||
|
||||
return policy
|
||||
|
||||
|
||||
@allure.step("[Class]: Create S3 client")
|
||||
@pytest.fixture(scope="class")
|
||||
def s3_client(
|
||||
default_wallet: str,
|
||||
client_shell: Shell,
|
||||
s3_policy: Optional[str],
|
||||
cluster: Cluster,
|
||||
request: pytest.FixtureRequest,
|
||||
) -> S3ClientWrapper:
|
||||
s3_bearer_rules_file = f"{os.getcwd()}/pytest_tests/resources/files/s3_bearer_rules.json"
|
||||
|
||||
(cid, access_key_id, secret_access_key) = s3_helper.init_s3_credentials(
|
||||
default_wallet, cluster, s3_bearer_rules_file=s3_bearer_rules_file, policy=s3_policy
|
||||
)
|
||||
containers_list = list_containers(
|
||||
default_wallet, shell=client_shell, endpoint=cluster.default_rpc_endpoint
|
||||
)
|
||||
assert cid in containers_list, f"Expected cid {cid} in {containers_list}"
|
||||
|
||||
s3_client_cls = request.param
|
||||
client = s3_client_cls(access_key_id, secret_access_key, cluster.default_s3_gate_endpoint)
|
||||
yield client
|
||||
|
||||
|
||||
@allure.step("Create/delete bucket")
|
||||
@pytest.fixture
|
||||
def bucket(s3_client: S3ClientWrapper, request: pytest.FixtureRequest):
|
||||
bucket_name = s3_client.create_bucket()
|
||||
|
||||
versioning_status: Optional[VersioningStatus] = None
|
||||
if "param" in request.__dict__:
|
||||
versioning_status = request.param
|
||||
|
||||
if versioning_status:
|
||||
s3_helper.set_bucket_versioning(s3_client, bucket_name, versioning_status)
|
||||
|
||||
yield bucket_name
|
||||
s3_helper.delete_bucket_with_objects(s3_client, bucket_name)
|
||||
|
||||
|
||||
@allure.step("Create two buckets")
|
||||
@pytest.fixture
|
||||
def two_buckets(s3_client: S3ClientWrapper):
|
||||
bucket_1 = s3_client.create_bucket()
|
||||
bucket_2 = s3_client.create_bucket()
|
||||
yield bucket_1, bucket_2
|
||||
for bucket_name in [bucket_1, bucket_2]:
|
||||
s3_helper.delete_bucket_with_objects(s3_client, bucket_name)
|
||||
|
||||
|
||||
@allure.step("Check binary versions")
|
||||
@pytest.fixture(scope="session", autouse=True)
|
||||
@allure.title("Check binary versions")
|
||||
def check_binary_versions(request, hosting: Hosting, client_shell: Shell):
|
||||
local_versions = binary_version.get_local_binaries_versions(client_shell)
|
||||
remote_versions = binary_version.get_remote_binaries_versions(hosting)
|
||||
def check_binary_versions(hosting: Hosting, client_shell: Shell, request: pytest.FixtureRequest):
|
||||
local_versions = version_utils.get_local_binaries_versions(client_shell)
|
||||
remote_versions = version_utils.get_remote_binaries_versions(hosting)
|
||||
|
||||
all_versions = {**local_versions, **remote_versions}
|
||||
env_properties.save_env_properties(request.config, all_versions)
|
||||
|
||||
environment_dir = request.config.getoption("--alluredir")
|
||||
if not environment_dir:
|
||||
return None
|
||||
|
||||
file_path = f"{environment_dir}/environment.properties"
|
||||
env_utils.save_env_properties(file_path, all_versions)
|
||||
|
||||
|
||||
@allure.step("Prepare tmp directory")
|
||||
@pytest.fixture(scope="session")
|
||||
@allure.title("Prepare tmp directory")
|
||||
def temp_directory():
|
||||
with allure.step("Prepare tmp directory"):
|
||||
full_path = os.path.join(os.getcwd(), ASSETS_DIR)
|
||||
|
@ -177,8 +236,8 @@ def session_start_time():
|
|||
return start_time
|
||||
|
||||
|
||||
@allure.step("Run health check for all storage nodes")
|
||||
@pytest.fixture(scope="session", autouse=True)
|
||||
@allure.title("Run health check for all storage nodes")
|
||||
def run_health_check(session_start_time, cluster: Cluster):
|
||||
failed_nodes = []
|
||||
for node in cluster.storage_nodes:
|
||||
|
@ -190,94 +249,9 @@ def run_health_check(session_start_time, cluster: Cluster):
|
|||
raise AssertionError(f"Nodes {failed_nodes} are not healthy")
|
||||
|
||||
|
||||
@allure.step("Prepare wallet and deposit")
|
||||
@pytest.fixture(scope="session")
|
||||
def background_grpc_load(client_shell: Shell, hosting: Hosting):
|
||||
registry_file = os.path.join("/tmp/", f"{str(uuid.uuid4())}.bolt")
|
||||
prepare_file = os.path.join("/tmp/", f"{str(uuid.uuid4())}.json")
|
||||
allure.dynamic.title(
|
||||
f"Start background load with parameters: "
|
||||
f"writers = {BACKGROUND_WRITERS_COUNT}, "
|
||||
f"obj_size = {BACKGROUND_OBJ_SIZE}, "
|
||||
f"load_time = {BACKGROUND_LOAD_MAX_TIME}"
|
||||
f"prepare_json = {prepare_file}"
|
||||
)
|
||||
with allure.step("Get endpoints"):
|
||||
endpoints_list = get_services_endpoints(
|
||||
hosting=hosting,
|
||||
service_name_regex=STORAGE_NODE_SERVICE_NAME_REGEX,
|
||||
endpoint_attribute="rpc_endpoint",
|
||||
)
|
||||
endpoints = ",".join(endpoints_list)
|
||||
load_params = LoadParams(
|
||||
endpoint=endpoints,
|
||||
obj_size=BACKGROUND_OBJ_SIZE,
|
||||
registry_file=registry_file,
|
||||
containers_count=1,
|
||||
obj_count=0,
|
||||
out_file=prepare_file,
|
||||
readers=0,
|
||||
writers=BACKGROUND_WRITERS_COUNT,
|
||||
deleters=0,
|
||||
load_time=BACKGROUND_LOAD_MAX_TIME,
|
||||
load_type="grpc",
|
||||
)
|
||||
k6_load_instances = prepare_k6_instances(
|
||||
load_nodes=LOAD_NODES,
|
||||
login=LOAD_NODE_SSH_USER,
|
||||
pkey=LOAD_NODE_SSH_PRIVATE_KEY_PATH,
|
||||
load_params=load_params,
|
||||
)
|
||||
with allure.step("Run background load"):
|
||||
for k6_load_instance in k6_load_instances:
|
||||
k6_load_instance.start()
|
||||
yield
|
||||
with allure.step("Stop background load"):
|
||||
for k6_load_instance in k6_load_instances:
|
||||
k6_load_instance.stop()
|
||||
with allure.step("Verify background load data"):
|
||||
verify_params = LoadParams(
|
||||
endpoint=endpoints,
|
||||
clients=BACKGROUND_READERS_COUNT,
|
||||
registry_file=registry_file,
|
||||
load_time=BACKGROUND_LOAD_MAX_TIME,
|
||||
load_type="verify",
|
||||
)
|
||||
k6_verify_instances = prepare_k6_instances(
|
||||
load_nodes=LOAD_NODES,
|
||||
login=LOAD_NODE_SSH_USER,
|
||||
pkey=LOAD_NODE_SSH_PRIVATE_KEY_PATH,
|
||||
load_params=verify_params,
|
||||
prepare=False,
|
||||
)
|
||||
with allure.step("Run verify background load data"):
|
||||
for k6_verify_instance in k6_verify_instances:
|
||||
k6_verify_instance.start()
|
||||
k6_verify_instance.wait_until_finished(BACKGROUND_LOAD_MAX_TIME)
|
||||
|
||||
|
||||
@pytest.fixture(scope="session")
|
||||
@allure.title("Prepare wallet and deposit")
|
||||
def default_wallet(client_shell: Shell, temp_directory: str, cluster: Cluster):
|
||||
wallet_path = os.path.join(os.getcwd(), ASSETS_DIR, f"{str(uuid.uuid4())}.json")
|
||||
wallet_utils.init_wallet(wallet_path, WALLET_PASS)
|
||||
allure.attach.file(wallet_path, os.path.basename(wallet_path), allure.attachment_type.JSON)
|
||||
|
||||
if not FREE_STORAGE:
|
||||
main_chain = cluster.main_chain_nodes[0]
|
||||
deposit = 30
|
||||
transfer_gas(
|
||||
shell=client_shell,
|
||||
amount=deposit + 1,
|
||||
main_chain=main_chain,
|
||||
wallet_to_path=wallet_path,
|
||||
wallet_to_password=WALLET_PASS,
|
||||
)
|
||||
deposit_gas(
|
||||
shell=client_shell,
|
||||
main_chain=main_chain,
|
||||
amount=deposit,
|
||||
wallet_from_path=wallet_path,
|
||||
wallet_from_password=WALLET_PASS,
|
||||
)
|
||||
|
||||
return wallet_path
|
||||
def default_wallet(wallet_factory: WalletFactory) -> str:
|
||||
wallet = wallet_factory.create_wallet(password=DEFAULT_WALLET_PASS)
|
||||
allure.attach.file(wallet.path, os.path.basename(wallet.path), allure.attachment_type.JSON)
|
||||
return wallet.path
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue