diff options
author | Vojtech Trefny <vtrefny@redhat.com> | 2019-12-27 15:29:15 +0100 |
---|---|---|
committer | Tony Asleson <tasleson@redhat.com> | 2020-01-09 13:07:47 -0600 |
commit | c3ef41f620418bc9d5932fc6f7284a600e6cebec (patch) | |
tree | 070e66f49d92310fe8ba041dbd4a72d998daf63e | |
parent | 87e88078c993a149af6d2f104998c508b7aee9be (diff) | |
download | lvm2-c3ef41f620418bc9d5932fc6f7284a600e6cebec.tar.gz |
lvmdbusd: Add VDO enable/disable compress & dedup
Added methods to vdo pool interface to allow enabling and
disabling of VDO:
* Compression
* Deduplication
-rw-r--r-- | daemons/lvmdbusd/cmdhandler.py | 22 | ||||
-rw-r--r-- | daemons/lvmdbusd/lv.py | 66 | ||||
-rwxr-xr-x | test/dbus/lvmdbustest.py | 32 |
3 files changed, 118 insertions, 2 deletions
diff --git a/daemons/lvmdbusd/cmdhandler.py b/daemons/lvmdbusd/cmdhandler.py index e0bb10563..aa5199f18 100644 --- a/daemons/lvmdbusd/cmdhandler.py +++ b/daemons/lvmdbusd/cmdhandler.py @@ -460,6 +460,28 @@ def lv_detach_cache(lv_full_name, detach_options, destroy_cache): return call(cmd) +def lv_vdo_compression(lv_path, enable, comp_options): + cmd = ['lvchange', '--compression'] + if enable: + cmd.append('y') + else: + cmd.append('n') + cmd.extend(options_to_cli_args(comp_options)) + cmd.append(lv_path) + return call(cmd) + + +def lv_vdo_deduplication(lv_path, enable, dedup_options): + cmd = ['lvchange', '--deduplication'] + if enable: + cmd.append('y') + else: + cmd.append('n') + cmd.extend(options_to_cli_args(dedup_options)) + cmd.append(lv_path) + return call(cmd) + + def supports_json(): cmd = ['help'] rc, out, err = call(cmd) diff --git a/daemons/lvmdbusd/lv.py b/daemons/lvmdbusd/lv.py index 301874955..fd46f348b 100644 --- a/daemons/lvmdbusd/lv.py +++ b/daemons/lvmdbusd/lv.py @@ -780,6 +780,72 @@ class LvVdoPool(Lv): def DataLv(self): return dbus.ObjectPath(self._data_lv) + @staticmethod + def _enable_disable_compression(pool_uuid, pool_name, enable, comp_options): + # Make sure we have a dbus object representing it + LvCommon.validate_dbus_object(pool_uuid, pool_name) + # Rename the logical volume + LvCommon.handle_execute(*cmdhandler.lv_vdo_compression( + pool_name, enable, comp_options)) + return '/' + + @dbus.service.method( + dbus_interface=VDO_POOL_INTERFACE, + in_signature='ia{sv}', + out_signature='o', + async_callbacks=('cb', 'cbe')) + def EnableCompression(self, tmo, comp_options, cb, cbe): + r = RequestEntry( + tmo, LvVdoPool._enable_disable_compression, + (self.Uuid, self.lvm_id, True, comp_options), + cb, cbe, False) + cfg.worker_q.put(r) + + @dbus.service.method( + dbus_interface=VDO_POOL_INTERFACE, + in_signature='ia{sv}', + out_signature='o', + async_callbacks=('cb', 'cbe')) + def DisableCompression(self, tmo, comp_options, cb, cbe): + r = RequestEntry( + tmo, LvVdoPool._enable_disable_compression, + (self.Uuid, self.lvm_id, False, comp_options), + cb, cbe, False) + cfg.worker_q.put(r) + + @staticmethod + def _enable_disable_deduplication(pool_uuid, pool_name, enable, dedup_options): + # Make sure we have a dbus object representing it + LvCommon.validate_dbus_object(pool_uuid, pool_name) + # Rename the logical volume + LvCommon.handle_execute(*cmdhandler.lv_vdo_deduplication( + pool_name, enable, dedup_options)) + return '/' + + @dbus.service.method( + dbus_interface=VDO_POOL_INTERFACE, + in_signature='ia{sv}', + out_signature='o', + async_callbacks=('cb', 'cbe')) + def EnableDeduplication(self, tmo, dedup_options, cb, cbe): + r = RequestEntry( + tmo, LvVdoPool._enable_disable_deduplication, + (self.Uuid, self.lvm_id, True, dedup_options), + cb, cbe, False) + cfg.worker_q.put(r) + + @dbus.service.method( + dbus_interface=VDO_POOL_INTERFACE, + in_signature='ia{sv}', + out_signature='o', + async_callbacks=('cb', 'cbe')) + def DisableDeduplication(self, tmo, dedup_options, cb, cbe): + r = RequestEntry( + tmo, LvVdoPool._enable_disable_deduplication, + (self.Uuid, self.lvm_id, False, dedup_options), + cb, cbe, False) + cfg.worker_q.put(r) + # noinspection PyPep8Naming class LvThinPool(Lv): diff --git a/test/dbus/lvmdbustest.py b/test/dbus/lvmdbustest.py index 82159685d..b819a049e 100755 --- a/test/dbus/lvmdbustest.py +++ b/test/dbus/lvmdbustest.py @@ -1858,11 +1858,11 @@ class TestDbusService(unittest.TestCase): self.assertEqual(pv_object_path, self._lookup(symlink)) self.assertEqual(pv_object_path, self._lookup(pv_device_path)) - def _create_vdo_pool_and_lv(self): + def _create_vdo_pool_and_lv(self, vg_prefix="vdo_"): pool_name = lv_n("_vdo_pool") lv_name = lv_n() - vg_proxy = self._vg_create(vg_prefix="vdo_") + vg_proxy = self._vg_create(vg_prefix=vg_prefix) vdo_pool_object_path = self.handle_return( vg_proxy.VgVdo.CreateVdoPoolandLv( pool_name, lv_name, @@ -1903,6 +1903,34 @@ class TestDbusService(unittest.TestCase): vg, _, _ = self._create_vdo_pool_and_lv() self.handle_return(vg.Vg.Remove(dbus.Int32(g_tmo), EOD)) + def test_vdo_pool_compression_deduplication(self): + if not self.vdo: + raise unittest.SkipTest('vdo not supported') + + vg, pool, _lv = self._create_vdo_pool_and_lv(vg_prefix="vdo2_") + + # compression and deduplication should be enabled by default + self.assertEqual(pool.VdoPool.Compression, "enabled") + self.assertEqual(pool.VdoPool.Deduplication, "enabled") + + self.handle_return( + pool.VdoPool.DisableCompression(dbus.Int32(g_tmo), EOD)) + self.handle_return( + pool.VdoPool.DisableDeduplication(dbus.Int32(g_tmo), EOD)) + pool.update() + self.assertEqual(pool.VdoPool.Compression, "") + self.assertEqual(pool.VdoPool.Deduplication, "") + + self.handle_return( + pool.VdoPool.EnableCompression(dbus.Int32(g_tmo), EOD)) + self.handle_return( + pool.VdoPool.EnableDeduplication(dbus.Int32(g_tmo), EOD)) + pool.update() + self.assertEqual(pool.VdoPool.Compression, "enabled") + self.assertEqual(pool.VdoPool.Deduplication, "enabled") + + self.handle_return(vg.Vg.Remove(dbus.Int32(g_tmo), EOD)) + def _test_lv_method_interface(self, lv): self._rename_lv_test(lv) self._test_activate_deactivate(lv) |