test: nomos cli wrapper

This commit is contained in:
Roman 2025-02-07 15:21:15 +08:00
parent 3ee98528c2
commit f3a5117b96
No known key found for this signature in database
GPG Key ID: B8FE070B54E11B75
7 changed files with 101 additions and 22 deletions

0
src/cli/__init__.py Normal file
View File

11
src/cli/cli_vars.py Normal file
View File

@ -0,0 +1,11 @@
from src.env_vars import NOMOS_IMAGE
nomos_cli = {
"reconstruct": {
"image": NOMOS_IMAGE,
"flags": [{"--app-blobs": [0]}], # Value [] is a list of indexes into list of values required for the flag
"volumes": [],
"ports": [],
"entrypoint": "",
},
}

67
src/cli/nomos_cli.py Normal file
View File

@ -0,0 +1,67 @@
import os
from src.libs.common import generate_log_prefix
from src.libs.custom_logger import get_custom_logger
from tenacity import retry, stop_after_delay, wait_fixed
from src.cli.cli_vars import nomos_cli
from src.node.docker_mananger import DockerManager
from src.env_vars import DOCKER_LOG_DIR, NOMOS_CLI
logger = get_custom_logger(__name__)
class NomosCli:
def __init__(self, command=""):
logger.debug(f"Cli is going to be initialized with this config {nomos_cli[command]}")
self._command = command
self._image_name = nomos_cli[command]["image"]
self._internal_ports = nomos_cli[command]["ports"]
self._volumes = nomos_cli[command]["volumes"]
self._entrypoint = nomos_cli[command]["entrypoint"]
container_name = "nomos-cli-" + generate_log_prefix()
self._log_path = os.path.join(DOCKER_LOG_DIR, f"{container_name}__{self._image_name.replace('/', '_')}.log")
self._docker_manager = DockerManager(self._image_name)
self._container_name = container_name
self._container = None
cwd = os.getcwd()
self._volumes = [cwd + "/" + volume for volume in self._volumes]
def run(self, input_values=None, **kwargs):
logger.debug(f"NomosCli initialized with log path {self._log_path}")
cmd = [NOMOS_CLI, self._command]
for flag in nomos_cli[self._command]["flags"]:
for f, indexes in flag:
flag_values_str = f
for j in range(len(indexes)):
flag_values_str = flag_values_str + "'" + input_values[j] + "'"
cmd = cmd + flag_values_str
logger.debug(f"NomosCli command to run {cmd}")
# self._container = self._docker_manager.start_container(
# self._docker_manager.image,
# port_bindings=self._port_map,
# args=None,
# log_path=self._log_path,
# volumes=self._volumes,
# entrypoint=self._entrypoint,
# remove_container=True,
# name=self._container_name,
# command=cmd
# )
@retry(stop=stop_after_delay(5), wait=wait_fixed(0.1), reraise=True)
def kill(self):
if self._container:
logger.debug(f"Killing container with id {self._container.short_id}")
self._container.kill()
try:
self._container.remove()
except:
pass
self._container = None
logger.debug("Container killed.")

View File

@ -27,7 +27,7 @@ NODE_3 = get_env_var("NODE_3", CFGSYNC)
NOMOS_IMAGE = get_env_var("NOMOS_IMAGE", DEFAULT_IMAGE)
NOMOS_CLI = 'docker run --rm --entrypoint "" ' + NOMOS_IMAGE + " /usr/bin/nomos-cli"
NOMOS_CLI = "/usr/bin/nomos-cli"
ADDITIONAL_NODES = get_env_var("ADDITIONAL_NODES", f"{NOMOS},{NOMOS}")
# more nodes need to follow the NODE_X pattern

View File

@ -1,3 +1,5 @@
import random
import string
import uuid
from datetime import datetime
from time import sleep
@ -20,3 +22,7 @@ def delay(num_seconds):
def gen_step_id():
return f"{datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}__{str(uuid.uuid4())}"
def generate_log_prefix():
return "".join(random.choices(string.ascii_lowercase, k=4))

View File

@ -35,15 +35,18 @@ class DockerManager:
logger.debug(f"Network {network_name} created")
return network
def start_container(self, image_name, port_bindings, args, log_path, volumes, entrypoint, remove_container=True, name=None):
cli_args = []
for key, value in args.items():
if isinstance(value, list): # Check if value is a list
cli_args.extend([f"--{key}={item}" for item in value]) # Add a command for each item in the list
elif value is None:
cli_args.append(f"{key}") # Add simple command as it is passed in the key
else:
cli_args.append(f"--{key}={value}") # Add a single command
def start_container(self, image_name, port_bindings, args, log_path, volumes, entrypoint, remove_container=True, name=None, command=None):
if command is None:
cli_args = []
for key, value in args.items():
if isinstance(value, list): # Check if value is a list
cli_args.extend([f"--{key}={item}" for item in value]) # Add a command for each item in the list
elif value is None:
cli_args.append(f"{key}") # Add simple command as it is passed in the key
else:
cli_args.append(f"--{key}={value}") # Add a single command
else:
cli_args = command
cli_args_str_for_log = " ".join(cli_args)
logger.debug(f"docker run -i -t {port_bindings} {image_name} {cli_args_str_for_log}")

View File

@ -3,6 +3,7 @@ import subprocess
import pytest
from src.cli.nomos_cli import NomosCli
from src.env_vars import NOMOS_CLI
from src.libs.common import delay
from src.libs.custom_logger import get_custom_logger
@ -35,17 +36,8 @@ class TestDataIntegrity(StepsDataAvailability):
delay(10)
received_data = self.get_data_range(self.node2, [0] * 31 + [1], [0] * 8, [0] * 7 + [5])
rcv_data_json = json.dumps(received_data)
cmd = str(NOMOS_CLI + " reconstruct --app-blobs " + "'" + str(rcv_data_json) + "'")
logger.debug(f"Command to run {cmd}")
cmd_type = type(cmd)
logger.debug(f"Command type {cmd_type}")
try:
completed_cmd = subprocess.run(cmd, shell=True, capture_output=True, text=True, check=True)
logger.debug(f"Command finished with output {completed_cmd.stdout}")
except subprocess.CalledProcessError as e:
logger.error(f"Error occurred while running nomos-cli {e.stderr}")
# cmd = str(NOMOS_CLI + " reconstruct --app-blobs " + "'" + str(rcv_data_json) + "'")
cli = NomosCli(command="reconstruct")
cli.run(input_values=[str(rcv_data_json)])
# assert DATA_TO_DISPERSE[0] == bytes(received_data[0][1]).decode("utf-8")