forked from TrueCloudLab/frostfs-testcases
[#252] Refactor version checks
Signed-off-by: a.berezin <a.berezin@yadro.com>
This commit is contained in:
parent
b8d5706515
commit
439a5595f8
2 changed files with 29 additions and 59 deletions
|
@ -354,15 +354,20 @@ def two_buckets(s3_client: S3ClientWrapper, request: pytest.FixtureRequest):
|
||||||
s3_helper.delete_bucket_with_objects(s3_client, bucket_name)
|
s3_helper.delete_bucket_with_objects(s3_client, bucket_name)
|
||||||
|
|
||||||
|
|
||||||
@allure.title("[Autouse/Session] Check binary versions")
|
@allure.title("[Autouse/Session] Collect binary versions")
|
||||||
@pytest.fixture(scope="session", autouse=True)
|
@pytest.fixture(scope="session", autouse=True)
|
||||||
def check_binary_versions(hosting: Hosting, client_shell: Shell, request: pytest.FixtureRequest):
|
def collect_binary_versions(hosting: Hosting, client_shell: Shell, request: pytest.FixtureRequest):
|
||||||
local_versions = version_utils.get_local_binaries_versions(client_shell)
|
local_versions = version_utils.get_local_binaries_versions(client_shell)
|
||||||
remote_versions, exсeptions_remote_binaries_versions = version_utils.get_remote_binaries_versions(hosting)
|
remote_versions = version_utils.get_remote_binaries_versions(hosting)
|
||||||
|
remote_versions_keys = list(remote_versions.keys())
|
||||||
|
|
||||||
all_versions = {
|
all_versions = {
|
||||||
**local_versions,
|
**local_versions,
|
||||||
**{binary_name: binary["version"] for binary_name, binary in remote_versions.items()},
|
**{
|
||||||
|
f"{name}_{remote_versions_keys.index(host) + 1:02d}": version
|
||||||
|
for host, versions in remote_versions.items()
|
||||||
|
for name, version in versions.items()
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
environment_dir = request.config.getoption("--alluredir")
|
environment_dir = request.config.getoption("--alluredir")
|
||||||
|
|
|
@ -1,77 +1,42 @@
|
||||||
import logging
|
import logging
|
||||||
import os
|
from re import fullmatch
|
||||||
from http import HTTPStatus
|
|
||||||
from re import fullmatch, match
|
|
||||||
|
|
||||||
import allure
|
import allure
|
||||||
import pytest
|
import pytest
|
||||||
import requests
|
|
||||||
from frostfs_testlib import reporter
|
from frostfs_testlib import reporter
|
||||||
from frostfs_testlib.hosting import Hosting
|
from frostfs_testlib.hosting import Hosting
|
||||||
from frostfs_testlib.resources.common import ASSETS_DIR
|
|
||||||
from frostfs_testlib.utils.env_utils import read_env_properties, save_env_properties
|
|
||||||
from frostfs_testlib.utils.version_utils import get_remote_binaries_versions
|
from frostfs_testlib.utils.version_utils import get_remote_binaries_versions
|
||||||
from pytest import FixtureRequest
|
|
||||||
|
|
||||||
logger = logging.getLogger("NeoLogger")
|
logger = logging.getLogger("NeoLogger")
|
||||||
|
|
||||||
|
VERSION_REGEX = r"^([a-zA-Z0-9]*/)?\d+\.\d+\.\d+(-.*)?(?<!dirty)"
|
||||||
|
VERSION_ERROR_MSG = "{name} [{host}]: Actual version doesn't conform to format '0.0.0-000-aaaaaaa': {version}"
|
||||||
|
|
||||||
|
|
||||||
|
def _check_version_format(version):
|
||||||
|
return fullmatch(VERSION_REGEX, version)
|
||||||
|
|
||||||
|
|
||||||
@allure.title("Check binaries versions")
|
@allure.title("Check binaries versions")
|
||||||
@pytest.mark.check_binaries
|
@pytest.mark.check_binaries
|
||||||
def test_binaries_versions(request: FixtureRequest, hosting: Hosting):
|
def test_binaries_versions(hosting: Hosting):
|
||||||
"""
|
"""
|
||||||
Compare binaries versions from external source (url) and deployed on servers.
|
Compare binaries versions from external source (url) and deployed on servers.
|
||||||
"""
|
"""
|
||||||
with reporter.step("Get binaries versions from servers"):
|
with reporter.step("Get binaries versions from servers"):
|
||||||
got_versions, exсeptions_remote_binaries_versions = get_remote_binaries_versions(hosting)
|
versions_by_host = get_remote_binaries_versions(hosting)
|
||||||
|
|
||||||
environment_dir = request.config.getoption("--alluredir") or ASSETS_DIR
|
|
||||||
env_file = os.path.join(environment_dir, "environment.properties")
|
|
||||||
env_properties = read_env_properties(env_file)
|
|
||||||
|
|
||||||
# compare versions from servers and file
|
|
||||||
exсeptions = []
|
exсeptions = []
|
||||||
additional_env_properties = {}
|
|
||||||
|
|
||||||
for binary_name, binary in got_versions.items():
|
last_host, versions_on_last_host = versions_by_host.popitem()
|
||||||
version = binary["version"]
|
for name, version in versions_on_last_host.items():
|
||||||
requires_check = binary["check"]
|
for host, versions_on_host in versions_by_host.items():
|
||||||
if requires_check and not fullmatch(r"^\d+\.\d+\.\d+(-.*)?(?<!dirty)", version):
|
if versions_on_host[name] != version:
|
||||||
exсeptions.append(f"{binary_name}: Actual version doesn't conform to format '0.0.0-000-aaaaaaa': {version}")
|
exсeptions.append(f"Binary of {name} has inconsistent version {versions_on_host[name]} on host {host}")
|
||||||
|
if not _check_version_format(versions_on_host[name]):
|
||||||
|
exсeptions.append(VERSION_ERROR_MSG.format(name=name, host=host, version=version))
|
||||||
|
|
||||||
# If some binary was not listed in the env properties file, let's add it
|
if not _check_version_format(version):
|
||||||
# so that we have full information about versions in allure report
|
exсeptions.append(VERSION_ERROR_MSG.format(name=name, host=last_host, version=version))
|
||||||
if env_properties and binary_name not in env_properties:
|
|
||||||
additional_env_properties[binary_name] = version
|
|
||||||
|
|
||||||
if env_properties and additional_env_properties:
|
assert not exсeptions, "\n".join(exсeptions)
|
||||||
save_env_properties(env_file, additional_env_properties)
|
|
||||||
|
|
||||||
exсeptions.extend(exсeptions_remote_binaries_versions)
|
|
||||||
|
|
||||||
# create clear beautiful error with aggregation info
|
|
||||||
if exсeptions:
|
|
||||||
msg = "\n".join(exсeptions)
|
|
||||||
raise AssertionError(f"Found binaries with unexpected versions:\n{msg}")
|
|
||||||
|
|
||||||
|
|
||||||
@reporter.step("Download versions info from {url}")
|
|
||||||
def download_versions_info(url: str) -> dict:
|
|
||||||
binaries_to_version = {}
|
|
||||||
|
|
||||||
response = requests.get(url)
|
|
||||||
|
|
||||||
assert response.status_code == HTTPStatus.OK, f"Got {response.status_code} code. Content {response.json()}"
|
|
||||||
|
|
||||||
content = response.text
|
|
||||||
assert content, f"Expected file with content, got {response}"
|
|
||||||
|
|
||||||
for line in content.split("\n"):
|
|
||||||
m = match("(.*)=(.*)", line)
|
|
||||||
if not m:
|
|
||||||
logger.warning(f"Could not get binary/version from {line}")
|
|
||||||
continue
|
|
||||||
bin_name, bin_version = m.group(1), m.group(2)
|
|
||||||
binaries_to_version[bin_name] = bin_version
|
|
||||||
|
|
||||||
return binaries_to_version
|
|
||||||
|
|
Loading…
Reference in a new issue