forked from TrueCloudLab/frostfs-testcases
Fixes in tests to enable them to run in a cloud environment
Few small fixes were made: - Fix path to binaries on storage node in cloud env. - Add logic to prepend ssh command with sudo. - Make re-encoding of homomorphic hash conditional. - Increase ssh timeout. Signed-off-by: Vladimir Domnich <v.domnich@yadro.com>
This commit is contained in:
parent
892b8f227a
commit
5f53e80f93
4 changed files with 26 additions and 14 deletions
1
Makefile
1
Makefile
|
@ -12,6 +12,7 @@ DEV_IMAGE_PY ?= registry.spb.yadro.com/tools/pytest-neofs-x86_64:7
|
||||||
SETUP_DIR ?= $(CURDIR)/.setup
|
SETUP_DIR ?= $(CURDIR)/.setup
|
||||||
DEV_ENV_DEPLOY_DIR ?= /opt/dev-env
|
DEV_ENV_DEPLOY_DIR ?= /opt/dev-env
|
||||||
|
|
||||||
|
DOCKER_NETWORK = --network host
|
||||||
ifeq ($(shell uname -s),Darwin)
|
ifeq ($(shell uname -s),Darwin)
|
||||||
DOCKER_NETWORK = --network bridge -p 389:389 -p 636:636
|
DOCKER_NETWORK = --network bridge -p 389:389 -p 636:636
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -61,7 +61,7 @@ class SSHCommand:
|
||||||
class HostClient:
|
class HostClient:
|
||||||
ssh_client: SSHClient
|
ssh_client: SSHClient
|
||||||
SSH_CONNECTION_ATTEMPTS: ClassVar[int] = 3
|
SSH_CONNECTION_ATTEMPTS: ClassVar[int] = 3
|
||||||
CONNECTION_TIMEOUT = 30
|
CONNECTION_TIMEOUT = 90
|
||||||
|
|
||||||
TIMEOUT_RESTORE_CONNECTION = 10, 24
|
TIMEOUT_RESTORE_CONNECTION = 10, 24
|
||||||
|
|
||||||
|
@ -74,14 +74,16 @@ class HostClient:
|
||||||
if init_ssh_client:
|
if init_ssh_client:
|
||||||
self.create_connection(self.SSH_CONNECTION_ATTEMPTS)
|
self.create_connection(self.SSH_CONNECTION_ATTEMPTS)
|
||||||
|
|
||||||
def exec(self, cmd: str, verify=True, timeout=30) -> SSHCommand:
|
def exec(self, cmd: str, verify=True, timeout=90) -> SSHCommand:
|
||||||
cmd_result = self._inner_exec(cmd, timeout)
|
cmd_result = self._inner_exec(cmd, timeout)
|
||||||
if verify:
|
if verify:
|
||||||
assert cmd_result.rc == 0, f'Non zero rc from command: "{cmd}"'
|
assert cmd_result.rc == 0, f'Non zero rc from command: "{cmd}"'
|
||||||
return cmd_result
|
return cmd_result
|
||||||
|
|
||||||
@log_command
|
@log_command
|
||||||
def exec_with_confirmation(self, cmd: str, confirmation: list, verify=True, timeout=10) -> SSHCommand:
|
def exec_with_confirmation(self, cmd: str, confirmation: list, verify=True, timeout=90) -> SSHCommand:
|
||||||
|
if self.login != "root":
|
||||||
|
cmd = f"sudo {cmd}"
|
||||||
ssh_stdin, ssh_stdout, ssh_stderr = self.ssh_client.exec_command(cmd, timeout=timeout)
|
ssh_stdin, ssh_stdout, ssh_stderr = self.ssh_client.exec_command(cmd, timeout=timeout)
|
||||||
for line in confirmation:
|
for line in confirmation:
|
||||||
if not line.endswith('\n'):
|
if not line.endswith('\n'):
|
||||||
|
@ -195,6 +197,8 @@ class HostClient:
|
||||||
def _inner_exec(self, cmd: str, timeout: int) -> SSHCommand:
|
def _inner_exec(self, cmd: str, timeout: int) -> SSHCommand:
|
||||||
if not self.ssh_client:
|
if not self.ssh_client:
|
||||||
self.create_connection()
|
self.create_connection()
|
||||||
|
if self.login != "root":
|
||||||
|
cmd = f"sudo {cmd}"
|
||||||
for _ in range(self.SSH_CONNECTION_ATTEMPTS):
|
for _ in range(self.SSH_CONNECTION_ATTEMPTS):
|
||||||
try:
|
try:
|
||||||
_, stdout, stderr = self.ssh_client.exec_command(cmd, timeout=timeout)
|
_, stdout, stderr = self.ssh_client.exec_command(cmd, timeout=timeout)
|
||||||
|
|
|
@ -28,8 +28,13 @@ def tick_epoch():
|
||||||
# If neofs-adm is available, then we tick epoch with it (to be consistent with UAT tests)
|
# If neofs-adm is available, then we tick epoch with it (to be consistent with UAT tests)
|
||||||
cmd = f"{NEOFS_ADM_EXEC} morph force-new-epoch -c {NEOFS_ADM_CONFIG_PATH}"
|
cmd = f"{NEOFS_ADM_EXEC} morph force-new-epoch -c {NEOFS_ADM_CONFIG_PATH}"
|
||||||
logger.info(f"Executing shell command: {cmd}")
|
logger.info(f"Executing shell command: {cmd}")
|
||||||
out = wrappers.run_sh(cmd)
|
try:
|
||||||
logger.info(f"Command completed with output: {out}")
|
out = wrappers.run_sh(cmd)
|
||||||
|
logger.info(f"Command completed with output: {out}")
|
||||||
|
except Exception as exc:
|
||||||
|
logger.error(exc)
|
||||||
|
raise RuntimeError("Failed to tick epoch") from exc
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
# Otherwise we tick epoch using transaction
|
# Otherwise we tick epoch using transaction
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#!/usr/bin/python3
|
#!/usr/bin/python3.9
|
||||||
|
|
||||||
"""
|
"""
|
||||||
When doing requests to NeoFS, we get JSON output as an automatically decoded
|
When doing requests to NeoFS, we get JSON output as an automatically decoded
|
||||||
|
@ -144,13 +144,15 @@ def decode_common_fields(data: dict):
|
||||||
header contains several common fields.
|
header contains several common fields.
|
||||||
This function rearranges these fields.
|
This function rearranges these fields.
|
||||||
"""
|
"""
|
||||||
# reencoding binary IDs
|
|
||||||
data["objectID"] = json_reencode(data["objectID"]["value"])
|
data["objectID"] = json_reencode(data["objectID"]["value"])
|
||||||
data["header"]["containerID"] = json_reencode(data["header"]["containerID"]["value"])
|
|
||||||
data["header"]["ownerID"] = json_reencode(data["header"]["ownerID"]["value"])
|
header = data["header"]
|
||||||
data["header"]["homomorphicHash"] = json_reencode(data["header"]["homomorphicHash"]["sum"])
|
header["containerID"] = json_reencode(header["containerID"]["value"])
|
||||||
data["header"]["payloadHash"] = json_reencode(data["header"]["payloadHash"]["sum"])
|
header["ownerID"] = json_reencode(header["ownerID"]["value"])
|
||||||
data["header"]["version"] = (
|
header["payloadHash"] = json_reencode(header["payloadHash"]["sum"])
|
||||||
f"{data['header']['version']['major']}{data['header']['version']['minor']}"
|
header["version"] = f"{header['version']['major']}{header['version']['minor']}"
|
||||||
)
|
# Homomorphic hash is optional and its calculation might be disabled in trusted network
|
||||||
|
if header.get("homomorphicHash"):
|
||||||
|
header["homomorphicHash"] = json_reencode(header["homomorphicHash"]["sum"])
|
||||||
|
|
||||||
return data
|
return data
|
||||||
|
|
Loading…
Reference in a new issue