Skip to content

Commit 036d884

Browse files
committed
Add migrate for mirage chain record
1 parent 8847193 commit 036d884

8 files changed

Lines changed: 49 additions & 20 deletions

File tree

node_cli/core/static_config.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,9 @@ def get_static_params(
4444
with open(static_params_filepath) as requirements_file:
4545
ydata = yaml.load(requirements_file, Loader=yaml.Loader)
4646
return ydata['envs'][env_type]
47+
48+
49+
def get_mirage_chain_name(env: dict) -> str:
50+
node_type = NodeType.MIRAGE
51+
params = get_static_params(node_type, env['ENV_TYPE'])
52+
return params['info']['chain_name']

node_cli/mirage/mirage_node.py

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,7 @@
2525
from node_cli.configs.user import SKALE_DIR_ENV_FILEPATH
2626
from node_cli.core.host import save_env_params
2727
from node_cli.core.node import compose_node_env, is_base_containers_alive
28-
from node_cli.core.static_config import get_static_params
29-
from node_cli.mirage.record.chain_record import ChainRecord
28+
from node_cli.mirage.record.chain_record import get_mirage_chain_record
3029
from node_cli.operations import MirageUpdateType, restore_mirage_op, update_mirage_op
3130
from node_cli.utils.decorators import check_inited, check_not_inited, check_user
3231
from node_cli.utils.exit_codes import CLIExitCodes
@@ -76,11 +75,8 @@ def migrate_from_boot(
7675

7776

7877
def request_repair(snapshot_from: str = '') -> None:
79-
node_type = NodeType.MIRAGE
80-
env = compose_node_env(SKALE_DIR_ENV_FILEPATH, save=False, node_type=node_type)
81-
params = get_static_params(node_type, env['ENV_TYPE'])
82-
record = ChainRecord(params['info']['chain_name'])
78+
env = compose_node_env(SKALE_DIR_ENV_FILEPATH, save=False, node_type=NodeType.MIRAGE)
79+
record = get_mirage_chain_record(env)
8380
record.set_repair_ts(int(time.time()))
8481
record.set_snapshot_from(snapshot_from)
85-
8682
print(TEXTS['mirage']['node']['repair']['repair_requested'])

node_cli/mirage/record/chain_record.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,19 @@
1818
# along with this program. If not, see <https://www.gnu.org/licenses/>.
1919

2020

21-
2221
import logging
2322
from typing import cast
2423
from datetime import datetime
2524

25+
from node_cli.core.static_config import get_mirage_chain_name
2626
from node_cli.mirage.record.redis_record import FlatRedisRecord, FieldInfo
2727

2828
logger = logging.getLogger(__name__)
2929

3030

3131
CHAIN_RECORD_FIELDS: dict[str, FieldInfo] = {
3232
'name': FieldInfo('name', str, ''),
33+
'config_version': FieldInfo('config_version', str, '0.0.0'),
3334
'repair_date': FieldInfo('repair_date', datetime, datetime.fromtimestamp(0)),
3435
'repair_ts': FieldInfo('repair_ts', int, None),
3536
'snapshot_from': FieldInfo('snapshot_from', str, None),
@@ -40,6 +41,10 @@ class ChainRecord(FlatRedisRecord):
4041
def _record_fields(self) -> dict[str, FieldInfo]:
4142
return CHAIN_RECORD_FIELDS
4243

44+
@property
45+
def config_version(self) -> str:
46+
return cast(str, self._get_field('config_version'))
47+
4348
@property
4449
def repair_date(self) -> datetime:
4550
return cast(datetime, self._get_field('repair_date'))
@@ -52,6 +57,9 @@ def snapshot_from(self) -> str | None:
5257
def repair_ts(self) -> int | None:
5358
return cast(int | None, self._get_field('repair_ts'))
5459

60+
def set_config_version(self, version: str) -> None:
61+
self._set_field('config_version', version)
62+
5563
def set_repair_date(self, date: datetime) -> None:
5664
self._set_field('repair_date', date)
5765

@@ -60,3 +68,14 @@ def set_snapshot_from(self, value: str | None) -> None:
6068

6169
def set_repair_ts(self, value: int | None) -> None:
6270
self._set_field('repair_ts', value)
71+
72+
73+
def get_mirage_chain_record(env: dict) -> ChainRecord:
74+
return ChainRecord(get_mirage_chain_name(env))
75+
76+
77+
def migrate_chain_record(env: dict) -> None:
78+
version = env['CONTAINER_CONFIGS_STREAM']
79+
logger.info('Migrating mirage chain record, setting config version to %s', version)
80+
record = get_mirage_chain_record(env)
81+
record.set_config_version(version)

node_cli/operations/mirage.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
from node_cli.core.nftables import configure_nftables
3232
from node_cli.core.nginx import generate_nginx_config
3333
from node_cli.migrations.mirage.from_boot import migrate_nftables_from_boot
34+
from node_cli.mirage.record.chain_record import migrate_chain_record
3435
from node_cli.operations.base import checked_host
3536
from node_cli.operations.common import unpack_backup_archive
3637
from node_cli.operations.config_repo import (
@@ -93,6 +94,8 @@ def update_mirage(env_filepath: str, env: dict, update_type: MirageUpdateType) -
9394

9495
if update_type == MirageUpdateType.FROM_BOOT:
9596
migrate_nftables_from_boot()
97+
migrate_chain_record(env)
98+
9699
update_images(env=env, node_type=NodeType.MIRAGE)
97100
compose_up(env=env, node_type=NodeType.MIRAGE)
98101
return True

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ def find_version(*file_paths):
7171
'sh==1.14.2',
7272
'python-crontab==2.6.0',
7373
'requests-mock==1.12.1',
74-
'redis==6.2.0'
74+
'redis==6.2.0',
7575
],
7676
python_requires='>=3.8,<4',
7777
extras_require=extras_require,

tests/cli/node_test.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -322,11 +322,14 @@ def test_backup():
322322
assert 'Backup archive succesfully created ' in result.output
323323

324324

325-
@pytest.mark.parametrize("node_type,test_user_conf", [
326-
(NodeType.REGULAR, "regular_user_conf"),
327-
(NodeType.MIRAGE, "mirage_user_conf"),
328-
(NodeType.SYNC, "sync_user_conf")
329-
])
325+
@pytest.mark.parametrize(
326+
'node_type,test_user_conf',
327+
[
328+
(NodeType.REGULAR, 'regular_user_conf'),
329+
(NodeType.MIRAGE, 'mirage_user_conf'),
330+
(NodeType.SYNC, 'sync_user_conf'),
331+
],
332+
)
330333
def test_restore(request, node_type, test_user_conf, mocked_g_config, tmp_path):
331334
pathlib.Path(SKALE_DIR).mkdir(parents=True, exist_ok=True)
332335
result = run_command(backup_node, [tmp_path])
@@ -392,7 +395,7 @@ def test_turn_off_maintenance_on(mocked_g_config, regular_user_conf):
392395
mock.patch('node_cli.core.node.turn_off_op'),
393396
mock.patch('node_cli.utils.decorators.is_node_inited', return_value=True),
394397
mock.patch('node_cli.configs.user.validate_alias_or_address'),
395-
mock.patch('node_cli.cli.node.TYPE', NodeType.REGULAR)
398+
mock.patch('node_cli.cli.node.TYPE', NodeType.REGULAR),
396399
):
397400
result = run_command_mock(
398401
'node_cli.utils.helper.requests.post',
@@ -425,7 +428,7 @@ def test_turn_on_maintenance_off(mocked_g_config, regular_user_conf):
425428
mock.patch('node_cli.core.node.is_base_containers_alive'),
426429
mock.patch('node_cli.utils.decorators.is_node_inited', return_value=True),
427430
mock.patch('node_cli.configs.user.validate_alias_or_address'),
428-
mock.patch('node_cli.cli.node.TYPE', NodeType.REGULAR)
431+
mock.patch('node_cli.cli.node.TYPE', NodeType.REGULAR),
429432
):
430433
result = run_command_mock(
431434
'node_cli.utils.helper.requests.post',

tests/cli/resources_allocation_test.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ def test_generate(regular_user_conf):
6060
'node_cli.utils.helper.post_request',
6161
resp_mock,
6262
generate,
63-
[regular_user_conf.as_posix(), '--yes']
63+
[regular_user_conf.as_posix(), '--yes'],
6464
)
6565
assert result.output == (
6666
f'Resource allocation file generated: {RESOURCE_ALLOCATION_FILEPATH}\n'
@@ -79,7 +79,7 @@ def test_generate_already_exists(regular_user_conf, resource_alloc_config):
7979
'node_cli.utils.helper.post_request',
8080
resp_mock,
8181
generate,
82-
[regular_user_conf.as_posix(), '--yes']
82+
[regular_user_conf.as_posix(), '--yes'],
8383
)
8484
assert result.output == 'Resource allocation file already exists\n'
8585
assert result.exit_code == 0
@@ -88,7 +88,7 @@ def test_generate_already_exists(regular_user_conf, resource_alloc_config):
8888
'node_cli.utils.helper.post_request',
8989
resp_mock,
9090
generate,
91-
[regular_user_conf.as_posix(), '--yes', '--force']
91+
[regular_user_conf.as_posix(), '--yes', '--force'],
9292
)
9393
assert result.output == (
9494
f'Resource allocation file generated: {RESOURCE_ALLOCATION_FILEPATH}\n'

tests/cli/sync_node_test.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ def test_init_sync(mocked_g_config, clean_node_options, sync_user_conf):
5656

5757
assert result.exit_code == 0
5858

59+
5960
def test_init_sync_archive(mocked_g_config, clean_node_options, sync_user_conf):
6061
pathlib.Path(NODE_DATA_PATH).mkdir(parents=True, exist_ok=True)
6162
with (
@@ -77,7 +78,7 @@ def test_init_sync_archive(mocked_g_config, clean_node_options, sync_user_conf):
7778
mock.patch('node_cli.operations.base.configure_nftables'),
7879
mock.patch('node_cli.utils.decorators.is_node_inited', return_value=False),
7980
mock.patch('node_cli.configs.user.validate_alias_or_address'),
80-
mock.patch('node_cli.cli.node.TYPE', NodeType.SYNC)
81+
mock.patch('node_cli.cli.node.TYPE', NodeType.SYNC),
8182
):
8283
result = run_command(_init_sync, [sync_user_conf.as_posix(), '--archive'])
8384
node_options = NodeOptions()
@@ -105,6 +106,7 @@ def test_init_archive_indexer_fail(mocked_g_config, clean_node_options):
105106
assert result.exit_code == 1
106107
assert 'Cannot use both' in result.output
107108

109+
108110
def test_update_sync(sync_user_conf, mocked_g_config):
109111
pathlib.Path(SKALE_DIR).mkdir(parents=True, exist_ok=True)
110112

0 commit comments

Comments
 (0)