forked from TrueCloudLab/frostfs-testcases
82 lines
3 KiB
Python
82 lines
3 KiB
Python
import logging
|
|
import os
|
|
from http import HTTPStatus
|
|
from re import match
|
|
|
|
import allure
|
|
import pytest
|
|
import requests
|
|
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 pytest import FixtureRequest
|
|
|
|
from pytest_tests.resources.common import BIN_VERSIONS_FILE
|
|
|
|
logger = logging.getLogger("NeoLogger")
|
|
|
|
|
|
@allure.title("Check binaries versions")
|
|
@pytest.mark.sanity
|
|
@pytest.mark.check_binaries
|
|
@pytest.mark.skip("Skipped due to https://j.yadro.com/browse/OBJECT-628")
|
|
def test_binaries_versions(request: FixtureRequest, hosting: Hosting):
|
|
"""
|
|
Compare binaries versions from external source (url) and deployed on servers.
|
|
"""
|
|
if not BIN_VERSIONS_FILE:
|
|
pytest.skip("File with binaries and versions was not provided")
|
|
|
|
binaries_to_check = download_versions_info(BIN_VERSIONS_FILE)
|
|
with allure.step("Get binaries versions from servers"):
|
|
got_versions = 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
|
|
failed_versions = {}
|
|
additional_env_properties = {}
|
|
for binary, version in binaries_to_check.items():
|
|
actual_version = got_versions.get(binary)
|
|
if actual_version != version:
|
|
failed_versions[binary] = f"Expected version {version}, found version {actual_version}"
|
|
|
|
# If some binary was not listed in the env properties file, let's add it
|
|
# so that we have full information about versions in allure report
|
|
if env_properties and binary not in env_properties:
|
|
additional_env_properties[binary] = actual_version
|
|
|
|
if env_properties and additional_env_properties:
|
|
save_env_properties(env_file, additional_env_properties)
|
|
|
|
# create clear beautiful error with aggregation info
|
|
if failed_versions:
|
|
msg = "\n".join({f"{binary}: {error}" for binary, error in failed_versions.items()})
|
|
raise AssertionError(f"Found binaries with unexpected versions:\n{msg}")
|
|
|
|
|
|
@allure.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
|