From 21bc0b4d177f4e2e86252eda9774d529107203bc Mon Sep 17 00:00:00 2001 From: Adriaan Schmidt Date: Tue, 3 Dec 2024 08:50:53 +0100 Subject: [PATCH] feat: allow dynamic instances of non-hotplug plugins Signed-off-by: Adriaan Schmidt --- tests/unit/plugins/test_base.py | 6 ++++++ tuned/daemon/controller.py | 8 -------- tuned/plugins/base.py | 15 +++++++++++++++ 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/tests/unit/plugins/test_base.py b/tests/unit/plugins/test_base.py index af012050f..ee1f21450 100644 --- a/tests/unit/plugins/test_base.py +++ b/tests/unit/plugins/test_base.py @@ -68,6 +68,7 @@ def test_get_matching_devices(self): instance = self._plugin.create_instance(\ 'first_instance',0,'right_device*',None,'test','test',\ {'default_option1':'default_value2'}) + instance.plugin.init_devices() self.assertEqual(self._plugin._get_matching_devices(\ instance,['bad_device','right_device1','right_device2']),\ @@ -77,6 +78,7 @@ def test_get_matching_devices(self): instance = self._plugin.create_instance(\ 'second_instance',0,'right_device*','device[1-2]','test','test',\ {'default_option1':'default_value2'}) + instance.plugin.init_devices() device1 = DummyDevice('device1',{'name':'device1'}) device2 = DummyDevice('device2',{'name':'device2'}) @@ -177,6 +179,10 @@ def _get_config_options(self): def _instance_cleanup(self, instance): self.cleaned_instances.append(instance) + def _init_devices(self): + super(DummyPlugin,self)._init_devices() + self._devices_supported = True + def _get_device_objects(self, devices): objects = [] for device in devices: diff --git a/tuned/daemon/controller.py b/tuned/daemon/controller.py index 85ae2ff9a..5c5eeefc8 100644 --- a/tuned/daemon/controller.py +++ b/tuned/daemon/controller.py @@ -485,10 +485,6 @@ def instance_create(self, plugin_name, instance_name, options, caller = None): log.error(rets) return (False, rets) plugin = plugins[plugin_name] - if not isinstance(plugin, hotplug.Plugin): - rets = "Plugin '%s' does not support hotplugging or dynamic instances." % plugin.name - log.error(rets) - return (False, rets) devices = options.pop("devices", None) devices_udev_regex = options.pop("devices_udev_regex", None) script_pre = options.pop("script_pre", None) @@ -543,10 +539,6 @@ def instance_destroy(self, instance_name, caller = None): log.error(rets) return (False, rets) plugin = instance.plugin - if not isinstance(plugin, hotplug.Plugin): - rets = "Plugin '%s' does not support hotplugging or dynamic instances." % plugin.name - log.error(rets) - return (False, rets) devices = instance.processed_devices.copy() try: plugin._remove_devices_nocheck(instance, devices) diff --git a/tuned/plugins/base.py b/tuned/plugins/base.py index b6ac8ddb1..aa795fff8 100644 --- a/tuned/plugins/base.py +++ b/tuned/plugins/base.py @@ -154,6 +154,9 @@ def _get_device_objects(self, devices): return None def _get_matching_devices(self, instance, devices): + if not self._devices_supported: + return set() + if instance.devices_udev_regex is None: return set(self._device_matcher.match_list(instance.devices_expression, devices)) else: @@ -164,6 +167,18 @@ def _get_matching_devices(self, instance, devices): udev_devices = self._device_matcher_udev.match_list(instance.devices_udev_regex, udev_devices) return set([x.sys_name for x in udev_devices]) + def _add_device(self, device_name): + pass + + def _add_devices_nocheck(self, instance, device_names): + pass + + def _remove_device(self, device_name): + pass + + def _remove_devices_nocheck(self, instance, device_names): + pass + def assign_free_devices(self, instance): if not self._devices_supported: return