1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-21 13:34:40 +03:00

lvmdbustest.py: Support concurrent test runs

The env variable LVM_DBUSD_PV_DEVICE_LIST when present and filled in
with at least 4 physical devices will run concurrently with other
instances running as long as they specify different devices in their
env variable.

When the env variable is not present the test runs as it did before.
This commit is contained in:
Tony Asleson 2016-11-11 12:34:38 -06:00
parent 72a943f720
commit cd28717f24

View File

@ -23,7 +23,8 @@ g_tmo = 0
g_prefix = os.getenv('PREFIX', '')
use_session = os.getenv('LVMDBUSD_USE_SESSION', False)
use_session = os.getenv('LVM_DBUSD_USE_SESSION', False)
pv_device_list = os.getenv('LVM_DBUSD_PV_DEVICE_LIST', None)
if use_session:
bus = dbus.SessionBus(mainloop=DBusGMainLoop())
@ -63,16 +64,35 @@ def get_objects():
for object_path, val in list(objects.items()):
for interface, props in list(val.items()):
o = ClientProxy(bus, object_path, interface, props)
if interface == PV_INT:
# If we have a list of PVs to use, lets only use those in
# the list
if pv_device_list and not (o.Pv.Name in pv_device_list):
continue
rc[interface].append(o)
return rc, bus
def set_execution(lvmshell):
def set_execution(lvmshell, test_result):
if lvmshell:
m = 'lvm shell (non-fork)'
else:
m = "forking & exec'ing"
lvm_manager = dbus.Interface(bus.get_object(
BUS_NAME, "/com/redhat/lvmdbus1/Manager"),
"com.redhat.lvmdbus1.Manager")
return lvm_manager.UseLvmShell(lvmshell)
rc = lvm_manager.UseLvmShell(lvmshell)
if rc:
std_err_print('Successfully changed execution mode to "%s"' % m)
else:
std_err_print('ERROR: Failed to change execution mode to "%s"' % m)
test_result.register_fail()
return rc
# noinspection PyUnresolvedReferences
@ -89,9 +109,12 @@ class TestDbusService(unittest.TestCase):
std_err_print('Expecting a manager object!')
sys.exit(1)
if len(self.objs[VG_INT]) != 0:
std_err_print('Expecting no VGs to exist!')
sys.exit(1)
# We will skip the vg device number check if the test user
# has specified a PV list
if pv_device_list is None:
if len(self.objs[VG_INT]) != 0:
std_err_print('Expecting no VGs to exist!')
sys.exit(1)
self.pvs = []
for p in self.objs[PV_INT]:
@ -101,9 +124,19 @@ class TestDbusService(unittest.TestCase):
# If we get here it means we passed setUp, so lets remove anything
# and everything that remains, besides the PVs themselves
self.objs, self.bus = get_objects()
for v in self.objs[VG_INT]:
# print "DEBUG: Removing VG= ", v.Uuid, v.Name
self.handle_return(v.Vg.Remove(g_tmo, {}))
if pv_device_list is None:
for v in self.objs[VG_INT]:
self.handle_return(v.Vg.Remove(g_tmo, {}))
else:
for p in self.objs[PV_INT]:
# When we remove a VG for a PV it could ripple across multiple
# VGs, so update each PV while removing each VG, to ensure
# the properties are current and correct.
p.update()
if p.Pv.Vg != '/':
v = ClientProxy(self.bus, p.Pv.Vg)
self.handle_return(v.Vg.Remove(g_tmo, {}))
# Check to make sure the PVs we had to start exist, else re-create
# them
@ -119,6 +152,12 @@ class TestDbusService(unittest.TestCase):
# print('Re-creating PV=', p)
self._pv_create(p)
def _check_consistency(self):
# Only do consistency checks if we aren't running the unit tests
# concurrently
if pv_device_list is None:
self.assertEqual(self._refresh(), 0)
def handle_return(self, rc):
if isinstance(rc, (tuple, list)):
# We have a tuple returned
@ -148,13 +187,12 @@ class TestDbusService(unittest.TestCase):
return self._manager().Manager.Refresh()
def test_refresh(self):
rc = self._refresh()
self.assertEqual(rc, 0)
self._check_consistency()
def test_version(self):
rc = self.objs[MANAGER_INT][0].Manager.Version
self.assertTrue(rc is not None and len(rc) > 0)
self.assertEqual(self._refresh(), 0)
self._check_consistency()
def _vg_create(self, pv_paths=None):
@ -172,13 +210,13 @@ class TestDbusService(unittest.TestCase):
def test_vg_create(self):
self._vg_create()
self.assertEqual(self._refresh(), 0)
self._check_consistency()
def test_vg_delete(self):
vg = self._vg_create().Vg
self.handle_return(vg.Remove(g_tmo, {}))
self.assertEqual(self._refresh(), 0)
self._check_consistency()
def _pv_remove(self, pv):
rc = self.handle_return(pv.Pv.Remove(g_tmo, {}))
@ -190,12 +228,12 @@ class TestDbusService(unittest.TestCase):
# Remove the PV
rc = self._pv_remove(target)
self.assertTrue(rc == '/')
self.assertEqual(self._refresh(), 0)
self._check_consistency()
# Add it back
rc = self._pv_create(target.Pv.Name)[0]
self.assertTrue(rc == '/')
self.assertEqual(self._refresh(), 0)
self._check_consistency()
def _create_raid5_thin_pool(self, vg=None):
@ -281,7 +319,7 @@ class TestDbusService(unittest.TestCase):
vg.Extend([pv_next.object_path], g_tmo, {})
)
self.assertTrue(path == '/')
self.assertEqual(self._refresh(), 0)
self._check_consistency()
# noinspection PyUnresolvedReferences
def test_vg_reduce(self):
@ -296,7 +334,7 @@ class TestDbusService(unittest.TestCase):
vg.Reduce(False, [vg.Pvs[0]], g_tmo, {})
)
self.assertTrue(path == '/')
self.assertEqual(self._refresh(), 0)
self._check_consistency()
# noinspection PyUnresolvedReferences
def test_vg_rename(self):
@ -323,7 +361,7 @@ class TestDbusService(unittest.TestCase):
path = self.handle_return(vg.Rename(new_name, g_tmo, {}))
self.assertTrue(path == '/')
self.assertEqual(self._refresh(), 0)
self._check_consistency()
# Do a vg lookup
path = mgr.LookUpByLvmId(new_name)
@ -404,7 +442,7 @@ class TestDbusService(unittest.TestCase):
path = self.handle_return(vg.Rename(new_name, g_tmo, {}))
self.assertTrue(path == '/')
self.assertEqual(self._refresh(), 0)
self._check_consistency()
# Go through each LV and make sure it has the correct path back to the
# VG
@ -442,7 +480,7 @@ class TestDbusService(unittest.TestCase):
# 'I' to 'i' between the time it takes to create a RAID and it returns
# and when we refresh state here. Not sure how we can handle this as
# we cannot just sit and poll all the time for changes...
# self.assertEqual(self._refresh(), 0)
# self._check_consistency()
return lv
def test_lv_create(self):
@ -532,7 +570,7 @@ class TestDbusService(unittest.TestCase):
path = self.objs[MANAGER_INT][0].Manager.LookUpByLvmId(new_name)
self.assertEqual(self._refresh(), 0)
self._check_consistency()
self.assertTrue(prev_path == path, "%s != %s" % (prev_path, path))
def test_lv_thinpool_rename(self):
@ -545,7 +583,7 @@ class TestDbusService(unittest.TestCase):
new_name = 'renamed_' + tp.LvCommon.Name
self.handle_return(tp.Lv.Rename(new_name, g_tmo, {}))
tp.update()
self.assertEqual(self._refresh(), 0)
self._check_consistency()
self.assertEqual(new_name, tp.LvCommon.Name)
# noinspection PyUnresolvedReferences
@ -568,13 +606,13 @@ class TestDbusService(unittest.TestCase):
)
self.assertTrue(rc == '/')
self.assertEqual(self._refresh(), 0)
self._check_consistency()
def test_lv_remove(self):
lv = self._create_lv().Lv
rc = self.handle_return(lv.Remove(g_tmo, {}))
self.assertTrue(rc == '/')
self.assertEqual(self._refresh(), 0)
self._check_consistency()
def test_lv_snapshot(self):
lv_p = self._create_lv()
@ -661,7 +699,7 @@ class TestDbusService(unittest.TestCase):
size, dbus.Array([], '(oii)'), g_tmo, {}))
self.assertEqual(rc, '/')
self.assertEqual(self._refresh(), 0)
self._check_consistency()
lv.update()
@ -695,7 +733,7 @@ class TestDbusService(unittest.TestCase):
(0, 0),
dbus.Array([], '(oii)'), g_tmo, {}))
self.assertTrue(rc == '/')
self.assertEqual(self._refresh(), 0)
self._check_consistency()
lv.update()
new_pv = str(lv.LvCommon.Devices[0][0])
@ -709,13 +747,13 @@ class TestDbusService(unittest.TestCase):
self.handle_return(lv_p.Lv.Deactivate(0, g_tmo, {}))
lv_p.update()
self.assertFalse(lv_p.LvCommon.Active)
self.assertEqual(self._refresh(), 0)
self._check_consistency()
self.handle_return(lv_p.Lv.Activate(0, g_tmo, {}))
lv_p.update()
self.assertTrue(lv_p.LvCommon.Active)
self.assertEqual(self._refresh(), 0)
self._check_consistency()
# Try control flags
for i in range(0, 5):
@ -723,7 +761,7 @@ class TestDbusService(unittest.TestCase):
self.handle_return(lv_p.Lv.Activate(1 << i, g_tmo, {}))
self.assertTrue(lv_p.LvCommon.Active)
self.assertEqual(self._refresh(), 0)
self._check_consistency()
def test_move(self):
lv = self._create_lv()
@ -735,7 +773,7 @@ class TestDbusService(unittest.TestCase):
rc = self.handle_return(vg.Move(
pv_to_move, (0, 0), dbus.Array([], '(oii)'), 0, {}))
self.assertEqual(rc, '/')
self.assertEqual(self._refresh(), 0)
self._check_consistency()
# Test Vg.Move
# TODO Test this more!
@ -758,7 +796,7 @@ class TestDbusService(unittest.TestCase):
location, (0, 0),
[(dst, pv.PeCount / 2, 0), ], g_tmo, {}))
self.assertEqual(job, '/')
self.assertEqual(self._refresh(), 0)
self._check_consistency()
def test_job_handling(self):
pv_paths = []
@ -973,12 +1011,12 @@ class TestDbusService(unittest.TestCase):
rc = self.handle_return(vg.Deactivate(0, g_tmo, {}))
self.assertEqual(rc, '/')
self.assertEqual(self._refresh(), 0)
self._check_consistency()
rc = self.handle_return(vg.Activate(0, g_tmo, {}))
self.assertEqual(rc, '/')
self.assertEqual(self._refresh(), 0)
self._check_consistency()
# Try control flags
for i in range(0, 5):
@ -997,12 +1035,12 @@ class TestDbusService(unittest.TestCase):
self.handle_return(pv.ReSize(new_size, g_tmo, {}))
self.assertEqual(self._refresh(), 0)
self._check_consistency()
pv.update()
self.assertTrue(pv.SizeBytes != original_size)
self.handle_return(pv.ReSize(0, g_tmo, {}))
self.assertEqual(self._refresh(), 0)
self._check_consistency()
pv.update()
self.assertTrue(pv.SizeBytes == original_size)
@ -1027,7 +1065,7 @@ class TestDbusService(unittest.TestCase):
pv.update()
self.assertTrue(pv.Allocatable)
self.assertEqual(self._refresh(), 0)
self._check_consistency()
@staticmethod
def _get_devices():
@ -1045,7 +1083,7 @@ class TestDbusService(unittest.TestCase):
False, True, dbus.Array([], 's'),
dbus.Array([], '(ii)'), g_tmo, {})), '/')
self.assertEqual(self._refresh(), 0)
self._check_consistency()
self.assertEqual(
self.handle_return(
mgr.PvScan(
@ -1053,7 +1091,7 @@ class TestDbusService(unittest.TestCase):
dbus.Array([], 's'),
dbus.Array([], '(ii)'), g_tmo, {})), '/')
self.assertEqual(self._refresh(), 0)
self._check_consistency()
block_path = []
for d in devices:
@ -1066,7 +1104,7 @@ class TestDbusService(unittest.TestCase):
block_path,
dbus.Array([], '(ii)'), g_tmo, {})), '/')
self.assertEqual(self._refresh(), 0)
self._check_consistency()
mm = []
for d in devices:
@ -1076,7 +1114,7 @@ class TestDbusService(unittest.TestCase):
self.handle_return(
mgr.PvScan(False, True, block_path, mm, g_tmo, {})), '/')
self.assertEqual(self._refresh(), 0)
self._check_consistency()
self.assertEqual(
self.handle_return(
@ -1084,7 +1122,7 @@ class TestDbusService(unittest.TestCase):
False, True,
dbus.Array([], 's'),
mm, g_tmo, {})), '/')
self.assertEqual(self._refresh(), 0)
self._check_consistency()
@staticmethod
def _write_some_data(device_path, size):
@ -1229,7 +1267,7 @@ class TestDbusService(unittest.TestCase):
# Create a VG and try to create LVs with different bad names
vg_path = self.handle_return(
mgr.VgCreate("test", pv_paths, g_tmo, {}))
mgr.VgCreate(vg_n(), pv_paths, g_tmo, {}))
vg_proxy = ClientProxy(self.bus, vg_path)
@ -1268,7 +1306,7 @@ class TestDbusService(unittest.TestCase):
pv_paths = [self.objs[PV_INT][0].object_path]
vg_path = self.handle_return(
mgr.VgCreate("test", pv_paths, g_tmo, {}))
mgr.VgCreate(vg_n(), pv_paths, g_tmo, {}))
vg_proxy = ClientProxy(self.bus, vg_path)
for c in self._invalid_tag_characters():
@ -1288,7 +1326,7 @@ class TestDbusService(unittest.TestCase):
pv_paths = [self.objs[PV_INT][0].object_path]
vg_path = self.handle_return(
mgr.VgCreate("test", pv_paths, g_tmo, {}))
mgr.VgCreate(vg_n(), pv_paths, g_tmo, {}))
vg_proxy = ClientProxy(self.bus, vg_path)
for i in range(1, 64):
@ -1312,7 +1350,7 @@ class TestDbusService(unittest.TestCase):
pv_paths = [self.objs[PV_INT][0].object_path]
vg_path = self.handle_return(
mgr.VgCreate("test", pv_paths, g_tmo, {}))
mgr.VgCreate(vg_n(), pv_paths, g_tmo, {}))
vg_proxy = ClientProxy(self.bus, vg_path)
tag = '--h/K.6g0A4FOEatf3+k_nI/Yp&L_u2oy-=j649x:+dUcYWPEo6.IWT0c'
@ -1350,31 +1388,30 @@ if __name__ == '__main__':
r = AggregateResults()
# Test forking & exec new each time
# Default is to test all modes
test_shell = os.getenv('LVM_DBUS_TEST_SHELL', 1)
# Default to no lvm shell
set_execution(False)
mode = int(test_shell)
if int(test_shell) == 0:
std_err_print('\n Running only lvm fork & exec test ***\n')
r.register_result(unittest.main(exit=False))
if mode == 0:
std_err_print('\n*** Testing only lvm fork & exec test mode ***\n')
elif mode == 1:
std_err_print('\n*** Testing fork & exec & lvm shell mode ***\n')
else:
std_err_print('\n *** Testing with lvm fork & exec *** \n')
r.register_result(unittest.main(exit=False))
g_tmo = 15
r.register_result(unittest.main(exit=False))
# Test lvm shell
std_err_print('\n *** Testing with lvm shell *** \n')
if set_execution(True):
g_tmo = 0
r.register_result(unittest.main(exit=False))
g_tmo = 15
r.register_result(unittest.main(exit=False))
std_err_print('\n*** Testing only lvm shell mode ***\n')
for g_tmo in [0, 15]:
if mode == 0:
if set_execution(False, r):
r.register_result(unittest.main(exit=False))
elif mode == 2:
if set_execution(True, r):
r.register_result(unittest.main(exit=False))
else:
r.register_fail()
std_err_print(
"ERROR: Unable to dynamically configure service to use "
"lvm shell!")
if set_execution(False, r):
r.register_result(unittest.main(exit=False))
# Test lvm shell
if set_execution(True, r):
r.register_result(unittest.main(exit=False))
r.exit_run()