Skip to content

Commit

Permalink
instance: add priority as a property
Browse files Browse the repository at this point in the history
Currently instance priorities are only used at startup to sort the
instance classes. To enable dynamic creation of instances, we need
to store the priorities, so new instances can be sorted accordingly.

Signed-off-by: Adriaan Schmidt <[email protected]>
  • Loading branch information
adriaan42 committed Mar 15, 2024
1 parent 33a54b3 commit b10bafc
Show file tree
Hide file tree
Showing 5 changed files with 33 additions and 16 deletions.
14 changes: 7 additions & 7 deletions tests/unit/plugins/test_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,13 +50,13 @@ def test_option_bool(self):

def test_create_instance(self):
instance = self._plugin.create_instance(\
'first_instance','test','test','test','test',\
'first_instance',0,'test','test','test','test',\
{'default_option1':'default_value2'})
self.assertIsNotNone(instance)

def test_destroy_instance(self):
instance = self._plugin.create_instance(\
'first_instance','test','test','test','test',\
'first_instance',0,'test','test','test','test',\
{'default_option1':'default_value2'})
instance.plugin.init_devices()

Expand All @@ -66,7 +66,7 @@ def test_destroy_instance(self):
def test_get_matching_devices(self):
""" without udev regex """
instance = self._plugin.create_instance(\
'first_instance','right_device*',None,'test','test',\
'first_instance',0,'right_device*',None,'test','test',\
{'default_option1':'default_value2'})

self.assertEqual(self._plugin._get_matching_devices(\
Expand All @@ -75,7 +75,7 @@ def test_get_matching_devices(self):

""" with udev regex """
instance = self._plugin.create_instance(\
'second_instance','right_device*','device[1-2]','test','test',\
'second_instance',0,'right_device*','device[1-2]','test','test',\
{'default_option1':'default_value2'})

device1 = DummyDevice('device1',{'name':'device1'})
Expand Down Expand Up @@ -104,15 +104,15 @@ def test_check_commands(self):
plugin_instance_factory,None,None)

def test_execute_all_non_device_commands(self):
instance = self._commands_plugin.create_instance('test_instance','',\
instance = self._commands_plugin.create_instance('test_instance',0,'',\
'','','',{'size':'XXL'})

self._commands_plugin._execute_all_non_device_commands(instance)

self.assertEqual(self._commands_plugin._size,'XXL')

def test_execute_all_device_commands(self):
instance = self._commands_plugin.create_instance('test_instance','',\
instance = self._commands_plugin.create_instance('test_instance',0,'',\
'','','',{'device_setting':'010'})

device1 = DummyDevice('device1',{})
Expand All @@ -133,7 +133,7 @@ def test_process_assignment_modifiers(self):
'<100','200'),'100')

def test_get_current_value(self):
instance = self._commands_plugin.create_instance('test_instance','',\
instance = self._commands_plugin.create_instance('test_instance',0,'',\
'','','',{})

command = [com for com in self._commands_plugin._commands.values()\
Expand Down
5 changes: 3 additions & 2 deletions tuned/plugins/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,15 +93,16 @@ def _option_bool(self, value):
# Interface for manipulation with instances of the plugin.
#

def create_instance(self, name, devices_expression, devices_udev_regex, script_pre, script_post, options):
def create_instance(self, name, priority, devices_expression, devices_udev_regex, script_pre, script_post, options):
"""Create new instance of the plugin and seize the devices."""
if name in self._instances:
raise Exception("Plugin instance with name '%s' already exists." % name)

effective_options = self._get_effective_options(options)
instance = self._instance_factory.create(self, name, devices_expression, devices_udev_regex, \
instance = self._instance_factory.create(self, name, priority, devices_expression, devices_udev_regex, \
script_pre, script_post, effective_options)
self._instances[name] = instance
self._instances = collections.OrderedDict(sorted(self._instances.items(), key=lambda x: x[1].priority))

return instance

Expand Down
7 changes: 6 additions & 1 deletion tuned/plugins/instance/instance.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ class Instance(object):
"""
"""

def __init__(self, plugin, name, devices_expression, devices_udev_regex, script_pre, script_post, options):
def __init__(self, plugin, name, priority, devices_expression, devices_udev_regex, script_pre, script_post, options):
self._plugin = plugin
self._name = name
self._devices_expression = devices_expression
Expand All @@ -14,6 +14,7 @@ def __init__(self, plugin, name, devices_expression, devices_udev_regex, script_
self._options = options

self._active = True
self._priority = priority
self._has_static_tuning = False
self._has_dynamic_tuning = False
self._assigned_devices = set()
Expand All @@ -38,6 +39,10 @@ def active(self):
def active(self, value):
self._active = value

@property
def priority(self):
return self._priority

@property
def devices_expression(self):
return self._devices_expression
Expand Down
11 changes: 10 additions & 1 deletion tuned/profiles/unit.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,12 @@ class Unit(object):
Unit description.
"""

__slots__ = [ "_name", "_type", "_enabled", "_replace", "_drop", "_devices", "_devices_udev_regex", \
__slots__ = [ "_name", "_priority", "_type", "_enabled", "_replace", "_drop", "_devices", "_devices_udev_regex", \
"_cpuinfo_regex", "_uname_regex", "_script_pre", "_script_post", "_options" ]

def __init__(self, name, config):
self._name = name
self._priority = config.pop("priority", None)
self._type = config.pop("type", self._name)
self._enabled = config.pop("enabled", True) in [True, "True", "true", 1, "1"]
self._replace = config.pop("replace", False) in [True, "True", "true", 1, "1"]
Expand All @@ -29,6 +30,14 @@ def __init__(self, name, config):
def name(self):
return self._name

@property
def priority(self):
return self._priority

@priority.setter
def priority(self, value):
self._priority = value

@property
def type(self):
return self._type
Expand Down
12 changes: 7 additions & 5 deletions tuned/units/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,14 +73,15 @@ def create(self, instances_config):
log.debug("skipping instance '%s', uname does not match" % instance_name)
continue

instance_info.options.setdefault("priority", self._def_instance_priority)
instance_info.options["priority"] = int(instance_info.options["priority"])
if instance_info.priority is None:
instance_info.priority = int(self._def_instance_priority)
else:
instance_info.priority = int(instance_info.priority)
instance_info_list.append(instance_info)

instance_info_list.sort(key=lambda x: x.options["priority"])
instance_info_list.sort(key=lambda x: x.priority)
plugins_by_name = collections.OrderedDict()
for instance_info in instance_info_list:
instance_info.options.pop("priority")
plugins_by_name[instance_info.type] = None

for plugin_name, none in list(plugins_by_name.items()):
Expand All @@ -102,7 +103,8 @@ def create(self, instances_config):
if plugin is None:
continue
log.debug("creating '%s' (%s)" % (instance_info.name, instance_info.type))
new_instance = plugin.create_instance(instance_info.name, instance_info.devices, instance_info.devices_udev_regex, \
new_instance = plugin.create_instance(instance_info.name, instance_info.priority, \
instance_info.devices, instance_info.devices_udev_regex, \
instance_info.script_pre, instance_info.script_post, instance_info.options)
instances.append(new_instance)
for instance in instances:
Expand Down

0 comments on commit b10bafc

Please sign in to comment.