def test_cas_settle_no_config(mock_config): """ Check if raises exception when no config is found """ mock_config.side_effect = ValueError with pytest.raises(Exception): opencas.wait_for_startup()
def test_last_resort_add_01(mock_start, mock_add, mock_exists, mock_run, mock_list, mock_config): """ Check if adding cores/starting caches is not attempted while waiting for startup if paths to devices don't exist. """ mock_config.return_value = Mock( spec_set=opencas.cas_config(), caches={ 1: opencas.cas_config.cache_config(1, "/dev/lizards", "wt"), 2: opencas.cas_config.cache_config(2, "/dev/chemtrails", "wo"), }, cores=[ opencas.cas_config.core_config(1, 1, "/dev/dummy"), opencas.cas_config.core_config(2, 1, "/dev/dosko"), ], ) mock_exists.return_value = False result = opencas.wait_for_startup(timeout=0, interval=0) mock_add.assert_not_called() mock_start.assert_not_called() mock_run.assert_called_with(["udevadm", "settle"])
def test_last_resort_add_02(mock_start, mock_add, mock_exists, mock_run, mock_list, mock_config): """ Check if adding cores/starting caches is attempted while waiting for startup. """ config = Mock( spec_set=opencas.cas_config(), caches={ 1: opencas.cas_config.cache_config(1, "/dev/lizards", "wt"), 2: opencas.cas_config.cache_config(2, "/dev/wartortle", "wo"), }, cores=[ opencas.cas_config.core_config(1, 1, "/dev/dummy"), opencas.cas_config.core_config(2, 1, "/dev/dosko"), ], ) mock_config.return_value = config mock_exists.return_value = True result = opencas.wait_for_startup(timeout=0, interval=0) mock_start.assert_any_call(config.caches[1], True) mock_start.assert_any_call(config.caches[2], True) mock_add.assert_any_call(config.cores[0], True) mock_add.assert_any_call(config.cores[1], True) mock_run.assert_called_with(["udevadm", "settle"])
def test_cas_settle_cores_didnt_start_01(mock_list, mock_config): """ Check if properly returns uninitialized cores and waits for given time Single core in config, no devices in runtime config. """ mock_config.return_value.get_startup_cores.return_value = [ opencas.cas_config.core_config(42, 13, "/dev/dummy") ] time_start = time.time() result = opencas.wait_for_startup(timeout=5, interval=1) time_stop = time.time() assert len(result) == 1, "didn't return single uninitialized core" assert ( result[0].cache_id == 42 and result[0].core_id == 13 and result[0].device == "/dev/dummy" ) assert 4.5 < time_stop - time_start < 5.5, "didn't wait the right amount of time" assert mock_list.call_count == 5
def test_last_resort_add_03(mock_start, mock_add, mock_exists, mock_run, mock_list, mock_config): """ Check if adding cores/starting caches is not attempted while waiting for startup if paths to devices show up after expiring waiting timeout. """ config = Mock( spec_set=opencas.cas_config(), caches={ 1: opencas.cas_config.cache_config(1, "/dev/lizards", "wt"), 2: opencas.cas_config.cache_config(2, "/dev/aerodactyl", "wo"), }, cores=[ opencas.cas_config.core_config(1, 1, "/dev/dummy"), opencas.cas_config.core_config(2, 1, "/dev/dosko"), ], ) mock_config.return_value = config mock_exists.side_effect = _exists_mock(time.time() + 10) result = opencas.wait_for_startup(timeout=0.5, interval=0.1) mock_start.assert_not_called() mock_add.assert_not_called() mock_run.assert_called_with(["udevadm", "settle"])
def test_last_resort_add_04(mock_start, mock_add, mock_exists, mock_run, mock_list, mock_config): """ Check if adding cores/starting caches is attempted while waiting for startup for lazy_startup devices once before returning. """ config = Mock( spec_set=opencas.cas_config(), caches={ 1: opencas.cas_config.cache_config(1, "/dev/lizards", "wt", lazy_startup="true"), 2: opencas.cas_config.cache_config(2, "/dev/chemtrails", "wo", lazy_startup="true"), }, cores=[ opencas.cas_config.core_config(1, 1, "/dev/sandshrew", lazy_startup="true"), opencas.cas_config.core_config(2, 1, "/dev/dosko", lazy_startup="true"), ], ) mock_config.return_value = config mock_exists.return_value = True result = opencas.wait_for_startup(timeout=0.5, interval=0.1) mock_start.assert_any_call(config.caches[1], True) mock_start.assert_any_call(config.caches[2], True) assert mock_start.call_count == 2, "start cache was called more than once per device" mock_add.assert_any_call(config.cores[0], True) mock_add.assert_any_call(config.cores[1], True) assert mock_add.call_count == 2, "add core was called more than once per device" mock_run.assert_called_with(["udevadm", "settle"])
def test_last_resort_add_04(mock_start, mock_add, mock_exists, mock_run, mock_list, mock_config): """ Check if adding cores/starting caches is attempted while waiting for startup if paths to devices show up after half of the waiting timeout expires. """ config = Mock( spec_set=opencas.cas_config(), caches={ 1: opencas.cas_config.cache_config(1, "/dev/lizards", "wt"), 2: opencas.cas_config.cache_config(2, "/dev/chemtrails", "wo"), }, cores=[ opencas.cas_config.core_config(1, 1, "/dev/sandshrew"), opencas.cas_config.core_config(2, 1, "/dev/dosko"), ], ) mock_config.return_value = config mock_exists.side_effect = _exists_mock(time.time() + 1) result = opencas.wait_for_startup(timeout=2, interval=0.1) mock_start.assert_any_call(config.caches[1], True) mock_start.assert_any_call(config.caches[2], True) mock_add.assert_any_call(config.cores[0], True) mock_add.assert_any_call(config.cores[1], True) mock_run.assert_called_with(["udevadm", "settle"])
def test_cas_settle_cores_didnt_start_02(mock_list, mock_config): """ Check if properly returns uninitialized cores and waits for given time Single device in config, one device in runtime config, but not the configured core """ mock_config.return_value.get_startup_cores.return_value = [ opencas.cas_config.core_config(1, 1, "/dev/dummy") ] mock_list.return_value = [ { "type": "cache", "id": "1", "disk": "/dev/dummy_cache", "status": "Active", "write policy": "wt", "device": "-", } ] time_start = time.time() result = opencas.wait_for_startup(timeout=1, interval=0.1) time_stop = time.time() assert len(result) == 1, "didn't return uninitialized core" assert 0.5 < time_stop - time_start < 1.5, "didn't wait the right amount of time"
def test_cas_settle_cores_didnt_start_02(mock_add, mock_exists, mock_run, mock_list, mock_config): """ Check if properly returns uninitialized cores and waits for given time Single device in config, one device in runtime config, but not the configured core """ mock_config.return_value = Mock( spec_set=opencas.cas_config(), caches={}, cores=[opencas.cas_config.core_config(1, 1, "/dev/dummy")], ) mock_list.return_value = [{ "type": "cache", "id": "1", "disk": "/dev/dummy_cache", "status": "Active", "write policy": "wt", "device": "-", }] result = opencas.wait_for_startup(timeout=0, interval=0) assert len(result) == 1, "didn't return uninitialized core"
def test_cas_settle_cores_didnt_start_04(mock_list, mock_config): """ Check if properly returns uninitialized cores Two devices configured, both not present. """ mock_config.return_value.get_startup_cores.return_value = [ opencas.cas_config.core_config(1, 1, "/dev/dummy"), opencas.cas_config.core_config(4, 44, "/dev/dosko"), ] mock_list.return_value = [ { "type": "cache", "id": "1", "disk": "/dev/dummy_cache", "status": "Incomplete", "write policy": "wt", "device": "-", }, { "type": "core", "id": "1", "disk": "/dev/dummy", "status": "Inactive", "write policy": "-", "device": "/dev/cas1-1", }, { "type": "core", "id": "2", "disk": "/dev/dummy3", "status": "Active", "write policy": "-", "device": "/dev/cas1-2", }, { "type": "cache", "id": "2", "disk": "/dev/dummy_cache2", "status": "Running", "write policy": "wb", "device": "-", }, { "type": "core", "id": "3", "disk": "/dev/dummy2", "status": "Active", "write policy": "-", "device": "/dev/cas2-3", }, ] result = opencas.wait_for_startup(timeout=1, interval=0.1) assert len(result) == 2, "didn't return uninitialized cores"
def test_cas_settle_cores_didnt_start_02(mock_list, mock_config): """ Check if properly returns uninitialized cores and waits for given time The device waited for is in core pool. """ mock_config.return_value.get_startup_cores.return_value = [ opencas.cas_config.core_config(1, 1, "/dev/dummy") ] mock_list.return_value = [ { "type": "core pool", "id": "-", "disk": "-", "status": "-", "write policy": "-", "device": "-", }, { "type": "core", "id": "-", "disk": "/dev/dummy", "status": "Detached", "write policy": "-", "device": "-", }, { "type": "cache", "id": "2", "disk": "/dev/dummy_cache", "status": "Running", "write policy": "wt", "device": "-", }, { "type": "core", "id": "42", "disk": "/dev/other_core", "status": "Active", "write policy": "-", "device": "/dev/cas2-42", }, ] time_start = time.time() result = opencas.wait_for_startup(timeout=1, interval=0.1) time_stop = time.time() assert len(result) == 1, "didn't return uninitialized core" assert 0.5 < time_stop - time_start < 1.5, "didn't wait the right amount of time" # Assert the call count is within some small range in case something freezes up for a second assert 9 <= mock_list.call_count <= 11
def test_cas_settle_cores_didnt_start_03(mock_add, mock_exists, mock_run, mock_list, mock_config): """ Check if properly returns uninitialized cores and waits for given time The device waited for is in core pool. """ mock_config.return_value = Mock( spec_set=opencas.cas_config(), caches={}, cores=[opencas.cas_config.core_config(1, 1, "/dev/dummy")], ) mock_list.return_value = [ { "type": "core pool", "id": "-", "disk": "-", "status": "-", "write policy": "-", "device": "-", }, { "type": "core", "id": "-", "disk": "/dev/dummy", "status": "Detached", "write policy": "-", "device": "-", }, { "type": "cache", "id": "2", "disk": "/dev/dummy_cache", "status": "Running", "write policy": "wt", "device": "-", }, { "type": "core", "id": "42", "disk": "/dev/other_core", "status": "Active", "write policy": "-", "device": "/dev/cas2-42", }, ] result = opencas.wait_for_startup(timeout=0, interval=0) assert len(result) == 0
def test_cas_settle_caches_didnt_start_01(mock_start, mock_exists, mock_run, mock_list, mock_config): """ Check if properly returns uninitialized caches and waits for given time Single cache in config, no devices in runtime config. """ mock_config.return_value = Mock( spec_set=opencas.cas_config(), cores=[], caches={42: opencas.cas_config.cache_config(42, "/dev/dummy", "wt")}, ) result = opencas.wait_for_startup(timeout=0, interval=0) assert len(result) == 1, "didn't return single uninitialized cache" assert result[0].cache_id == 42 and result[0].device == "/dev/dummy"
def test_cas_settle_cores_didnt_start_01(mock_add, mock_exists, mock_run, mock_list, mock_config): """ Check if properly returns uninitialized cores and waits for given time Single core in config, no devices in runtime config. """ mock_config.return_value = Mock( spec_set=opencas.cas_config(), caches={}, cores=[opencas.cas_config.core_config(42, 13, "/dev/dummy")], ) time_start = time.time() result = opencas.wait_for_startup(timeout=3, interval=1) time_stop = time.time() assert len(result) == 1, "didn't return single uninitialized core" assert result[0].cache_id == 42 and result[0].core_id == 13 and result[0].device == "/dev/dummy" assert 2.5 < time_stop - time_start < 3.5, "didn't wait the right amount of time"
def test_cas_settle_caches_didnt_start_03(mock_start, mock_exists, mock_run, mock_list, mock_config): """ Check if properly returns uninitialized caches Two devices configured, both not present. """ mock_config.return_value = Mock( spec_set=opencas.cas_config(), cores=[], caches={ 1: opencas.cas_config.cache_config(1, "/dev/dummy", "wt"), 4: opencas.cas_config.cache_config(4, "/dev/dosko", "wo"), }, ) mock_list.return_value = [ { "type": "cache", "id": "8", "disk": "/dev/dummy_cache", "status": "Incomplete", "write policy": "wt", "device": "-", }, { "type": "core", "id": "1", "disk": "/dev/yes", "status": "Inactive", "write policy": "-", "device": "/dev/cas1-1", }, { "type": "core", "id": "2", "disk": "/dev/dummy3", "status": "Active", "write policy": "-", "device": "/dev/cas1-2", }, { "type": "cache", "id": "2", "disk": "/dev/dummy_cache2", "status": "Running", "write policy": "wb", "device": "-", }, { "type": "core", "id": "3", "disk": "/dev/dummy2", "status": "Active", "write policy": "-", "device": "/dev/cas2-3", }, ] result = opencas.wait_for_startup(timeout=0, interval=0) assert len(result) == 2, "didn't return uninitialized cores"
def test_cas_settle_core_started_02(mock_add, mock_exists, mock_run, mock_list, mock_config): """ Check if properly returns uninitialized cores and doesn't return initialized ones Two devices configured, both present and added. """ mock_config.return_value = Mock( spec_set=opencas.cas_config(), caches={}, cores=[ opencas.cas_config.core_config(1, 1, "/dev/dummy"), opencas.cas_config.core_config(4, 44, "/dev/dosko"), ], ) mock_list.return_value = [ { "type": "core pool", "id": "-", "disk": "-", "status": "-", "write policy": "-", "device": "-", }, { "type": "core", "id": "-", "disk": "/dev/other_core", "status": "Detached", "write policy": "-", "device": "-", }, { "type": "cache", "id": "1", "disk": "/dev/dummy_cache", "status": "Running", "write policy": "wt", "device": "-", }, { "type": "core", "id": "1", "disk": "/dev/dummy", "status": "Active", "write policy": "-", "device": "/dev/cas1-42", }, { "type": "cache", "id": "2", "disk": "/dev/dummy_cache2", "status": "Running", "write policy": "wb", "device": "-", }, { "type": "core", "id": "3", "disk": "/dev/dummy2", "status": "Active", "write policy": "-", "device": "/dev/cas1-42", }, { "type": "cache", "id": "4", "disk": "/dev/dummy_cache4", "status": "Running", "write policy": "wb", "device": "-", }, { "type": "core", "id": "44", "disk": "/dev/dosko", "status": "Active", "write policy": "-", "device": "/dev/cas4-44", }, ] result = opencas.wait_for_startup(timeout=0, interval=0) assert len(result) == 0, "no cores should remain uninitialized"
def test_cas_settle_core_started_03(mock_add, mock_exists, mock_run, mock_list, mock_config): """ Check if properly returns uninitialized cores and doesn't return initialized ones Two devices configured, simulate them gradually showing up with each call to get_caches_list() """ mock_config.return_value = Mock( spec_set=opencas.cas_config(), caches={}, cores=[ opencas.cas_config.core_config(1, 1, "/dev/dummy"), opencas.cas_config.core_config(2, 1, "/dev/dosko"), ], ) mock_list.side_effect = [ [], [ { "type": "cache", "id": "2", "disk": "/dev/dummy_cache4", "status": "Incomplete", "write policy": "wb", "device": "-", }, { "type": "core", "id": "1", "disk": "/dev/dosko", "status": "Inactive", "write policy": "-", "device": "/dev/cas2-1", }, ], [ { "type": "cache", "id": "2", "disk": "/dev/dummy_cache4", "status": "Incomplete", "write policy": "wb", "device": "-", }, { "type": "core", "id": "1", "disk": "/dev/dosko", "status": "Inactive", "write policy": "-", "device": "/dev/cas2-1", }, { "type": "cache", "id": "1", "disk": "/dev/dummy_cache", "status": "Incomplete", "write policy": "wt", "device": "-", }, { "type": "core", "id": "1", "disk": "/dev/dummy", "status": "Active", "write policy": "-", "device": "/dev/cas1-1", }, ], [ { "type": "cache", "id": "2", "disk": "/dev/dummy_cache4", "status": "Running", "write policy": "wb", "device": "-", }, { "type": "core", "id": "1", "disk": "/dev/dosko", "status": "Active", "write policy": "-", "device": "/dev/cas2-1", }, { "type": "cache", "id": "1", "disk": "/dev/dummy_cache", "status": "Incomplete", "write policy": "wt", "device": "-", }, { "type": "core", "id": "1", "disk": "/dev/dummy", "status": "Inactive", "write policy": "-", "device": "/dev/cas1-1", }, ], [ { "type": "cache", "id": "2", "disk": "/dev/dummy_cache4", "status": "Running", "write policy": "wb", "device": "-", }, { "type": "core", "id": "1", "disk": "/dev/dosko", "status": "Active", "write policy": "-", "device": "/dev/cas2-1", }, { "type": "cache", "id": "1", "disk": "/dev/dummy_cache", "status": "Running", "write policy": "wt", "device": "-", }, { "type": "core", "id": "1", "disk": "/dev/dummy", "status": "Active", "write policy": "-", "device": "/dev/cas1-1", }, ], ] result = opencas.wait_for_startup(timeout=1, interval=0.01) assert len(result) == 0, "no cores should remain uninitialized"