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
109 lines
3.7 KiB
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)
|