From f3a5117b96700d83ac102943550e231f65abb72e Mon Sep 17 00:00:00 2001 From: Roman Date: Fri, 7 Feb 2025 15:21:15 +0800 Subject: [PATCH] test: nomos cli wrapper --- src/cli/__init__.py | 0 src/cli/cli_vars.py | 11 ++++ src/cli/nomos_cli.py | 67 +++++++++++++++++++++ src/env_vars.py | 2 +- src/libs/common.py | 6 ++ src/node/docker_mananger.py | 21 ++++--- tests/data_integrity/test_data_integrity.py | 16 ++--- 7 files changed, 101 insertions(+), 22 deletions(-) create mode 100644 src/cli/__init__.py create mode 100644 src/cli/cli_vars.py create mode 100644 src/cli/nomos_cli.py diff --git a/src/cli/__init__.py b/src/cli/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/cli/cli_vars.py b/src/cli/cli_vars.py new file mode 100644 index 0000000..1c3efb8 --- /dev/null +++ b/src/cli/cli_vars.py @@ -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": "", + }, +} diff --git a/src/cli/nomos_cli.py b/src/cli/nomos_cli.py new file mode 100644 index 0000000..450a5f3 --- /dev/null +++ b/src/cli/nomos_cli.py @@ -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.") diff --git a/src/env_vars.py b/src/env_vars.py index dbcc213..bbaffb7 100644 --- a/src/env_vars.py +++ b/src/env_vars.py @@ -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 diff --git a/src/libs/common.py b/src/libs/common.py index 939a66c..27a83c9 100644 --- a/src/libs/common.py +++ b/src/libs/common.py @@ -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)) diff --git a/src/node/docker_mananger.py b/src/node/docker_mananger.py index 074fb41..63f49cb 100644 --- a/src/node/docker_mananger.py +++ b/src/node/docker_mananger.py @@ -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}") diff --git a/tests/data_integrity/test_data_integrity.py b/tests/data_integrity/test_data_integrity.py index ab2302c..8313d84 100644 --- a/tests/data_integrity/test_data_integrity.py +++ b/tests/data_integrity/test_data_integrity.py @@ -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")