예제 #1
0
def test_multiple_mpath_paths_unordered_with_initial_status(monkeypatch):
    def fake_status():
        return {
            'uuid-1': [
                PathStatus('sda', 'F'),
                PathStatus('sdb', 'A'),
                PathStatus('sdc', 'A'),
                PathStatus('sdd', 'A'),
            ]
        }

    monkeypatch.setattr(devicemapper, 'multipath_status', fake_status)

    monitor = mpathhealth.Monitor()
    monitor.start()

    events = [
        udev.MultipathEvent(udev.PATH_FAILED, "uuid-1", "sdb", 1, 13),
        udev.MultipathEvent(udev.PATH_FAILED, "uuid-1", "sdb", 2, 12),
    ]
    for e in events:
        monitor.handle(e)
    expected = {
        "uuid-1": {
            "valid_paths": 1,
            "failed_paths": [
                "sda",
                "sdb",
            ]
        }
    }
    assert monitor.status() == expected
예제 #2
0
def test_removed():
    monitor = mpathhealth.Monitor()
    event = udev.MultipathEvent(udev.PATH_FAILED, "uuid-1", "sda", 1, 10)
    monitor.handle(event)
    event = udev.MultipathEvent(udev.MPATH_REMOVED, "uuid-1", None, None, None)
    monitor.handle(event)
    assert monitor.status() == {}
예제 #3
0
def test_reinstated_last_path():
    monitor = mpathhealth.Monitor()
    events = [
        udev.MultipathEvent(udev.PATH_FAILED, "uuid-1", "sdaa", 1, 10),
        udev.MultipathEvent(udev.PATH_REINSTATED, "uuid-1", "sdaa", 2, 11)
    ]
    for e in events:
        monitor.handle(e)
    assert monitor.status() == {}
예제 #4
0
def tmp_monitor(monkeypatch):
    monkeypatch.setattr(
        devicemapper, "multipath_status", FakeMultipathStatus())
    monitor = mpathhealth.Monitor(MONITOR_INTERVAL)
    monitor.callback = MonitorCallback()
    yield monitor
    # Do not hang the monitor cycles when we are about to stop
    monitor.callback.resume()
    monitor.stop()
    monitor.wait()
예제 #5
0
def test_reinstated__path():
    monitor = mpathhealth.Monitor()
    events = [
        udev.MultipathEvent(udev.PATH_FAILED, "uuid-1", "sdaa", 2, 10),
        udev.MultipathEvent(udev.PATH_FAILED, "uuid-1", "sdab", 1, 11),
        udev.MultipathEvent(udev.PATH_REINSTATED, "uuid-1", "sdaa", 2, 12)
    ]
    for e in events:
        monitor.handle(e)
    expected = {"uuid-1": {"valid_paths": 2, "failed_paths": ["sdab"]}}
    assert monitor.status() == expected
예제 #6
0
def test_start_all_active(monkeypatch):
    def fake_status():
        return {
            'uuid-1': [
                PathStatus('sda', 'A'),
                PathStatus('sdb', 'A'),
                PathStatus('sdc', 'A')
            ]
        }

    monkeypatch.setattr(devicemapper, 'multipath_status', fake_status)

    monitor = mpathhealth.Monitor()
    monitor.start()
    assert monitor.status() == {}
예제 #7
0
def test_start_some_failed(monkeypatch):
    def fake_status():
        return {
            'uuid-1': [
                PathStatus('sda', 'F'),
                PathStatus('sdb', 'A'),
                PathStatus('sdc', 'A')
            ]
        }

    monkeypatch.setattr(devicemapper, 'multipath_status', fake_status)

    monitor = mpathhealth.Monitor()
    monitor.start()
    expected = {"uuid-1": {"valid_paths": 2, "failed_paths": ["sda"]}}
    assert monitor.status() == expected
예제 #8
0
def test_multiple_mpath_paths_unordered():
    monitor = mpathhealth.Monitor()
    events = [
        udev.MultipathEvent(udev.PATH_FAILED, "uuid-1", "sda", 2, 13),
        udev.MultipathEvent(udev.PATH_FAILED, "uuid-1", "sdb", 3, 12),
    ]
    for e in events:
        monitor.handle(e)
    expected = {
        "uuid-1": {
            "valid_paths": 2,
            "failed_paths": [
                "sda",
                "sdb",
            ]
        }
    }
    assert monitor.status() == expected
예제 #9
0
def test_multiple_mpath():
    monitor = mpathhealth.Monitor()
    events = [
        udev.MultipathEvent(udev.PATH_FAILED, "uuid-1", "sdaa", 1, 10),
        udev.MultipathEvent(udev.PATH_FAILED, "uuid-2", "sdba", 2, 11)
    ]
    for e in events:
        monitor.handle(e)
    expected = {
        "uuid-2": {
            "valid_paths": 2,
            "failed_paths": ["sdba"]
        },
        "uuid-1": {
            "valid_paths": 1,
            "failed_paths": ["sdaa"]
        }
    }
    assert monitor.status() == expected
예제 #10
0
def test_events_after_start(monkeypatch):
    def fake_status():
        return {
            'uuid-1': [
                PathStatus('sda', 'F'),
                PathStatus('sdb', 'A'),
                PathStatus('sdc', 'A')
            ]
        }

    monkeypatch.setattr(devicemapper, 'multipath_status', fake_status)

    monitor = mpathhealth.Monitor()
    monitor.start()

    events = [
        udev.MultipathEvent(udev.PATH_FAILED, "uuid-1", "sdb", 1, 10),
        udev.MultipathEvent(udev.PATH_FAILED, "uuid-1", "sdc", 0, 11),
        udev.MultipathEvent(udev.PATH_REINSTATED, "uuid-1", "sda", 1, 12)
    ]
    for e in events:
        monitor.handle(e)
    expected = {"uuid-1": {"valid_paths": 1, "failed_paths": ["sdb", "sdc"]}}
    assert monitor.status() == expected
예제 #11
0
def test_removed_not_existing():
    monitor = mpathhealth.Monitor()
    event = udev.MultipathEvent(udev.MPATH_REMOVED, "uuid-1", None, None, None)
    monitor.handle(event)
    assert monitor.status() == {}
예제 #12
0
def test_failed_path():
    monitor = mpathhealth.Monitor()
    event = udev.MultipathEvent(udev.PATH_FAILED, "uuid-1", "sda", 1, 10)
    monitor.handle(event)
    expected = {"uuid-1": {"valid_paths": 1, "failed_paths": ["sda"]}}
    assert monitor.status() == expected
예제 #13
0
def test_no_events():
    monitor = mpathhealth.Monitor()
    assert monitor.status() == {}
예제 #14
0
def test_reinstated_path_no_mpath():
    monitor = mpathhealth.Monitor()
    event = udev.MultipathEvent(udev.PATH_REINSTATED, "uuid-1", "sdaa", 1, 10)
    monitor.handle(event)
    assert monitor.status() == {}