diff --git a/node_cli/cli/sync_node.py b/node_cli/cli/sync_node.py index a8ad1324..b6247c1a 100644 --- a/node_cli/cli/sync_node.py +++ b/node_cli/cli/sync_node.py @@ -17,14 +17,17 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +from typing import Optional + import click from node_cli.core.node import init_sync, update_sync from node_cli.utils.helper import ( abort_if_false, + error_exit, + IP_TYPE, safe_load_texts, streamed_cmd, - error_exit ) from node_cli.utils.exit_codes import CLIExitCodes @@ -60,14 +63,21 @@ def sync_node(): help=TEXTS['init']['historic_state'], is_flag=True ) +@click.option( + '--snapshot-from', + type=IP_TYPE, + default=None, + hidden=True, + help='Ip of the node from to download snapshot from' +) @streamed_cmd -def _init_sync(env_file, archive, catchup, historic_state): +def _init_sync(env_file, archive, catchup, historic_state, snapshot_from: Optional[str]): if historic_state and not archive: error_exit( '--historic-state can be used only is combination with --archive', exit_code=CLIExitCodes.FAILURE ) - init_sync(env_file, archive, catchup, historic_state) + init_sync(env_file, archive, catchup, historic_state, snapshot_from) @sync_node.command('update', help='Update sync node from .env file') diff --git a/node_cli/core/node.py b/node_cli/core/node.py index e8895d2a..e073081d 100644 --- a/node_cli/core/node.py +++ b/node_cli/core/node.py @@ -186,7 +186,8 @@ def init_sync( env_filepath: str, archive: bool, catchup: bool, - historic_state: bool + historic_state: bool, + snapshot_from: str ) -> None: configure_firewall_rules() env = get_node_env(env_filepath, sync_node=True) @@ -197,7 +198,8 @@ def init_sync( env, archive, catchup, - historic_state + historic_state, + snapshot_from ) if not inited_ok: error_exit( diff --git a/node_cli/core/schains.py b/node_cli/core/schains.py index 59798bda..2d40677e 100644 --- a/node_cli/core/schains.py +++ b/node_cli/core/schains.py @@ -96,6 +96,7 @@ def get_node_cli_schain_status_filepath(schain_name: str) -> str: def update_node_cli_schain_status(schain_name: str, status: dict) -> None: path = get_node_cli_schain_status_filepath(schain_name) + os.makedirs(os.path.dirname(path), exist_ok=True) save_json(path, status) diff --git a/node_cli/operations/base.py b/node_cli/operations/base.py index 3df09aa0..cf4a9eb1 100644 --- a/node_cli/operations/base.py +++ b/node_cli/operations/base.py @@ -20,7 +20,7 @@ import distro import functools import logging -from typing import Dict +from typing import Dict, Optional from node_cli.cli.info import VERSION from node_cli.configs import CONTAINER_CONFIG_PATH, CONTAINER_CONFIG_TMP_PATH @@ -47,6 +47,7 @@ from node_cli.operations.skale_node import download_skale_node, sync_skale_node, update_images from node_cli.core.checks import CheckType, run_checks as run_host_checks from node_cli.core.iptables import configure_iptables +from node_cli.core.schains import update_node_cli_schain_status from node_cli.utils.docker_utils import ( compose_rm, compose_up, @@ -184,7 +185,8 @@ def init_sync( env: dict, archive: bool, catchup: bool, - historic_state: bool + historic_state: bool, + snapshot_from: Optional[str] ) -> bool: cleanup_volume_artifacts(env['DISK_MOUNTPOINT']) download_skale_node( @@ -224,6 +226,11 @@ def init_sync( distro.version() ) update_resource_allocation(env_type=env['ENV_TYPE']) + + schain_name = env['SCHAIN_NAME'] + if snapshot_from: + update_node_cli_schain_status(schain_name, {'snapshot_from': snapshot_from}) + update_images(env.get('CONTAINER_CONFIGS_DIR') != '', sync_node=True) compose_up(env, sync_node=True)