def test_vg_invalidate_lvs_pvs(tmp_storage): dev_size = 1 * GiB dev = tmp_storage.create_device(dev_size) vg_name = str(uuid.uuid4()) lvm.set_read_only(False) lvm.createVG(vg_name, [dev], "initial-tag", 128) lvm.createLV(vg_name, "lv1", 128, activate=False) # Reload cache. pv = lvm.getPV(dev) vg = lvm.getVG(vg_name) lv = lvm.getLV(vg_name)[0] assert lvm._lvminfo._pvs == {dev: pv} assert lvm._lvminfo._vgs == {vg_name: vg} assert lvm._lvminfo._lvs == {(vg_name, "lv1"): lv} # Invalidate VG including LVs and PVs. lvm.invalidateVG(vg_name, invalidatePVs=True) assert lvm._lvminfo._vgs == {vg_name: lvm.Stub(vg_name, True)} assert lvm._lvminfo._pvs == {dev: lvm.Stub(dev, True)} assert lvm._lvminfo._lvs == {(vg_name, "lv1"): lvm.Stub("lv1", True)}
def test_lv_reload_error_all_stub_other_vgs(fake_devices, no_delay): fake_runner = FakeRunner(rc=5, err=b"Fake lvm error") lc = lvm.LVMCache(fake_runner) lc._lvs = { ("vg-name", "lv-name"): lvm.Stub("lv-name", True), ("other-vg", "other-lv"): lvm.Stub("other-lv", True), } lc.getLv("vg-name") # Should not affect other vg lvs. other_lv = lc._lvs[("other-vg", "other-lv")] assert not isinstance(other_lv, lvm.Unreadable)
def test_lv_reload_error_one_stub(fake_devices, no_delay): fake_runner = FakeRunner(rc=5, err=b"Fake lvm error") lc = lvm.LVMCache(fake_runner) lc._lvs = { ("vg-name", "lv-name"): lvm.Stub("lv-name", True), ("vg-name", "other-lv"): lvm.Stub("other-lv", True), } lv = lc.getLv("vg-name", "lv-name") # Mark lv as unreadable. Because we always reload all lvs, the other lvs is # also marked as unreadable. assert lc._lvs == { ("vg-name", "lv-name"): lvm.Unreadable("lv-name", True), ("vg-name", "other-lv"): lvm.Unreadable("other-lv", True), } # Report the unreadbale lv. assert lv.name == "lv-name" assert isinstance(lv, lvm.Unreadable)
def test_lv_reload_error_all_other_vg(fake_devices, no_delay): fake_runner = FakeRunner(rc=5, err=b"Fake lvm error") lc = lvm.LVMCache(fake_runner) lc._lvs = {("vg-name", "lv-name"): lvm.Stub("lv-name", True)} lvs = lc.getLv("vg-name") # Mark lv as unreadable. assert lc._lvs == {("vg-name", "lv-name"): lvm.Unreadable("lv-name", True)} # Currnetly we don't report stubs or unreadables lvs. This is not # consistent with getLv(vg_name, lv_name). assert lvs == []
def test_vg_invalidate(tmp_storage): dev_size = 1 * GiB dev1 = tmp_storage.create_device(dev_size) dev2 = tmp_storage.create_device(dev_size) vg1_name = str(uuid.uuid4()) vg2_name = str(uuid.uuid4()) lvm.set_read_only(False) lvm.createVG(vg1_name, [dev1], "initial-tag", 128) lvm.createLV(vg1_name, "lv1", 128, activate=False) lvm.createVG(vg2_name, [dev2], "initial-tag", 128) lvm.createLV(vg2_name, "lv2", 128, activate=False) # Reload cache. pv1 = lvm.getPV(dev1) vg1 = lvm.getVG(vg1_name) lv1 = lvm.getLV(vg1_name)[0] pv2 = lvm.getPV(dev2) vg2 = lvm.getVG(vg2_name) lv2 = lvm.getLV(vg2_name)[0] assert lvm._lvminfo._pvs == {dev1: pv1, dev2: pv2} assert lvm._lvminfo._vgs == {vg1_name: vg1, vg2_name: vg2} assert lvm._lvminfo._lvs == { (vg1_name, "lv1"): lv1, (vg2_name, "lv2"): lv2, } # Invalidate VG including LVs. lvm.invalidateVG(vg1_name, invalidateLVs=False) assert lvm._lvminfo._pvs == {dev1: pv1, dev2: pv2} assert lvm._lvminfo._vgs == { vg1_name: lvm.Stub(vg1_name, True), vg2_name: vg2, } assert lvm._lvminfo._lvs == { (vg1_name, "lv1"): lv1, (vg2_name, "lv2"): lv2, }