Skip to content

Commit

Permalink
Merge pull request #721 from skalenetwork/develop
Browse files Browse the repository at this point in the history
2.3.x with hotfixes beta (2.1.1 release)
  • Loading branch information
DmytroNazarenko authored Apr 18, 2023
2 parents 2a36e6d + 5e2e480 commit 56a9e32
Show file tree
Hide file tree
Showing 10 changed files with 119 additions and 24 deletions.
2 changes: 1 addition & 1 deletion lvmpy
Submodule lvmpy updated 3 files
+3 −24 src/app.py
+4 −4 src/core.py
+65 −0 src/log.py
10 changes: 8 additions & 2 deletions node_cli/cli/node.py
Original file line number Diff line number Diff line change
Expand Up @@ -131,9 +131,15 @@ def backup_node(backup_folder_path):
@node.command('restore', help="Restore SKALE node on another machine")
@click.argument('backup_path')
@click.argument('env_file')
@click.option(
'--no-snapshot',
help='Do not restore sChains from snapshot',
is_flag=True,
hidden=True
)
@streamed_cmd
def restore_node(backup_path, env_file):
restore(backup_path, env_file)
def restore_node(backup_path, env_file, no_snapshot):
restore(backup_path, env_file, no_snapshot)


@node.command('maintenance-on', help="Set SKALE node into maintenance mode")
Expand Down
8 changes: 6 additions & 2 deletions node_cli/core/node.py
Original file line number Diff line number Diff line change
Expand Up @@ -143,13 +143,17 @@ def init(env_filepath):


@check_not_inited
def restore(backup_path, env_filepath):
def restore(backup_path, env_filepath, no_snapshot=False):
env = get_node_env(env_filepath)
if env is None:
return
save_env_params(env_filepath)
env['SKALE_DIR'] = SKALE_DIR
env['BACKUP_RUN'] = 'True' # should be str

if not no_snapshot:
logger.info('Adding BACKUP_RUN to env ...')
env['BACKUP_RUN'] = 'True' # should be str

restored_ok = restore_op(env, backup_path)
if not restored_ok:
error_exit(
Expand Down
13 changes: 10 additions & 3 deletions node_cli/operations/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.

import distro
import functools
import logging
from typing import Dict, Optional
Expand Down Expand Up @@ -128,7 +129,9 @@ def update(env_filepath: str, env: Dict) -> None:
update_meta(
VERSION,
env['CONTAINER_CONFIGS_STREAM'],
env['DOCKER_LVMPY_STREAM']
env['DOCKER_LVMPY_STREAM'],
distro.id(),
distro.version()
)
update_images(env.get('CONTAINER_CONFIGS_DIR') != '')
compose_up(env)
Expand Down Expand Up @@ -166,7 +169,9 @@ def init(env_filepath: str, env: Dict, snapshot_from: Optional[str] = None) -> b
update_meta(
VERSION,
env['CONTAINER_CONFIGS_STREAM'],
env['DOCKER_LVMPY_STREAM']
env['DOCKER_LVMPY_STREAM'],
distro.id(),
distro.version()
)
update_resource_allocation(
disk_device=env['DISK_MOUNTPOINT'],
Expand Down Expand Up @@ -213,7 +218,9 @@ def restore(env, backup_path):
update_meta(
VERSION,
env['CONTAINER_CONFIGS_STREAM'],
env['DOCKER_LVMPY_STREAM']
env['DOCKER_LVMPY_STREAM'],
distro.id(),
distro.version()
)
update_resource_allocation(
disk_device=env['DISK_MOUNTPOINT'],
Expand Down
16 changes: 10 additions & 6 deletions node_cli/utils/meta.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,23 @@
DEFAULT_VERSION = '1.0.0'
DEFAULT_CONFIG_STREAM = '1.1.0'
DEFAULT_DOCKER_LVMPY_STREAM = '1.0.0'
DEFAULT_OS_ID = 'ubuntu'
DEFAULT_OS_VERSION = '18.04'


class CliMeta(
namedtuple(
'Node',
['version', 'config_stream', 'docker_lvmpy_stream']
['version', 'config_stream', 'docker_lvmpy_stream', 'os_id', 'os_version']
)
):
__slots__ = ()

def __new__(cls, version=DEFAULT_VERSION, config_stream=DEFAULT_CONFIG_STREAM,
docker_lvmpy_stream=DEFAULT_DOCKER_LVMPY_STREAM):
docker_lvmpy_stream=DEFAULT_DOCKER_LVMPY_STREAM, os_id=DEFAULT_OS_ID,
os_version=DEFAULT_OS_VERSION):
return super(CliMeta, cls).__new__(
cls, version, config_stream, docker_lvmpy_stream
cls, version, config_stream, docker_lvmpy_stream, os_id, os_version
)


Expand All @@ -41,7 +44,8 @@ def save_meta(meta: CliMeta) -> None:
def compose_default_meta() -> CliMeta:
return CliMeta(version=DEFAULT_VERSION,
docker_lvmpy_stream=DEFAULT_DOCKER_LVMPY_STREAM,
config_stream=DEFAULT_CONFIG_STREAM)
config_stream=DEFAULT_CONFIG_STREAM, os_id=DEFAULT_OS_ID,
os_version=DEFAULT_OS_VERSION)


def ensure_meta(meta: CliMeta = None) -> None:
Expand All @@ -51,7 +55,7 @@ def ensure_meta(meta: CliMeta = None) -> None:


def update_meta(version: str, config_stream: str,
docker_lvmpy_stream: str) -> None:
docker_lvmpy_stream: str, os_id: str, os_version: str) -> None:
ensure_meta()
meta = CliMeta(version, config_stream, docker_lvmpy_stream)
meta = CliMeta(version, config_stream, docker_lvmpy_stream, os_id, os_version)
save_meta(meta)
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ def find_version(*file_paths):
install_requires=[
"click==8.1.3",
"PyInstaller==5.6.2",
"distro==1.4.0",
"docker==6.0.1",
"texttable==1.6.4",
"python-dateutil==2.8.2",
Expand Down
35 changes: 31 additions & 4 deletions tests/cli/node_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import pathlib

import mock
from unittest.mock import MagicMock, patch
import requests
import logging

Expand Down Expand Up @@ -302,17 +303,43 @@ def test_restore(mocked_g_config):
)
backup_path = result.output.replace(
'Backup archive successfully created: ', '').replace('\n', '')
with mock.patch('subprocess.run', new=subprocess_run_mock), \
mock.patch('node_cli.core.node.restore_op'), \
mock.patch('node_cli.core.resources.get_disk_size', return_value=BIG_DISK_SIZE), \
mock.patch('node_cli.utils.decorators.is_node_inited', return_value=False):

with patch('node_cli.core.node.restore_op', MagicMock()) as mock_restore_op, \
patch('subprocess.run', new=subprocess_run_mock), \
patch('node_cli.core.resources.get_disk_size', return_value=BIG_DISK_SIZE), \
patch('node_cli.utils.decorators.is_node_inited', return_value=False):
result = run_command(
restore_node,
[backup_path, './tests/test-env']
)
assert result.exit_code == 0
assert 'Node is restored from backup\n' in result.output # noqa

assert mock_restore_op.call_args[0][0].get('BACKUP_RUN') == 'True'


def test_restore_no_snapshot(mocked_g_config):
pathlib.Path(SKALE_DIR).mkdir(parents=True, exist_ok=True)
result = run_command(
backup_node,
['/tmp']
)
backup_path = result.output.replace(
'Backup archive successfully created: ', '').replace('\n', '')

with patch('node_cli.core.node.restore_op', MagicMock()) as mock_restore_op, \
patch('subprocess.run', new=subprocess_run_mock), \
patch('node_cli.core.resources.get_disk_size', return_value=BIG_DISK_SIZE), \
patch('node_cli.utils.decorators.is_node_inited', return_value=False):
result = run_command(
restore_node,
[backup_path, './tests/test-env', '--no-snapshot']
)
assert result.exit_code == 0
assert 'Node is restored from backup\n' in result.output # noqa

assert mock_restore_op.call_args[0][0].get('BACKUP_RUN') is None


def test_maintenance_on():
resp_mock = response_mock(
Expand Down
12 changes: 11 additions & 1 deletion tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
from node_cli.configs.resource_allocation import RESOURCE_ALLOCATION_FILEPATH
from node_cli.utils.global_config import generate_g_config_file

from tests.helper import TEST_META_V1, TEST_META_V2
from tests.helper import TEST_META_V1, TEST_META_V2, TEST_META_V3


TEST_ENV_PARAMS = """
Expand Down Expand Up @@ -221,6 +221,16 @@ def meta_file_v2():
os.remove(META_FILEPATH)


@pytest.fixture
def meta_file_v3():
with open(META_FILEPATH, 'w') as f:
json.dump(TEST_META_V3, f)
try:
yield META_FILEPATH
finally:
os.remove(META_FILEPATH)


@pytest.fixture
def ensure_meta_removed():
try:
Expand Down
8 changes: 8 additions & 0 deletions tests/helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,14 @@

}

TEST_META_V3 = {
'version': '0.1.1',
'config_stream': 'develop',
'docker_lvmpy_stream': '1.1.2',
'os_id': 'ubuntu',
'os_version': '18.04'
}


def response_mock(status_code=0, json_data=None,
headers=None, raw=None):
Expand Down
38 changes: 33 additions & 5 deletions tests/tools_meta_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
ensure_meta, get_meta_info,
save_meta, update_meta
)
from tests.helper import TEST_META_V1, TEST_META_V2
from tests.helper import TEST_META_V1, TEST_META_V2, TEST_META_V3


def test_get_meta_info_v1(meta_file_v1):
Expand All @@ -24,6 +24,15 @@ def test_get_meta_info_v2(meta_file_v2):
assert meta.docker_lvmpy_stream == TEST_META_V2['docker_lvmpy_stream']


def test_get_meta_info_v3(meta_file_v3):
meta = get_meta_info()
assert meta.version == TEST_META_V3['version']
assert meta.config_stream == TEST_META_V3['config_stream']
assert meta.docker_lvmpy_stream == TEST_META_V3['docker_lvmpy_stream']
assert meta.os_id == TEST_META_V3['os_id']
assert meta.os_version == TEST_META_V3['os_version']


def test_get_meta_info_empty():
meta = get_meta_info()
assert meta is None
Expand All @@ -34,6 +43,8 @@ def test_compose_default_meta():
assert meta.version == '1.0.0'
assert meta.config_stream == '1.1.0'
assert meta.docker_lvmpy_stream == '1.0.0'
assert meta.os_id == 'ubuntu'
assert meta.os_version == '18.04'


def test_save_meta(meta_file_v2):
Expand All @@ -44,28 +55,45 @@ def test_save_meta(meta_file_v2):
assert saved_json == {
'version': '1.1.2',
'config_stream': '2.2.2',
'docker_lvmpy_stream': '1.0.0'
'docker_lvmpy_stream': '1.0.0',
'os_id': 'ubuntu',
'os_version': '18.04',
}


def test_update_meta(meta_file_v2):
def test_update_meta_from_v2_to_v3(meta_file_v2):
old_meta = get_meta_info()
update_meta(version='3.3.3', config_stream='1.1.1',
docker_lvmpy_stream='1.2.2')
docker_lvmpy_stream='1.2.2', os_id='debian', os_version='11')
meta = get_meta_info()
assert meta.version == '3.3.3'
assert meta.config_stream == '1.1.1'
assert meta.docker_lvmpy_stream == '1.2.2'
assert meta.os_id == 'debian'
assert meta.os_version == '11'
assert meta != old_meta


def test_update_meta_from_v1(meta_file_v1):
update_meta(version='4.4.4', config_stream='beta',
docker_lvmpy_stream='1.3.3')
docker_lvmpy_stream='1.3.3', os_id='debian', os_version='11')
meta = get_meta_info()
assert meta.version == '4.4.4'
assert meta.config_stream == 'beta'
assert meta.docker_lvmpy_stream == '1.3.3'
assert meta.os_id == 'debian'
assert meta.os_version == '11'


def test_update_meta_from_v3(meta_file_v3):
update_meta(version='5.5.5', config_stream='stable',
docker_lvmpy_stream='1.2.3', os_id='ubuntu', os_version='20.04')
meta = get_meta_info()
assert meta.version == '5.5.5'
assert meta.config_stream == 'stable'
assert meta.docker_lvmpy_stream == '1.2.3'
assert meta.os_id == 'ubuntu'
assert meta.os_version == '20.04'


def test_ensure_meta(ensure_meta_removed):
Expand Down

0 comments on commit 56a9e32

Please sign in to comment.