|
Packit |
2ba279 |
import unittest
|
|
Packit |
2ba279 |
import os
|
|
Packit |
2ba279 |
import re
|
|
Packit |
2ba279 |
import time
|
|
Packit |
2ba279 |
from contextlib import contextmanager
|
|
Packit |
2ba279 |
from distutils.version import LooseVersion
|
|
Packit |
2ba279 |
from distutils.spawn import find_executable
|
|
Packit |
2ba279 |
from utils import create_sparse_tempfile, create_lio_device, delete_lio_device, wipe_all, fake_path, read_file, TestTags, tag_test
|
|
Packit |
2ba279 |
from bytesize import bytesize
|
|
Packit |
2ba279 |
import overrides_hack
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
from gi.repository import BlockDev, GLib
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
def _can_load_zram():
|
|
Packit |
2ba279 |
"""Test if we can load the zram module"""
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
if os.system("lsmod|grep zram >/dev/null") != 0:
|
|
Packit |
2ba279 |
# not loaded
|
|
Packit |
2ba279 |
return True
|
|
Packit |
2ba279 |
elif os.system("rmmod zram") == 0:
|
|
Packit |
2ba279 |
# successfully unloaded
|
|
Packit |
2ba279 |
return True
|
|
Packit |
2ba279 |
else:
|
|
Packit |
2ba279 |
# loaded and failed to unload
|
|
Packit |
2ba279 |
return False
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
@contextmanager
|
|
Packit |
2ba279 |
def _track_module_load(test_case, mod_name, loaded_attr):
|
|
Packit |
2ba279 |
setattr(test_case, loaded_attr, os.system("lsmod|grep %s > /dev/null" % mod_name) == 0)
|
|
Packit |
2ba279 |
try:
|
|
Packit |
2ba279 |
yield
|
|
Packit |
2ba279 |
finally:
|
|
Packit |
2ba279 |
setattr(test_case, loaded_attr, os.system("lsmod|grep %s > /dev/null" % mod_name) == 0)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
def _wait_for_bcache_setup(bcache_dev):
|
|
Packit |
2ba279 |
i = 0
|
|
Packit |
2ba279 |
cache_dir = "/sys/block/%s/bcache/cache" % bcache_dev
|
|
Packit |
2ba279 |
while not os.access(cache_dir, os.R_OK):
|
|
Packit |
2ba279 |
time.sleep(1)
|
|
Packit |
2ba279 |
i += 1
|
|
Packit |
2ba279 |
if i >= 30:
|
|
Packit |
2ba279 |
print("WARNING: Giving up waiting for bcache setup!!!")
|
|
Packit |
2ba279 |
break
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
class KbdZRAMTestCase(unittest.TestCase):
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
requested_plugins = BlockDev.plugin_specs_from_names(("kbd", "swap"))
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
@classmethod
|
|
Packit |
2ba279 |
def setUpClass(cls):
|
|
Packit |
2ba279 |
if not BlockDev.is_initialized():
|
|
Packit |
2ba279 |
BlockDev.init(cls.requested_plugins, None)
|
|
Packit |
2ba279 |
else:
|
|
Packit |
2ba279 |
BlockDev.reinit(cls.requested_plugins, True, None)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
def setUp(self):
|
|
Packit |
2ba279 |
self.addCleanup(self._clean_up)
|
|
Packit |
2ba279 |
self._loaded_zram_module = False
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
def _clean_up(self):
|
|
Packit |
2ba279 |
# make sure we unload the module if we loaded it
|
|
Packit |
2ba279 |
if self._loaded_zram_module:
|
|
Packit |
2ba279 |
os.system("rmmod zram")
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
class KbdZRAMDevicesTestCase(KbdZRAMTestCase):
|
|
Packit |
2ba279 |
@unittest.skipUnless(_can_load_zram(), "cannot load the 'zram' module")
|
|
Packit |
2ba279 |
@tag_test(TestTags.SLOW)
|
|
Packit |
2ba279 |
def test_create_destroy_devices(self):
|
|
Packit |
2ba279 |
# the easiest case
|
|
Packit |
2ba279 |
with _track_module_load(self, "zram", "_loaded_zram_module"):
|
|
Packit |
2ba279 |
self.assertTrue(BlockDev.kbd_zram_create_devices(2, [10 * 1024**2, 10 * 1024**2], [1, 2]))
|
|
Packit |
2ba279 |
time.sleep(1)
|
|
Packit |
2ba279 |
self.assertTrue(BlockDev.kbd_zram_destroy_devices())
|
|
Packit |
2ba279 |
time.sleep(1)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
# no nstreams specified
|
|
Packit |
2ba279 |
with _track_module_load(self, "zram", "_loaded_zram_module"):
|
|
Packit |
2ba279 |
self.assertTrue(BlockDev.kbd_zram_create_devices(2, [10 * 1024**2, 10 * 1024**2], None))
|
|
Packit |
2ba279 |
time.sleep(1)
|
|
Packit |
2ba279 |
self.assertTrue(BlockDev.kbd_zram_destroy_devices())
|
|
Packit |
2ba279 |
time.sleep(1)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
# with module pre-loaded, but unsed
|
|
Packit |
2ba279 |
self.assertEqual(os.system("modprobe zram num_devices=2"), 0)
|
|
Packit |
2ba279 |
time.sleep(1)
|
|
Packit |
2ba279 |
with _track_module_load(self, "zram", "_loaded_zram_module"):
|
|
Packit |
2ba279 |
self.assertTrue(BlockDev.kbd_zram_create_devices(2, [10 * 1024**2, 10 * 1024**2], [1, 1]))
|
|
Packit |
2ba279 |
time.sleep(1)
|
|
Packit |
2ba279 |
self.assertTrue(BlockDev.kbd_zram_destroy_devices())
|
|
Packit |
2ba279 |
time.sleep(1)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
# with module pre-loaded, and devices used (as active swaps)
|
|
Packit |
2ba279 |
self.assertEqual(os.system("modprobe zram num_devices=2"), 0)
|
|
Packit |
2ba279 |
self.assertEqual(os.system("echo 10M > /sys/class/block/zram0/disksize"), 0)
|
|
Packit |
2ba279 |
self.assertEqual(os.system("echo 10M > /sys/class/block/zram1/disksize"), 0)
|
|
Packit |
2ba279 |
time.sleep(1)
|
|
Packit |
2ba279 |
for zram_dev in ("/dev/zram0", "/dev/zram1"):
|
|
Packit |
2ba279 |
self.assertTrue(BlockDev.swap_mkswap(zram_dev, None))
|
|
Packit |
2ba279 |
self.assertTrue(BlockDev.swap_swapon(zram_dev, -1))
|
|
Packit |
2ba279 |
with _track_module_load(self, "zram", "_loaded_zram_module"):
|
|
Packit |
2ba279 |
with self.assertRaises(GLib.GError):
|
|
Packit |
2ba279 |
self.assertTrue(BlockDev.kbd_zram_create_devices(2, [10 * 1024**2, 10 * 1024**2], [1, 1]))
|
|
Packit |
2ba279 |
for zram_dev in ("/dev/zram0", "/dev/zram1"):
|
|
Packit |
2ba279 |
self.assertTrue(BlockDev.swap_swapoff(zram_dev))
|
|
Packit |
2ba279 |
self.assertEqual(os.system("rmmod zram"), 0)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
# should work just fine now
|
|
Packit |
2ba279 |
self.assertTrue(BlockDev.kbd_zram_create_devices(2, [10 * 1024**2, 10 * 1024**2], [1, 1]))
|
|
Packit |
2ba279 |
time.sleep(1)
|
|
Packit |
2ba279 |
self.assertTrue(BlockDev.kbd_zram_destroy_devices())
|
|
Packit |
2ba279 |
time.sleep(1)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
@unittest.skipUnless(_can_load_zram(), "cannot load the 'zram' module")
|
|
Packit |
2ba279 |
@tag_test(TestTags.SLOW)
|
|
Packit |
2ba279 |
def test_zram_add_remove_device(self):
|
|
Packit |
2ba279 |
"""Verify that it is possible to add and remove a zram device"""
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
# the easiest case
|
|
Packit |
2ba279 |
with _track_module_load(self, "zram", "_loaded_zram_module"):
|
|
Packit |
2ba279 |
succ, device = BlockDev.kbd_zram_add_device (10 * 1024**2, 4)
|
|
Packit |
2ba279 |
self.assertTrue(succ)
|
|
Packit |
2ba279 |
self.assertTrue(device.startswith("/dev/zram"))
|
|
Packit |
2ba279 |
time.sleep(5)
|
|
Packit |
2ba279 |
self.assertTrue(BlockDev.kbd_zram_remove_device(device))
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
# no nstreams specified
|
|
Packit |
2ba279 |
with _track_module_load(self, "zram", "_loaded_zram_module"):
|
|
Packit |
2ba279 |
succ, device = BlockDev.kbd_zram_add_device (10 * 1024**2, 0)
|
|
Packit |
2ba279 |
self.assertTrue(succ)
|
|
Packit |
2ba279 |
self.assertTrue(device.startswith("/dev/zram"))
|
|
Packit |
2ba279 |
time.sleep(5)
|
|
Packit |
2ba279 |
self.assertTrue(BlockDev.kbd_zram_remove_device(device))
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
# create two devices
|
|
Packit |
2ba279 |
with _track_module_load(self, "zram", "_loaded_zram_module"):
|
|
Packit |
2ba279 |
succ, device = BlockDev.kbd_zram_add_device (10 * 1024**2, 4)
|
|
Packit |
2ba279 |
self.assertTrue(succ)
|
|
Packit |
2ba279 |
self.assertTrue(device.startswith("/dev/zram"))
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
succ, device2 = BlockDev.kbd_zram_add_device (10 * 1024**2, 4)
|
|
Packit |
2ba279 |
self.assertTrue(succ)
|
|
Packit |
2ba279 |
self.assertTrue(device2.startswith("/dev/zram"))
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
time.sleep(5)
|
|
Packit |
2ba279 |
self.assertTrue(BlockDev.kbd_zram_remove_device(device))
|
|
Packit |
2ba279 |
self.assertTrue(BlockDev.kbd_zram_remove_device(device2))
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
# mixture of multiple devices and a single device
|
|
Packit |
2ba279 |
with _track_module_load(self, "zram", "_loaded_zram_module"):
|
|
Packit |
2ba279 |
self.assertTrue(BlockDev.kbd_zram_create_devices(2, [10 * 1024**2, 10 * 1024**2], [1, 2]))
|
|
Packit |
2ba279 |
time.sleep(5)
|
|
Packit |
2ba279 |
succ, device = BlockDev.kbd_zram_add_device (10 * 1024**2, 4)
|
|
Packit |
2ba279 |
self.assertTrue(succ)
|
|
Packit |
2ba279 |
self.assertTrue(device.startswith("/dev/zram"))
|
|
Packit |
2ba279 |
time.sleep(5)
|
|
Packit |
2ba279 |
self.assertTrue(BlockDev.kbd_zram_destroy_devices())
|
|
Packit |
2ba279 |
time.sleep(5)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
class KbdZRAMStatsTestCase(KbdZRAMTestCase):
|
|
Packit |
2ba279 |
@unittest.skipUnless(_can_load_zram(), "cannot load the 'zram' module")
|
|
Packit |
2ba279 |
def test_zram_get_stats(self):
|
|
Packit |
2ba279 |
"""Verify that it is possible to get stats for a zram device"""
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
# location of some sysfs files we use is different since linux 4.11
|
|
Packit |
2ba279 |
kernel_version = os.uname()[2]
|
|
Packit |
2ba279 |
if LooseVersion(kernel_version) >= LooseVersion("4.11"):
|
|
Packit |
2ba279 |
self._zram_get_stats_new()
|
|
Packit |
2ba279 |
else:
|
|
Packit |
2ba279 |
self._zram_get_stats_old()
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
def _zram_get_stats_new(self):
|
|
Packit |
2ba279 |
with _track_module_load(self, "zram", "_loaded_zram_module"):
|
|
Packit |
2ba279 |
self.assertTrue(BlockDev.kbd_zram_create_devices(1, [10 * 1024**2], [2]))
|
|
Packit |
2ba279 |
time.sleep(1)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
# XXX: this needs to get more complex/serious
|
|
Packit |
2ba279 |
stats = BlockDev.kbd_zram_get_stats("zram0")
|
|
Packit |
2ba279 |
self.assertTrue(stats)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
# /dev/zram0 should work too
|
|
Packit |
2ba279 |
stats = BlockDev.kbd_zram_get_stats("/dev/zram0")
|
|
Packit |
2ba279 |
self.assertTrue(stats)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
self.assertEqual(stats.disksize, 10 * 1024**2)
|
|
Packit |
2ba279 |
# XXX: 'max_comp_streams' is currently broken on rawhide
|
|
Packit |
2ba279 |
# https://bugzilla.redhat.com/show_bug.cgi?id=1352567
|
|
Packit |
2ba279 |
# self.assertEqual(stats.max_comp_streams, 2)
|
|
Packit |
2ba279 |
self.assertTrue(stats.comp_algorithm)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
# read 'num_reads' and 'num_writes' from '/sys/block/zram0/stat'
|
|
Packit |
2ba279 |
sys_stats = read_file("/sys/block/zram0/stat").strip().split()
|
|
Packit |
2ba279 |
self.assertGreaterEqual(len(sys_stats), 11) # 15 stats since 4.19
|
|
Packit |
2ba279 |
num_reads = int(sys_stats[0])
|
|
Packit |
2ba279 |
num_writes = int(sys_stats[4])
|
|
Packit |
2ba279 |
self.assertEqual(stats.num_reads, num_reads)
|
|
Packit |
2ba279 |
self.assertEqual(stats.num_writes, num_writes)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
# read 'orig_data_size', 'compr_data_size', 'mem_used_total' and
|
|
Packit |
2ba279 |
# 'zero_pages' from '/sys/block/zram0/mm_stat'
|
|
Packit |
2ba279 |
sys_stats = read_file("/sys/block/zram0/mm_stat").strip().split()
|
|
Packit |
2ba279 |
self.assertGreaterEqual(len(sys_stats), 7) # since 4.18 we have 8 stats
|
|
Packit |
2ba279 |
orig_data_size = int(sys_stats[0])
|
|
Packit |
2ba279 |
compr_data_size = int(sys_stats[1])
|
|
Packit |
2ba279 |
mem_used_total = int(sys_stats[2])
|
|
Packit |
2ba279 |
zero_pages = int(sys_stats[5])
|
|
Packit |
2ba279 |
self.assertEqual(stats.orig_data_size, orig_data_size)
|
|
Packit |
2ba279 |
self.assertEqual(stats.compr_data_size, compr_data_size)
|
|
Packit |
2ba279 |
self.assertEqual(stats.mem_used_total, mem_used_total)
|
|
Packit |
2ba279 |
self.assertEqual(stats.zero_pages, zero_pages)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
# read 'invalid_io' and 'num_writes' from '/sys/block/zram0/io_stat'
|
|
Packit |
2ba279 |
sys_stats = read_file("/sys/block/zram0/io_stat").strip().split()
|
|
Packit |
2ba279 |
self.assertEqual(len(sys_stats), 4)
|
|
Packit |
2ba279 |
invalid_io = int(sys_stats[2])
|
|
Packit |
2ba279 |
self.assertEqual(stats.invalid_io, invalid_io)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
with _track_module_load(self, "zram", "_loaded_zram_module"):
|
|
Packit |
2ba279 |
self.assertTrue(BlockDev.kbd_zram_destroy_devices())
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
def _zram_get_stats_old(self):
|
|
Packit |
2ba279 |
with _track_module_load(self, "zram", "_loaded_zram_module"):
|
|
Packit |
2ba279 |
self.assertTrue(BlockDev.kbd_zram_create_devices(1, [10 * 1024**2], [2]))
|
|
Packit |
2ba279 |
time.sleep(1)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
stats = BlockDev.kbd_zram_get_stats("zram0")
|
|
Packit |
2ba279 |
self.assertTrue(stats)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
# /dev/zram0 should work too
|
|
Packit |
2ba279 |
stats = BlockDev.kbd_zram_get_stats("/dev/zram0")
|
|
Packit |
2ba279 |
self.assertTrue(stats)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
self.assertEqual(stats.disksize, 10 * 1024**2)
|
|
Packit |
2ba279 |
self.assertEqual(stats.max_comp_streams, 2)
|
|
Packit |
2ba279 |
self.assertTrue(stats.comp_algorithm)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
num_reads = int(read_file("/sys/block/zram0/num_reads").strip())
|
|
Packit |
2ba279 |
self.assertEqual(stats.num_reads, num_reads)
|
|
Packit |
2ba279 |
num_writes = int(read_file("/sys/block/zram0/num_writes").strip())
|
|
Packit |
2ba279 |
self.assertEqual(stats.num_writes, num_writes)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
orig_data_size = int(read_file("/sys/block/zram0/orig_data_size").strip())
|
|
Packit |
2ba279 |
self.assertEqual(stats.orig_data_size, orig_data_size)
|
|
Packit |
2ba279 |
compr_data_size = int(read_file("/sys/block/zram0/compr_data_size").strip())
|
|
Packit |
2ba279 |
self.assertEqual(stats.compr_data_size, compr_data_size)
|
|
Packit |
2ba279 |
mem_used_total = int(read_file("/sys/block/zram0/mem_used_total").strip())
|
|
Packit |
2ba279 |
self.assertEqual(stats.mem_used_total, mem_used_total)
|
|
Packit |
2ba279 |
zero_pages = int(read_file("/sys/block/zram0/zero_pages").strip())
|
|
Packit |
2ba279 |
self.assertEqual(stats.zero_pages, zero_pages)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
invalid_io = int(read_file("/sys/block/zram0/invalid_io").strip())
|
|
Packit |
2ba279 |
self.assertEqual(stats.invalid_io, invalid_io)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
with _track_module_load(self, "zram", "_loaded_zram_module"):
|
|
Packit |
2ba279 |
self.assertTrue(BlockDev.kbd_zram_destroy_devices())
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
class KbdBcacheNodevTestCase(unittest.TestCase):
|
|
Packit |
2ba279 |
# no setUp/tearDown methods needed
|
|
Packit |
2ba279 |
requested_plugins = BlockDev.plugin_specs_from_names(("kbd", "swap"))
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
@classmethod
|
|
Packit |
2ba279 |
def setUpClass(cls):
|
|
Packit |
2ba279 |
if not find_executable("make-bcache"):
|
|
Packit |
2ba279 |
raise unittest.SkipTest("make-bcache executable not found in $PATH, skipping.")
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
if not BlockDev.is_initialized():
|
|
Packit |
2ba279 |
BlockDev.init(cls.requested_plugins, None)
|
|
Packit |
2ba279 |
else:
|
|
Packit |
2ba279 |
BlockDev.reinit(cls.requested_plugins, True, None)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
@tag_test(TestTags.NOSTORAGE)
|
|
Packit |
2ba279 |
def test_bcache_mode_str_bijection(self):
|
|
Packit |
2ba279 |
"""Verify that it's possible to transform between cache modes and their string representations"""
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
mode_mapping = ((BlockDev.KBDBcacheMode.WRITETHROUGH, "writethrough"),
|
|
Packit |
2ba279 |
(BlockDev.KBDBcacheMode.WRITEBACK, "writeback"),
|
|
Packit |
2ba279 |
(BlockDev.KBDBcacheMode.WRITEAROUND, "writearound"),
|
|
Packit |
2ba279 |
(BlockDev.KBDBcacheMode.NONE, "none"),
|
|
Packit |
2ba279 |
(BlockDev.KBDBcacheMode.UNKNOWN, "unknown"),
|
|
Packit |
2ba279 |
)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
for (mode, mode_str) in mode_mapping:
|
|
Packit |
2ba279 |
self.assertEqual(mode, BlockDev.kbd_bcache_get_mode_from_str(mode_str))
|
|
Packit |
2ba279 |
self.assertEqual(mode_str, BlockDev.kbd_bcache_get_mode_str(mode))
|
|
Packit |
2ba279 |
self.assertEqual(mode_str, BlockDev.kbd_bcache_get_mode_str(BlockDev.kbd_bcache_get_mode_from_str(mode_str)))
|
|
Packit |
2ba279 |
self.assertEqual(mode, BlockDev.kbd_bcache_get_mode_from_str(BlockDev.kbd_bcache_get_mode_str(mode)))
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
class KbdBcacheTestCase(unittest.TestCase):
|
|
Packit |
2ba279 |
requested_plugins = BlockDev.plugin_specs_from_names(("kbd", "swap"))
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
@classmethod
|
|
Packit |
2ba279 |
def setUpClass(cls):
|
|
Packit |
2ba279 |
if not find_executable("make-bcache"):
|
|
Packit |
2ba279 |
raise unittest.SkipTest("make-bcache executable not found in $PATH, skipping.")
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
if not BlockDev.is_initialized():
|
|
Packit |
2ba279 |
BlockDev.init(cls.requested_plugins, None)
|
|
Packit |
2ba279 |
else:
|
|
Packit |
2ba279 |
BlockDev.reinit(cls.requested_plugins, True, None)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
def setUp(self):
|
|
Packit |
2ba279 |
self.addCleanup(self._clean_up)
|
|
Packit |
2ba279 |
self.dev_file = create_sparse_tempfile("lvm_test", 10 * 1024**3)
|
|
Packit |
2ba279 |
self.dev_file2 = create_sparse_tempfile("lvm_test", 10 * 1024**3)
|
|
Packit |
2ba279 |
try:
|
|
Packit |
2ba279 |
self.loop_dev = create_lio_device(self.dev_file)
|
|
Packit |
2ba279 |
except RuntimeError as e:
|
|
Packit |
2ba279 |
raise RuntimeError("Failed to setup loop device for testing: %s" % e)
|
|
Packit |
2ba279 |
try:
|
|
Packit |
2ba279 |
self.loop_dev2 = create_lio_device(self.dev_file2)
|
|
Packit |
2ba279 |
except RuntimeError as e:
|
|
Packit |
2ba279 |
raise RuntimeError("Failed to setup loop device for testing: %s" % e)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
self.bcache_dev = None
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
def _clean_up(self):
|
|
Packit |
2ba279 |
if self.bcache_dev:
|
|
Packit |
2ba279 |
try:
|
|
Packit |
2ba279 |
BlockDev.kbd_bcache_destroy(self.bcache_dev)
|
|
Packit |
2ba279 |
except:
|
|
Packit |
2ba279 |
pass
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
try:
|
|
Packit |
2ba279 |
delete_lio_device(self.loop_dev)
|
|
Packit |
2ba279 |
except RuntimeError:
|
|
Packit |
2ba279 |
# just move on, we can do no better here
|
|
Packit |
2ba279 |
pass
|
|
Packit |
2ba279 |
os.unlink(self.dev_file)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
try:
|
|
Packit |
2ba279 |
delete_lio_device(self.loop_dev2)
|
|
Packit |
2ba279 |
except RuntimeError:
|
|
Packit |
2ba279 |
# just move on, we can do no better here
|
|
Packit |
2ba279 |
pass
|
|
Packit |
2ba279 |
os.unlink(self.dev_file2)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
class KbdTestBcacheCreate(KbdBcacheTestCase):
|
|
Packit |
2ba279 |
@tag_test(TestTags.UNSTABLE)
|
|
Packit |
2ba279 |
def test_bcache_create_destroy(self):
|
|
Packit |
2ba279 |
"""Verify that it's possible to create and destroy a bcache device"""
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
succ, dev = BlockDev.kbd_bcache_create(self.loop_dev, self.loop_dev2, None)
|
|
Packit |
2ba279 |
self.assertTrue(succ)
|
|
Packit |
2ba279 |
self.assertTrue(dev)
|
|
Packit |
2ba279 |
self.bcache_dev = dev
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
_wait_for_bcache_setup(dev)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
succ = BlockDev.kbd_bcache_destroy(self.bcache_dev)
|
|
Packit |
2ba279 |
self.assertTrue(succ)
|
|
Packit |
2ba279 |
self.bcache_dev = None
|
|
Packit |
2ba279 |
time.sleep(5)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
wipe_all(self.loop_dev, self.loop_dev2)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
@tag_test(TestTags.UNSTABLE)
|
|
Packit |
2ba279 |
def test_bcache_create_destroy_full_path(self):
|
|
Packit |
2ba279 |
"""Verify that it's possible to create and destroy a bcache device with full device path"""
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
succ, dev = BlockDev.kbd_bcache_create(self.loop_dev, self.loop_dev2, None)
|
|
Packit |
2ba279 |
self.assertTrue(succ)
|
|
Packit |
2ba279 |
self.assertTrue(dev)
|
|
Packit |
2ba279 |
self.bcache_dev = dev
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
_wait_for_bcache_setup(dev)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
succ = BlockDev.kbd_bcache_destroy("/dev/" + self.bcache_dev)
|
|
Packit |
2ba279 |
self.assertTrue(succ)
|
|
Packit |
2ba279 |
self.bcache_dev = None
|
|
Packit |
2ba279 |
time.sleep(5)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
wipe_all(self.loop_dev, self.loop_dev2)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
class KbdTestBcacheAttachDetach(KbdBcacheTestCase):
|
|
Packit |
2ba279 |
@tag_test(TestTags.UNSTABLE)
|
|
Packit |
2ba279 |
def test_bcache_attach_detach(self):
|
|
Packit |
2ba279 |
"""Verify that it's possible to detach/attach a cache from/to a bcache device"""
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
succ, dev = BlockDev.kbd_bcache_create(self.loop_dev, self.loop_dev2, None)
|
|
Packit |
2ba279 |
self.assertTrue(succ)
|
|
Packit |
2ba279 |
self.assertTrue(dev)
|
|
Packit |
2ba279 |
self.bcache_dev = dev
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
_wait_for_bcache_setup(dev)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
succ, c_set_uuid = BlockDev.kbd_bcache_detach(self.bcache_dev)
|
|
Packit |
2ba279 |
self.assertTrue(succ)
|
|
Packit |
2ba279 |
self.assertTrue(c_set_uuid)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
succ = BlockDev.kbd_bcache_attach(c_set_uuid, self.bcache_dev)
|
|
Packit |
2ba279 |
self.assertTrue(succ)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
succ = BlockDev.kbd_bcache_destroy(self.bcache_dev)
|
|
Packit |
2ba279 |
self.assertTrue(succ)
|
|
Packit |
2ba279 |
self.bcache_dev = None
|
|
Packit |
2ba279 |
time.sleep(1)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
wipe_all(self.loop_dev, self.loop_dev2)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
@tag_test(TestTags.UNSTABLE)
|
|
Packit |
2ba279 |
def test_bcache_attach_detach_full_path(self):
|
|
Packit |
2ba279 |
"""Verify that it's possible to detach/attach a cache from/to a bcache device with full device path"""
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
succ, dev = BlockDev.kbd_bcache_create(self.loop_dev, self.loop_dev2, None)
|
|
Packit |
2ba279 |
self.assertTrue(succ)
|
|
Packit |
2ba279 |
self.assertTrue(dev)
|
|
Packit |
2ba279 |
self.bcache_dev = dev
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
_wait_for_bcache_setup(dev)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
succ, c_set_uuid = BlockDev.kbd_bcache_detach("/dev/" + self.bcache_dev)
|
|
Packit |
2ba279 |
self.assertTrue(succ)
|
|
Packit |
2ba279 |
self.assertTrue(c_set_uuid)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
succ = BlockDev.kbd_bcache_attach(c_set_uuid, "/dev/" + self.bcache_dev)
|
|
Packit |
2ba279 |
self.assertTrue(succ)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
succ = BlockDev.kbd_bcache_destroy(self.bcache_dev)
|
|
Packit |
2ba279 |
self.assertTrue(succ)
|
|
Packit |
2ba279 |
self.bcache_dev = None
|
|
Packit |
2ba279 |
time.sleep(1)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
wipe_all(self.loop_dev, self.loop_dev2)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
@tag_test(TestTags.UNSTABLE)
|
|
Packit |
2ba279 |
def test_bcache_detach_destroy(self):
|
|
Packit |
2ba279 |
"""Verify that it's possible to destroy a bcache device with no cache attached"""
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
succ, dev = BlockDev.kbd_bcache_create(self.loop_dev, self.loop_dev2, None)
|
|
Packit |
2ba279 |
self.assertTrue(succ)
|
|
Packit |
2ba279 |
self.assertTrue(dev)
|
|
Packit |
2ba279 |
self.bcache_dev = dev
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
_wait_for_bcache_setup(dev)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
succ, c_set_uuid = BlockDev.kbd_bcache_detach(self.bcache_dev)
|
|
Packit |
2ba279 |
self.assertTrue(succ)
|
|
Packit |
2ba279 |
self.assertTrue(c_set_uuid)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
succ = BlockDev.kbd_bcache_destroy(self.bcache_dev)
|
|
Packit |
2ba279 |
self.assertTrue(succ)
|
|
Packit |
2ba279 |
self.bcache_dev = None
|
|
Packit |
2ba279 |
time.sleep(1)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
wipe_all(self.loop_dev, self.loop_dev2)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
class KbdTestBcacheGetSetMode(KbdBcacheTestCase):
|
|
Packit |
2ba279 |
@tag_test(TestTags.UNSTABLE)
|
|
Packit |
2ba279 |
def test_bcache_get_set_mode(self):
|
|
Packit |
2ba279 |
"""Verify that it is possible to get and set Bcache mode"""
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
succ, dev = BlockDev.kbd_bcache_create(self.loop_dev, self.loop_dev2, None)
|
|
Packit |
2ba279 |
self.assertTrue(succ)
|
|
Packit |
2ba279 |
self.assertTrue(dev)
|
|
Packit |
2ba279 |
self.bcache_dev = dev
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
_wait_for_bcache_setup(dev)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
mode = BlockDev.kbd_bcache_get_mode(self.bcache_dev)
|
|
Packit |
2ba279 |
self.assertNotEqual(mode, BlockDev.KBDBcacheMode.UNKNOWN)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
for mode_str in ("writethrough", "writeback", "writearound", "none"):
|
|
Packit |
2ba279 |
mode = BlockDev.kbd_bcache_get_mode_from_str(mode_str)
|
|
Packit |
2ba279 |
succ = BlockDev.kbd_bcache_set_mode(self.bcache_dev, mode)
|
|
Packit |
2ba279 |
self.assertTrue(succ)
|
|
Packit |
2ba279 |
new_mode = BlockDev.kbd_bcache_get_mode(self.bcache_dev)
|
|
Packit |
2ba279 |
self.assertEqual(mode, new_mode)
|
|
Packit |
2ba279 |
self.assertEqual(mode_str, BlockDev.kbd_bcache_get_mode_str(new_mode))
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
mode_str = "unknown"
|
|
Packit |
2ba279 |
mode = BlockDev.kbd_bcache_get_mode_from_str(mode_str)
|
|
Packit |
2ba279 |
with self.assertRaises(GLib.GError):
|
|
Packit |
2ba279 |
# cannot set mode to "uknown"
|
|
Packit |
2ba279 |
BlockDev.kbd_bcache_set_mode(self.bcache_dev, mode)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
mode_str = "bla"
|
|
Packit |
2ba279 |
with self.assertRaises(GLib.GError):
|
|
Packit |
2ba279 |
mode = BlockDev.kbd_bcache_get_mode_from_str(mode_str)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
# set back to some caching mode
|
|
Packit |
2ba279 |
mode_str = "writethrough"
|
|
Packit |
2ba279 |
mode = BlockDev.kbd_bcache_get_mode_from_str(mode_str)
|
|
Packit |
2ba279 |
succ = BlockDev.kbd_bcache_set_mode(self.bcache_dev, mode)
|
|
Packit |
2ba279 |
self.assertTrue(succ)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
_wait_for_bcache_setup(dev)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
succ = BlockDev.kbd_bcache_destroy(self.bcache_dev)
|
|
Packit |
2ba279 |
self.assertTrue(succ)
|
|
Packit |
2ba279 |
self.bcache_dev = None
|
|
Packit |
2ba279 |
time.sleep(1)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
wipe_all(self.loop_dev, self.loop_dev2)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
class KbdTestBcacheStatusTest(KbdBcacheTestCase):
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
def _get_size(self, bcache_name):
|
|
Packit |
2ba279 |
cache_dir = '/sys/block/%s/bcache/cache' % bcache_name
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
# sum sizes from all caches
|
|
Packit |
2ba279 |
caches = ['%s/%s' % (cache_dir, d) for d in os.listdir(cache_dir) if re.match('cache[0-9]*$', d)]
|
|
Packit |
2ba279 |
return sum(int(read_file(os.path.realpath(c) + '/../size')) for c in caches)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
@tag_test(TestTags.UNSTABLE)
|
|
Packit |
2ba279 |
def test_bcache_status(self):
|
|
Packit |
2ba279 |
succ, dev = BlockDev.kbd_bcache_create(self.loop_dev, self.loop_dev2, None)
|
|
Packit |
2ba279 |
self.assertTrue(succ)
|
|
Packit |
2ba279 |
self.assertTrue(dev)
|
|
Packit |
2ba279 |
self.bcache_dev = dev
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
_wait_for_bcache_setup(dev)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
# should work with both "bcacheX" and "/dev/bcacheX"
|
|
Packit |
2ba279 |
status = BlockDev.kbd_bcache_status(self.bcache_dev)
|
|
Packit |
2ba279 |
self.assertTrue(status)
|
|
Packit |
2ba279 |
status = BlockDev.kbd_bcache_status("/dev/" + self.bcache_dev)
|
|
Packit |
2ba279 |
self.assertTrue(status)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
# check some basic values
|
|
Packit |
2ba279 |
self.assertTrue(status.state)
|
|
Packit |
2ba279 |
sys_state = read_file("/sys/block/%s/bcache/state" % self.bcache_dev).strip()
|
|
Packit |
2ba279 |
self.assertEqual(status.state, sys_state)
|
|
Packit |
2ba279 |
sys_block = read_file("/sys/block/%s/bcache/cache/block_size" % self.bcache_dev).strip()
|
|
Packit |
2ba279 |
self.assertEqual(status.block_size, int(bytesize.Size(sys_block)))
|
|
Packit |
2ba279 |
sys_size = self._get_size(self.bcache_dev)
|
|
Packit |
2ba279 |
self.assertGreater(status.cache_size, sys_size)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
succ = BlockDev.kbd_bcache_destroy(self.bcache_dev)
|
|
Packit |
2ba279 |
self.assertTrue(succ)
|
|
Packit |
2ba279 |
self.bcache_dev = None
|
|
Packit |
2ba279 |
time.sleep(1)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
wipe_all(self.loop_dev, self.loop_dev2)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
class KbdTestBcacheBackingCacheDevTest(KbdBcacheTestCase):
|
|
Packit |
2ba279 |
@tag_test(TestTags.UNSTABLE)
|
|
Packit |
2ba279 |
def test_bcache_backing_cache_dev(self):
|
|
Packit |
2ba279 |
"""Verify that is is possible to get the backing and cache devices for a Bcache"""
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
succ, dev = BlockDev.kbd_bcache_create(self.loop_dev, self.loop_dev2, None)
|
|
Packit |
2ba279 |
self.assertTrue(succ)
|
|
Packit |
2ba279 |
self.assertTrue(dev)
|
|
Packit |
2ba279 |
self.bcache_dev = dev
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
_wait_for_bcache_setup(dev)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
self.assertEqual("/dev/" + BlockDev.kbd_bcache_get_backing_device(self.bcache_dev), self.loop_dev)
|
|
Packit |
2ba279 |
self.assertEqual("/dev/" + BlockDev.kbd_bcache_get_cache_device(self.bcache_dev), self.loop_dev2)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
succ = BlockDev.kbd_bcache_destroy(self.bcache_dev)
|
|
Packit |
2ba279 |
self.assertTrue(succ)
|
|
Packit |
2ba279 |
self.bcache_dev = None
|
|
Packit |
2ba279 |
time.sleep(1)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
wipe_all(self.loop_dev, self.loop_dev2)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
class KbdUnloadTest(KbdBcacheTestCase):
|
|
Packit |
2ba279 |
def setUp(self):
|
|
Packit |
2ba279 |
# make sure the library is initialized with all plugins loaded for other
|
|
Packit |
2ba279 |
# tests
|
|
Packit |
2ba279 |
self.addCleanup(BlockDev.reinit, self.requested_plugins, True, None)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
@tag_test(TestTags.NOSTORAGE)
|
|
Packit |
2ba279 |
def test_check_no_bcache_progs(self):
|
|
Packit |
2ba279 |
"""Verify that checking the availability of make-bcache works as expected"""
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
# unload all plugins first
|
|
Packit |
2ba279 |
self.assertTrue(BlockDev.reinit([], True, None))
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
with fake_path(all_but="make-bcache"):
|
|
Packit |
2ba279 |
with self.assertRaises(GLib.GError):
|
|
Packit |
2ba279 |
BlockDev.reinit(self.requested_plugins, True, None)
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
self.assertNotIn("kbd", BlockDev.get_available_plugin_names())
|
|
Packit |
2ba279 |
|
|
Packit |
2ba279 |
# load the plugins back
|
|
Packit |
2ba279 |
self.assertTrue(BlockDev.reinit(self.requested_plugins, True, None))
|
|
Packit |
2ba279 |
self.assertIn("kbd", BlockDev.get_available_plugin_names())
|