From 0a2aa222840733d00fb10986549b048d52bb0228 Mon Sep 17 00:00:00 2001 From: Dmytro Date: Sat, 12 Jul 2025 16:47:34 +0100 Subject: [PATCH 1/2] Fix fair node info and fair wallet info commands --- node_cli/cli/mirage_node.py | 20 ++++++++------------ node_cli/core/node.py | 2 +- node_cli/core/wallet.py | 13 +++++++------ node_cli/mirage/mirage_node.py | 26 ++++++++++++++++++++++---- node_cli/utils/helper.py | 6 ++++-- node_cli/utils/print_formatters.py | 18 ++++++++++++++++-- 6 files changed, 58 insertions(+), 27 deletions(-) diff --git a/node_cli/cli/mirage_node.py b/node_cli/cli/mirage_node.py index 29d1d281..e76e4f4b 100644 --- a/node_cli/cli/mirage_node.py +++ b/node_cli/cli/mirage_node.py @@ -19,13 +19,18 @@ import click -from node_cli.core.node import backup, get_node_info, get_node_signature +from node_cli.core.node import backup from node_cli.mirage.mirage_node import cleanup as mirage_cleanup from node_cli.mirage.mirage_node import init as init_mirage -from node_cli.mirage.mirage_node import migrate_from_boot, request_repair, restore_mirage +from node_cli.mirage.mirage_node import ( + migrate_from_boot, + request_repair, + restore_mirage, + get_node_info, +) from node_cli.mirage.mirage_node import register as register_mirage from node_cli.mirage.mirage_node import update as update_mirage -from node_cli.utils.helper import IP_TYPE, URL_TYPE, abort_if_false, error_exit, streamed_cmd +from node_cli.utils.helper import IP_TYPE, URL_TYPE, abort_if_false, streamed_cmd from node_cli.utils.texts import safe_load_texts TEXTS = safe_load_texts() @@ -75,15 +80,6 @@ def update_node(env_filepath: str, pull_config_for_schain): update_mirage(env_filepath=env_filepath, pull_config_for_schain=pull_config_for_schain) -@node.command('signature', help='Get mirage node signature for a validator ID.') -@click.argument('validator_id') -def signature_node(validator_id): - res = get_node_signature(validator_id) - if isinstance(res, dict) and 'error' in res: - error_exit(f'Error getting signature: {res.get("message", res)}') - print(f'Signature: {res}') - - @node.command('backup', help='Generate backup file for the Mirage node.') @click.argument('backup_folder_path') @streamed_cmd diff --git a/node_cli/core/node.py b/node_cli/core/node.py index ca60ba5e..4d41dcde 100644 --- a/node_cli/core/node.py +++ b/node_cli/core/node.py @@ -370,7 +370,7 @@ def create_backup_archive(backup_filepath): cli_log_path = CLI_LOG_DATA_PATH container_log_path = LOG_PATH pack_dir(SKALE_DIR, backup_filepath, exclude=(cli_log_path, container_log_path)) - print(f'Backup archive succesfully created {backup_filepath}') + print(f'Backup archive successfully created {backup_filepath}') def set_maintenance_mode_on(): diff --git a/node_cli/core/wallet.py b/node_cli/core/wallet.py index dd41db5a..15efe8d0 100644 --- a/node_cli/core/wallet.py +++ b/node_cli/core/wallet.py @@ -20,8 +20,6 @@ import json import logging -from node_cli.cli.info import TYPE -from node_cli.core.node import NodeType from node_cli.utils.exit_codes import CLIExitCodes from node_cli.utils.helper import error_exit, get_request, post_request from node_cli.utils.print_formatters import TEXTS, print_mirage_wallet_info, print_wallet_info @@ -37,10 +35,13 @@ def get_wallet_info(_format): if _format == 'json': print(json.dumps(payload)) else: - if TYPE == NodeType.MIRAGE: - print_mirage_wallet_info(payload) - else: - print_wallet_info(payload) + if type(payload) is str: + print(payload) + elif type(payload) is dict: + if payload.get('skale_balance'): + print_wallet_info(payload) + else: + print_mirage_wallet_info(payload) else: error_exit(payload, exit_code=CLIExitCodes.BAD_API_RESPONSE) diff --git a/node_cli/mirage/mirage_node.py b/node_cli/mirage/mirage_node.py index 2407a317..3a185138 100644 --- a/node_cli/mirage/mirage_node.py +++ b/node_cli/mirage/mirage_node.py @@ -20,6 +20,7 @@ import logging import time +from typing import cast from node_cli.configs import DEFAULT_SKALED_BASE_PORT, RESTORE_SLEEP_TIMEOUT, SKALE_DIR from node_cli.configs.user import SKALE_DIR_ENV_FILEPATH @@ -36,15 +37,32 @@ ) from node_cli.utils.decorators import check_inited, check_not_inited, check_user from node_cli.utils.exit_codes import CLIExitCodes -from node_cli.utils.helper import error_exit, post_request +from node_cli.utils.helper import error_exit, get_request, post_request from node_cli.utils.node_type import NodeType -from node_cli.utils.print_formatters import print_node_cmd_error +from node_cli.utils.print_formatters import print_node_cmd_error, print_node_info_mirage from node_cli.utils.texts import safe_load_texts logger = logging.getLogger(__name__) TEXTS = safe_load_texts() -NODE_BLUEPRINT_NAME = 'mirage-node' +BLUEPRINT_NAME = 'mirage-node' + + +def get_node_info_plain() -> dict: + status, payload = get_request(blueprint=BLUEPRINT_NAME, method='info') + node_payload: dict = cast(dict, payload) + if status == 'ok': + return node_payload['node'] + else: + error_exit(payload, exit_code=CLIExitCodes.BAD_API_RESPONSE) + + +def get_node_info(format): + node_info = get_node_info_plain() + if format == 'json': + print(node_info) + else: + print_node_info_mirage(node_info) @check_not_inited @@ -143,7 +161,7 @@ def register(ip: str) -> None: return json_data = {'ip': ip, 'port': DEFAULT_SKALED_BASE_PORT} - status, payload = post_request(blueprint=NODE_BLUEPRINT_NAME, method='register', json=json_data) + status, payload = post_request(blueprint=BLUEPRINT_NAME, method='register', json=json_data) if status == 'ok': msg = TEXTS['mirage']['node']['registered'] logger.info(msg) diff --git a/node_cli/utils/helper.py b/node_cli/utils/helper.py index 32269dfa..7adfba3b 100644 --- a/node_cli/utils/helper.py +++ b/node_cli/utils/helper.py @@ -210,14 +210,16 @@ def post_request(blueprint, method, json=None, files=None): return status, payload -def get_request(blueprint: str, method: str, params: Optional[dict] = None) -> tuple[str, str]: +def get_request( + blueprint: str, method: str, params: Optional[dict] = None +) -> tuple[str, str | dict]: route = get_route(blueprint, method) url = construct_url(route) try: response = requests.get(url, params=params) data = response.json() except Exception as err: - logger.error('Request failed', exc_info=err) + logger.exception('Request failed', exc_info=err) data = DEFAULT_ERROR_DATA status = data['status'] diff --git a/node_cli/utils/print_formatters.py b/node_cli/utils/print_formatters.py index 339c9c8f..e4c8aabf 100644 --- a/node_cli/utils/print_formatters.py +++ b/node_cli/utils/print_formatters.py @@ -51,8 +51,8 @@ def print_mirage_wallet_info(wallet): inspect.cleandoc(f""" {LONG_LINE} Address: {wallet['address'].lower()} - MIRAGE balance: {wallet['mirage_balance']} ETH - MIRAGE balance WEI: {wallet['mirage_balance_wei']} WEI + Node balance: {wallet['mirage_balance']} MIRAGE + Node balance WEI: {wallet['mirage_balance_wei']} MIRAGE WEI {LONG_LINE} """) ) @@ -258,6 +258,20 @@ def print_node_info(node, node_status): ) +def print_node_info_mirage(node): + print( + inspect.cleandoc(f""" + {LONG_LINE} + Node info + ID: {node['id']} + IP: {node['ip_str']} + Port: {node['port']} + Domain name: {node['domain_name']} + {LONG_LINE} + """) + ) + + def print_err_response(error_payload: Any) -> None: """Print formatted error message from API response payload. From b672888b5dcb7f65a98f487392c5aec8abcdf5df Mon Sep 17 00:00:00 2001 From: Dmytro Date: Sat, 12 Jul 2025 16:58:35 +0100 Subject: [PATCH 2/2] Remove fair node signature test --- tests/cli/mirage_cli_test.py | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/tests/cli/mirage_cli_test.py b/tests/cli/mirage_cli_test.py index d961aa56..fb7462cd 100644 --- a/tests/cli/mirage_cli_test.py +++ b/tests/cli/mirage_cli_test.py @@ -12,7 +12,6 @@ backup_node, migrate_node, restore_node, - signature_node, ) @@ -54,34 +53,6 @@ def test_mirage_node_backup(mock_backup_core, tmp_path): mock_backup_core.assert_called_once_with(backup_folder) -@mock.patch('node_cli.cli.mirage_node.get_node_signature') -def test_mirage_node_signature(mock_signature_core): - runner = CliRunner() - validator_id = '42' - signature_val = '0xabc123' - mock_signature_core.return_value = signature_val - - result = runner.invoke(signature_node, [validator_id]) - - assert result.exit_code == 0, f'Output: {result.output}\nException: {result.exception}' - mock_signature_core.assert_called_once_with(validator_id) - assert f'Signature: {signature_val}' in result.output - - -@mock.patch('node_cli.cli.mirage_node.get_node_signature') -def test_mirage_node_signature_error(mock_signature_core): - runner = CliRunner() - validator_id = '43' - error_msg = 'Core layer error' - mock_signature_core.return_value = {'error': True, 'message': error_msg} - - result = runner.invoke(signature_node, [validator_id]) - - assert result.exit_code != 0, f'Output: {result.output}\nException: {result.exception}' - mock_signature_core.assert_called_once_with(validator_id) - assert error_msg in result.output - - @mock.patch('node_cli.cli.mirage_boot.register') def test_mirage_boot_register(mock_register_core): runner = CliRunner()