You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

109 lines
3.7 KiB

10 months ago
import os
import pytest
from leapp.libraries.common import mdraid
from leapp.libraries.common.testutils import logger_mocked
from leapp.libraries.stdlib import api, CalledProcessError
MD_DEVICE = '/dev/md0'
NOT_MD_DEVICE = '/dev/sda'
CUR_DIR = os.path.dirname(os.path.abspath(__file__))
def raise_call_error(args=None):
raise CalledProcessError(
message='A Leapp Command Error occurred.',
command=args,
result={'signal': None, 'exit_code': 1, 'pid': 0, 'stdout': 'fake', 'stderr': 'fake'}
)
class RunMocked(object):
def __init__(self, raise_err=False):
self.called = 0
self.args = None
self.raise_err = raise_err
def __call__(self, args, encoding=None):
self.called += 1
self.args = args
if self.raise_err:
raise_call_error(args)
if self.args == ['mdadm', '--query', MD_DEVICE]:
stdout = '/dev/md0: 1022.00MiB raid1 2 devices, 0 spares. Use mdadm --detail for more detail.'
elif self.args == ['mdadm', '--query', NOT_MD_DEVICE]:
stdout = '/dev/sda: is not an md array'
elif self.args == ['mdadm', '--detail', '--verbose', '--brief', MD_DEVICE]:
stdout = 'ARRAY /dev/md0 level=raid1 num-devices=2 metadata=1.2 name=localhost.localdomain:0 UUID=c4acea6e:d56e1598:91822e3f:fb26832c\n devices=/dev/sda1,/dev/sdb1' # noqa: E501; pylint: disable=line-too-long
elif self.args == ['mdadm', '--detail', '--verbose', '--brief', NOT_MD_DEVICE]:
stdout = 'mdadm: /dev/sda does not appear to be an md device'
return {'stdout': stdout}
@pytest.mark.parametrize('dev,expected', [(MD_DEVICE, True), (NOT_MD_DEVICE, False)])
def test_is_mdraid_dev(monkeypatch, dev, expected):
run_mocked = RunMocked()
monkeypatch.setattr(mdraid, 'run', run_mocked)
monkeypatch.setattr(api, 'current_logger', logger_mocked())
monkeypatch.setattr(os.path, 'exists', lambda dummy: True)
result = mdraid.is_mdraid_dev(dev)
assert mdraid.run.called == 1
assert expected == result
assert not api.current_logger.warnmsg
def test_is_mdraid_dev_error(monkeypatch):
run_mocked = RunMocked(raise_err=True)
monkeypatch.setattr(mdraid, 'run', run_mocked)
monkeypatch.setattr(api, 'current_logger', logger_mocked())
monkeypatch.setattr(os.path, 'exists', lambda dummy: True)
with pytest.raises(CalledProcessError) as err:
mdraid.is_mdraid_dev(MD_DEVICE)
assert mdraid.run.called == 1
expect_msg = 'Could not check if device "{}" is an md device:'.format(MD_DEVICE)
assert expect_msg in err.value.message
def test_is_mdraid_dev_notool(monkeypatch):
run_mocked = RunMocked(raise_err=True)
monkeypatch.setattr(mdraid, 'run', run_mocked)
monkeypatch.setattr(api, 'current_logger', logger_mocked())
monkeypatch.setattr(os.path, 'exists', lambda dummy: False)
result = mdraid.is_mdraid_dev(MD_DEVICE)
assert not result
assert not mdraid.run.called
assert api.current_logger.warnmsg
def test_get_component_devices_ok(monkeypatch):
run_mocked = RunMocked()
monkeypatch.setattr(mdraid, 'run', run_mocked)
monkeypatch.setattr(api, 'current_logger', logger_mocked())
result = mdraid.get_component_devices(MD_DEVICE)
assert mdraid.run.called == 1
assert ['/dev/sda1', '/dev/sdb1'] == result
assert not api.current_logger.warnmsg
def test_get_component_devices_not_md_device(monkeypatch):
run_mocked = RunMocked()
monkeypatch.setattr(mdraid, 'run', run_mocked)
with pytest.raises(ValueError) as err:
mdraid.get_component_devices(NOT_MD_DEVICE)
assert mdraid.run.called == 1
expect_msg = 'Expected md device, but got: {}'.format(NOT_MD_DEVICE)
assert expect_msg in str(err.value)