Skip to content

Commit fc4f0cc

Browse files
committed
Add new cmds for mirage. Restructure CliMeta
1 parent b3b6846 commit fc4f0cc

9 files changed

Lines changed: 331 additions & 122 deletions

File tree

node_cli/cli/mirage_node.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import click
2121

2222
from node_cli.core.node import get_node_signature, backup, get_node_info
23-
from node_cli.core.mirage_node import restore_mirage
23+
from node_cli.core.mirage_node import migrate_from_boot, restore_mirage
2424
from node_cli.utils.helper import error_exit, streamed_cmd, abort_if_false
2525

2626

@@ -94,3 +94,18 @@ def backup_node(backup_folder_path):
9494
@streamed_cmd
9595
def restore_node(backup_path, env_file, config_only):
9696
restore_mirage(backup_path, env_file, config_only)
97+
98+
99+
@node.command('migrate', help='Switch from boot to regular Mirage node.')
100+
@click.argument('env_filepath')
101+
@click.option(
102+
'--yes',
103+
is_flag=True,
104+
callback=abort_if_false,
105+
expose_value=False,
106+
prompt='Are you sure you want to migrate to regular Mirage node? The action cannot be undone',
107+
)
108+
@streamed_cmd
109+
def migrate_node(env_filepath: str) -> None:
110+
click.echo("Placeholder: Command 'mirage node migrate' is not yet implemented.")
111+
migrate_from_boot(env_filepath=env_filepath)

node_cli/cli/node.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
from node_cli.utils.decorators import check_inited
4242
from node_cli.utils.helper import abort_if_false, streamed_cmd, IP_TYPE
4343
from node_cli.utils.texts import safe_load_texts
44-
from node_cli.utils.meta import get_meta_info
44+
from node_cli.utils.meta import CliMetaManager
4545
from node_cli.utils.print_formatters import print_meta_info
4646

4747

@@ -248,7 +248,7 @@ def configure_firewall(monitoring):
248248
@check_inited
249249
@click.option('--json', 'raw', is_flag=True, help=TEXTS['common']['json'])
250250
def version(raw: bool) -> None:
251-
meta_info = get_meta_info(raw=raw)
251+
meta_info = CliMetaManager().get_meta_info(raw=raw)
252252
if raw:
253253
print(meta_info)
254254
else:

node_cli/core/mirage_node.py

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,13 @@
2323

2424
from node_cli.configs import SKALE_DIR, RESTORE_SLEEP_TIMEOUT
2525
from node_cli.core.host import save_env_params
26-
from node_cli.core.node import compose_node_env
27-
from node_cli.utils.decorators import check_not_inited
26+
from node_cli.core.node import compose_node_env, is_base_containers_alive
27+
from node_cli.operations import update_mirage_op, restore_mirage_op, MirageUpdateType
28+
from node_cli.utils.decorators import check_inited, check_not_inited, check_user
2829
from node_cli.utils.exit_codes import CLIExitCodes
2930
from node_cli.utils.helper import error_exit
3031
from node_cli.utils.node_type import NodeType
31-
from node_cli.operations import restore_mirage_op
32-
32+
from node_cli.utils.print_formatters import print_node_cmd_error
3333

3434
logger = logging.getLogger(__name__)
3535

@@ -47,3 +47,24 @@ def restore_mirage(backup_path, env_filepath, config_only=False):
4747
error_exit('Restore operation failed', exit_code=CLIExitCodes.OPERATION_EXECUTION_ERROR)
4848
time.sleep(RESTORE_SLEEP_TIMEOUT)
4949
print('Mirage node is restored from backup')
50+
51+
52+
@check_inited
53+
@check_user
54+
def migrate_from_boot(
55+
env_filepath: str,
56+
) -> None:
57+
logger.info('Node update started')
58+
env = compose_node_env(
59+
env_filepath,
60+
inited_node=True,
61+
sync_schains=False,
62+
node_type=NodeType.MIRAGE,
63+
)
64+
migrate_ok = update_mirage_op(env_filepath, env, update_type=MirageUpdateType.INFRA_ONLY)
65+
alive = is_base_containers_alive(node_type=NodeType.MIRAGE)
66+
if not migrate_ok or not alive:
67+
print_node_cmd_error()
68+
return
69+
else:
70+
logger.info('Mirgration from boot to mirage completed successfully')

node_cli/core/node.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@
6969
get_request,
7070
post_request,
7171
)
72-
from node_cli.utils.meta import get_meta_info
72+
from node_cli.utils.meta import CliMetaManager
7373
from node_cli.utils.texts import safe_load_texts
7474
from node_cli.utils.exit_codes import CLIExitCodes
7575
from node_cli.utils.decorators import check_not_inited, check_inited, check_user
@@ -198,7 +198,7 @@ def init_sync(
198198
@check_user
199199
def update_sync(env_filepath: str, unsafe_ok: bool = False) -> None:
200200
logger.info('Node update started')
201-
prev_version = get_meta_info().version
201+
prev_version = CliMetaManager().get_meta_info().version
202202
if (__version__ == 'test' or __version__.startswith('2.6')) and prev_version == '2.5.0':
203203
migrate_2_6()
204204
env = compose_node_env(env_filepath, node_type=NodeType.SYNC)
@@ -284,7 +284,7 @@ def update(
284284
error_msg = 'Cannot update safely'
285285
error_exit(error_msg, exit_code=CLIExitCodes.UNSAFE_UPDATE)
286286

287-
prev_version = get_meta_info().version
287+
prev_version = CliMetaManager().get_meta_info().version
288288
if (__version__ == 'test' or __version__.startswith('2.6')) and prev_version == '2.5.0':
289289
migrate_2_6()
290290
logger.info('Node update started')

node_cli/operations/__init__.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,11 @@
2828
turn_off as turn_off_op,
2929
turn_on as turn_on_op,
3030
restore as restore_op,
31-
restore_mirage as restore_mirage_op,
3231
cleanup_sync as cleanup_sync_op,
3332
configure_nftables,
3433
)
34+
from node_cli.operations.mirage import ( # noqa
35+
update_mirage as update_mirage_op,
36+
MirageUpdateType,
37+
restore_mirage as restore_mirage_op,
38+
)

node_cli/operations/base.py

Lines changed: 23 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
from node_cli.cli.info import VERSION, TYPE
4949
from node_cli.operations.common import configure_filebeat, configure_flask, unpack_backup_archive
5050
from node_cli.operations.docker_lvmpy import lvmpy_install
51-
from node_cli.operations.skale_node import (
51+
from node_cli.operations.config_repo import (
5252
download_skale_node,
5353
sync_skale_node,
5454
update_images,
@@ -65,7 +65,7 @@
6565
remove_dynamic_containers,
6666
)
6767
from node_cli.utils.helper import str_to_bool, rm_dir
68-
from node_cli.utils.meta import get_meta_info, update_meta
68+
from node_cli.utils.meta import CliMetaManager
6969
from node_cli.utils.node_type import NodeType
7070
from node_cli.utils.print_formatters import print_failed_requirements_checks
7171

@@ -127,7 +127,8 @@ def update(env_filepath: str, env: Dict, node_type: NodeType) -> bool:
127127
prepare_host(env_filepath, env['ENV_TYPE'], allocation=True)
128128
init_shared_space_volume(env['ENV_TYPE'])
129129

130-
current_stream = get_meta_info().config_stream
130+
meta_manager = CliMetaManager()
131+
current_stream = meta_manager.get_meta_info().config_stream
131132
skip_cleanup = env.get('SKIP_DOCKER_CLEANUP') == 'True'
132133
if not skip_cleanup and current_stream != env['CONTAINER_CONFIGS_STREAM']:
133134
logger.info(
@@ -137,7 +138,7 @@ def update(env_filepath: str, env: Dict, node_type: NodeType) -> bool:
137138
)
138139
docker_cleanup()
139140

140-
update_meta(
141+
meta_manager.update_meta(
141142
VERSION,
142143
env['CONTAINER_CONFIGS_STREAM'],
143144
env['DOCKER_LVMPY_STREAM'],
@@ -167,7 +168,8 @@ def migrate_mirage_boot(env_filepath: str, env: Dict) -> bool:
167168

168169
prepare_host(env_filepath, env['ENV_TYPE'])
169170

170-
current_stream = get_meta_info().config_stream
171+
meta_manager = CliMetaManager()
172+
current_stream = meta_manager.get_meta_info().config_stream
171173
skip_cleanup = env.get('SKIP_DOCKER_CLEANUP') == 'True'
172174
if not skip_cleanup and current_stream != env['CONTAINER_CONFIGS_STREAM']:
173175
logger.info(
@@ -177,7 +179,7 @@ def migrate_mirage_boot(env_filepath: str, env: Dict) -> bool:
177179
)
178180
docker_cleanup()
179181

180-
update_meta(
182+
meta_manager.update_meta(
181183
VERSION,
182184
env['CONTAINER_CONFIGS_STREAM'],
183185
None,
@@ -209,7 +211,8 @@ def update_mirage_boot(env_filepath: str, env: Dict) -> bool:
209211

210212
prepare_host(env_filepath, env['ENV_TYPE'])
211213

212-
current_stream = get_meta_info().config_stream
214+
meta_manager = CliMetaManager()
215+
current_stream = meta_manager.get_meta_info().config_stream
213216
skip_cleanup = env.get('SKIP_DOCKER_CLEANUP') == 'True'
214217
if not skip_cleanup and current_stream != env['CONTAINER_CONFIGS_STREAM']:
215218
logger.info(
@@ -219,7 +222,7 @@ def update_mirage_boot(env_filepath: str, env: Dict) -> bool:
219222
)
220223
docker_cleanup()
221224

222-
update_meta(
225+
meta_manager.update_meta(
223226
VERSION,
224227
env['CONTAINER_CONFIGS_STREAM'],
225228
None,
@@ -252,7 +255,8 @@ def init(env_filepath: str, env: dict, node_type: NodeType) -> None:
252255
lvmpy_install(env)
253256
init_shared_space_volume(env['ENV_TYPE'])
254257

255-
update_meta(
258+
meta_manager = CliMetaManager()
259+
meta_manager.update_meta(
256260
VERSION,
257261
env['CONTAINER_CONFIGS_STREAM'],
258262
env['DOCKER_LVMPY_STREAM'],
@@ -285,7 +289,8 @@ def init_mirage_boot(env_filepath: str, env: dict) -> None:
285289
generate_nginx_config()
286290
prepare_block_device(env['DISK_MOUNTPOINT'], force=env['ENFORCE_BTRFS'] == 'True')
287291

288-
update_meta(
292+
meta_manager = CliMetaManager()
293+
meta_manager.update_meta(
289294
VERSION,
290295
env['CONTAINER_CONFIGS_STREAM'],
291296
None,
@@ -331,7 +336,8 @@ def init_sync(
331336
generate_nginx_config()
332337
prepare_block_device(env['DISK_MOUNTPOINT'], force=env['ENFORCE_BTRFS'] == 'True')
333338

334-
update_meta(
339+
meta_manager = CliMetaManager()
340+
meta_manager.update_meta(
335341
VERSION,
336342
env['CONTAINER_CONFIGS_STREAM'],
337343
env['DOCKER_LVMPY_STREAM'],
@@ -370,7 +376,8 @@ def update_sync(env_filepath: str, env: Dict) -> bool:
370376

371377
prepare_host(env_filepath, env['ENV_TYPE'], allocation=True)
372378

373-
update_meta(
379+
meta_manager = CliMetaManager()
380+
meta_manager.update_meta(
374381
VERSION,
375382
env['CONTAINER_CONFIGS_STREAM'],
376383
env['DOCKER_LVMPY_STREAM'],
@@ -392,7 +399,8 @@ def turn_off(env: dict, node_type: NodeType) -> None:
392399

393400
def turn_on(env: dict, node_type: NodeType) -> None:
394401
logger.info('Turning on the node...')
395-
update_meta(
402+
meta_manager = CliMetaManager()
403+
meta_manager.update_meta(
396404
VERSION,
397405
env['CONTAINER_CONFIGS_STREAM'],
398406
env['DOCKER_LVMPY_STREAM'],
@@ -434,7 +442,8 @@ def restore(env, backup_path, node_type: NodeType, config_only=False):
434442
lvmpy_install(env)
435443
init_shared_space_volume(env['ENV_TYPE'])
436444

437-
update_meta(
445+
meta_manager = CliMetaManager()
446+
meta_manager.update_meta(
438447
VERSION,
439448
env['CONTAINER_CONFIGS_STREAM'],
440449
env['DOCKER_LVMPY_STREAM'],
@@ -459,53 +468,6 @@ def restore(env, backup_path, node_type: NodeType, config_only=False):
459468
return True
460469

461470

462-
def restore_mirage(env, backup_path, config_only=False):
463-
unpack_backup_archive(backup_path)
464-
failed_checks = run_host_checks(
465-
env['DISK_MOUNTPOINT'],
466-
TYPE,
467-
env['ENV_TYPE'],
468-
CONTAINER_CONFIG_PATH,
469-
check_type=CheckType.PREINSTALL,
470-
)
471-
if failed_checks:
472-
print_failed_requirements_checks(failed_checks)
473-
return False
474-
475-
ensure_btrfs_kernel_module_autoloaded()
476-
477-
if env.get('SKIP_DOCKER_CONFIG') != 'True':
478-
configure_docker()
479-
480-
enable_monitoring = str_to_bool(env.get('MONITORING_CONTAINERS', 'False'))
481-
configure_nftables(enable_monitoring=enable_monitoring)
482-
483-
link_env_file()
484-
485-
update_meta(
486-
VERSION,
487-
env['CONTAINER_CONFIGS_STREAM'],
488-
None,
489-
distro.id(),
490-
distro.version(),
491-
)
492-
493-
if not config_only:
494-
compose_up(env=env, node_type=NodeType.MIRAGE)
495-
496-
failed_checks = run_host_checks(
497-
env['DISK_MOUNTPOINT'],
498-
TYPE,
499-
env['ENV_TYPE'],
500-
CONTAINER_CONFIG_PATH,
501-
check_type=CheckType.POSTINSTALL,
502-
)
503-
if failed_checks:
504-
print_failed_requirements_checks(failed_checks)
505-
return False
506-
return True
507-
508-
509471
def cleanup_sync(env, schain_name: str) -> None:
510472
turn_off(env, node_type=NodeType.SYNC)
511473
cleanup_sync_datadir(schain_name=schain_name)

0 commit comments

Comments
 (0)