Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 17 additions & 12 deletions node_cli/cli/mirage_node.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,11 @@

from node_cli.core.node import backup, get_node_info, get_node_signature
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.utils.helper import URL_TYPE, abort_if_false, error_exit, streamed_cmd
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.texts import safe_load_texts

TEXTS = safe_load_texts()
Expand All @@ -44,17 +47,21 @@ def mirage_node_info(format):
get_node_info(format)


@node.command('init', help='Initialize regular Mirage node operations (Placeholder).')
def init_node():
click.echo("Placeholder: Command 'mirage node init' is not yet implemented.")
@node.command('init', help='Initialize regular Mirage node')
@click.argument('env_filepath')
@streamed_cmd
def init_node(env_filepath: str):
init_mirage(env_filepath=env_filepath)


@node.command('register', help='Register Mirage node (Placeholder for regular operations).')
def register_node():
click.echo("Placeholder: Command 'mirage node register' is not yet implemented.")
@node.command('register', help=TEXTS['mirage']['node']['register']['help'])
@click.option('--ip', required=True, type=IP_TYPE, help=TEXTS['mirage']['node']['register']['ip'])
def register(ip: str) -> None:
register_mirage(ip=ip)


@node.command('update', help='Update Mirage.')
@node.command('update', help='Update Mirage node')
@click.argument('env_filepath')
@click.option(
'--yes',
is_flag=True,
Expand All @@ -63,11 +70,9 @@ def register_node():
prompt='Are you sure you want to update Mirage node software?',
)
@click.option('--pull-config', 'pull_config_for_schain', hidden=True, type=str)
@click.option('--unsafe', 'unsafe_ok', help='Allow unsafe update', hidden=True, is_flag=True)
@click.argument('env_file')
@streamed_cmd
def update_node(env_file, pull_config_for_schain, unsafe_ok):
click.echo("Placeholder: Command 'mirage node update' is not yet implemented.")
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.')
Expand Down
1 change: 1 addition & 0 deletions node_cli/configs/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -171,3 +171,4 @@ def _get_env():
UFW_IPV6_BEFORE_INPUT_CHAIN = 'ufw6-before-input'

REDIS_URI: str = os.getenv('REDIS_URI', 'redis://@127.0.0.1:6379')
DEFAULT_SKALED_BASE_PORT: int = 10000
2 changes: 1 addition & 1 deletion node_cli/configs/routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@

import os


CURRENT_API_VERSION = 'v1'
API_PREFIX = '/api'

Expand All @@ -41,6 +40,7 @@
'schains': ['config', 'list', 'dkg-statuses', 'firewall-rules', 'repair', 'get'],
'ssl': ['status', 'upload'],
'wallet': ['info', 'send-eth'],
'mirage-node': ['info', 'register'],
}
}

Expand Down
13 changes: 10 additions & 3 deletions node_cli/core/wallet.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,15 @@
# along with this program. If not, see <https://www.gnu.org/licenses/>.

import json
import logging

from node_cli.utils.print_formatters import print_wallet_info, TEXTS
from node_cli.utils.helper import error_exit, get_request, post_request, logger
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

logger = logging.getLogger(__name__)

BLUEPRINT_NAME = 'wallet'

Expand All @@ -33,7 +37,10 @@ def get_wallet_info(_format):
if _format == 'json':
print(json.dumps(payload))
else:
print_wallet_info(payload)
if TYPE == NodeType.MIRAGE:
print_mirage_wallet_info(payload)
else:
print_wallet_info(payload)
else:
error_exit(payload, exit_code=CLIExitCodes.BAD_API_RESPONSE)

Expand Down
3 changes: 1 addition & 2 deletions node_cli/mirage/mirage_boot.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,12 @@
from node_cli.configs import TM_INIT_TIMEOUT
from node_cli.core.node import compose_node_env, is_base_containers_alive
from node_cli.operations import init_mirage_boot_op, update_mirage_boot_op
from node_cli.utils.decorators import check_not_inited, check_inited, check_user
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
from node_cli.utils.node_type import NodeType
from node_cli.utils.print_formatters import print_node_cmd_error


logger = logging.getLogger(__name__)


Expand Down
63 changes: 60 additions & 3 deletions node_cli/mirage/mirage_node.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,28 +21,31 @@
import logging
import time

from node_cli.configs import RESTORE_SLEEP_TIMEOUT, SKALE_DIR
from node_cli.configs import DEFAULT_SKALED_BASE_PORT, RESTORE_SLEEP_TIMEOUT, SKALE_DIR
from node_cli.configs.user import SKALE_DIR_ENV_FILEPATH
from node_cli.core.docker_config import cleanup_docker_configuration
from node_cli.core.host import save_env_params
from node_cli.core.host import is_node_inited, save_env_params
from node_cli.core.node import compose_node_env, is_base_containers_alive
from node_cli.mirage.record.chain_record import get_mirage_chain_record
from node_cli.operations import (
MirageUpdateType,
cleanup_mirage_op,
init_mirage_op,
restore_mirage_op,
update_mirage_op,
)
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
from node_cli.utils.helper import error_exit, 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.texts import safe_load_texts

logger = logging.getLogger(__name__)
TEXTS = safe_load_texts()

NODE_BLUEPRINT_NAME = 'mirage-node'


@check_not_inited
def restore_mirage(backup_path, env_filepath, config_only=False):
Expand Down Expand Up @@ -80,6 +83,26 @@ def migrate_from_boot(
logger.info('Migration from boot to mirage completed successfully')


@check_inited
@check_user
def update(env_filepath: str, pull_config_for_schain: str | None = None) -> None:
logger.info('Updating mirage node...')
env = compose_node_env(
env_filepath,
inited_node=True,
sync_schains=False,
node_type=NodeType.MIRAGE,
pull_config_for_schain=pull_config_for_schain,
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this variable is useless for FAIR Node

)
update_ok = update_mirage_op(env_filepath, env, update_type=MirageUpdateType.REGULAR)
alive = is_base_containers_alive(node_type=NodeType.MIRAGE)
if not update_ok or not alive:
print_node_cmd_error()
return
else:
logger.info('Mirage update completed successfully')


def request_repair(snapshot_from: str = '') -> None:
env = compose_node_env(SKALE_DIR_ENV_FILEPATH, save=False, node_type=NodeType.MIRAGE)
record = get_mirage_chain_record(env)
Expand All @@ -95,3 +118,37 @@ def cleanup() -> None:
cleanup_mirage_op(env)
logger.info('Mirage node was cleaned up, all containers and data removed')
cleanup_docker_configuration()


@check_not_inited
def init(env_filepath: str) -> None:
env = compose_node_env(env_filepath, node_type=NodeType.MIRAGE)
if env is None:
return
save_env_params(env_filepath)
env['SKALE_DIR'] = SKALE_DIR

init_ok = init_mirage_op(env_filepath, env)
if not init_ok:
error_exit('Init operation failed', exit_code=CLIExitCodes.OPERATION_EXECUTION_ERROR)
time.sleep(RESTORE_SLEEP_TIMEOUT)
print('Mirage node is initialized')


@check_inited
@check_user
def register(ip: str) -> None:
if not is_node_inited():
print(TEXTS['mirage']['node']['not_inited'])
return

json_data = {'ip': ip, 'port': DEFAULT_SKALED_BASE_PORT}
status, payload = post_request(blueprint=NODE_BLUEPRINT_NAME, method='register', json=json_data)
if status == 'ok':
msg = TEXTS['mirage']['node']['registered']
logger.info(msg)
print(msg)
else:
error_msg = payload
logger.error(f'Registration error {error_msg}')
error_exit(error_msg, exit_code=CLIExitCodes.BAD_API_RESPONSE)
1 change: 1 addition & 0 deletions node_cli/operations/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
configure_nftables,
)
from node_cli.operations.mirage import ( # noqa
init as init_mirage_op,
update_mirage as update_mirage_op,
MirageUpdateType,
restore_mirage as restore_mirage_op,
Expand Down
78 changes: 77 additions & 1 deletion node_cli/operations/mirage.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,12 @@
from node_cli.migrations.mirage.from_boot import migrate_nftables_from_boot
from node_cli.mirage.record.chain_record import migrate_chain_record
from node_cli.operations.base import checked_host, turn_off
from node_cli.operations.common import unpack_backup_archive
from node_cli.operations.common import configure_filebeat, configure_flask, unpack_backup_archive
from node_cli.operations.config_repo import (
sync_skale_node,
update_images,
)
from node_cli.operations.volume import cleanup_volume_artifacts, prepare_block_device
from node_cli.utils.docker_utils import (
REDIS_SERVICE_DICT,
REDIS_START_TIMEOUT,
Expand All @@ -67,6 +68,81 @@ class MirageUpdateType(Enum):
FROM_BOOT = 'from_boot'


@checked_host
def init(env_filepath: str, env: dict) -> bool:
sync_skale_node()
ensure_btrfs_kernel_module_autoloaded()
cleanup_volume_artifacts(env['DISK_MOUNTPOINT'])

if env.get('SKIP_DOCKER_CONFIG') != 'True':
configure_docker()

configure_nftables()
configure_filebeat()
configure_flask()
generate_nginx_config()

prepare_host(env_filepath, env_type=env['ENV_TYPE'])
link_env_file()

prepare_block_device(env['DISK_MOUNTPOINT'], force=env['ENFORCE_BTRFS'] == 'True')

meta_manager = MirageCliMetaManager()
meta_manager.update_meta(
VERSION,
env['CONTAINER_CONFIGS_STREAM'],
distro.id(),
distro.version(),
)
update_images(env=env, node_type=NodeType.MIRAGE)
compose_up(env=env, node_type=NodeType.MIRAGE)
wait_for_container(REDIS_SERVICE_DICT['redis'])
time.sleep(REDIS_START_TIMEOUT)
return True


@checked_host
def update_mirage_boot(env_filepath: str, env: dict) -> bool:
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

function is duplicated update_mirage_boot

compose_rm(node_type=NodeType.MIRAGE, env=env)
remove_dynamic_containers()
cleanup_volume_artifacts(env['DISK_MOUNTPOINT'])

sync_skale_node()
ensure_btrfs_kernel_module_autoloaded()

if env.get('SKIP_DOCKER_CONFIG') != 'True':
configure_docker()

enable_monitoring = str_to_bool(env.get('MONITORING_CONTAINERS', 'False'))
configure_nftables(enable_monitoring=enable_monitoring)

generate_nginx_config()
prepare_block_device(env['DISK_MOUNTPOINT'], force=env['ENFORCE_BTRFS'] == 'True')

prepare_host(env_filepath, env['ENV_TYPE'])

meta_manager = MirageCliMetaManager()
current_stream = meta_manager.get_meta_info().config_stream
skip_cleanup = env.get('SKIP_DOCKER_CLEANUP') == 'True'
if not skip_cleanup and current_stream != env['CONTAINER_CONFIGS_STREAM']:
logger.info(
'Stream version was changed from %s to %s',
current_stream,
env['CONTAINER_CONFIGS_STREAM'],
)
docker_cleanup()

meta_manager.update_meta(
VERSION,
env['CONTAINER_CONFIGS_STREAM'],
distro.id(),
distro.version(),
)
update_images(env=env, node_type=NodeType.MIRAGE)
compose_up(env=env, node_type=NodeType.MIRAGE, is_mirage_boot=True)
return True


@checked_host
def update_mirage(env_filepath: str, env: dict, update_type: MirageUpdateType) -> bool:
compose_rm(node_type=NodeType.MIRAGE, env=env)
Expand Down
Loading
Loading