diff --git a/wlauto/core/configuration/configuration.py b/wlauto/core/configuration/configuration.py index 8d6e89ad..5f99a4cb 100644 --- a/wlauto/core/configuration/configuration.py +++ b/wlauto/core/configuration/configuration.py @@ -489,89 +489,6 @@ class CpuFreqParameters(object): ##################### -# pylint: disable=too-many-nested-blocks, too-many-branches -def merge_using_priority_specificity(generic_name, specific_name, plugin_cache): - """ - WA configuration can come from various sources of increasing priority, as well - as being specified in a generic and specific manner (e.g. ``device_config`` - and ``nexus10`` respectivly). WA has two rules for the priority of configuration: - - - Configuration from higher priority sources overrides configuration from - lower priority sources. - - More specific configuration overrides less specific configuration. - - There is a situation where these two rules come into conflict. When a generic - configuration is given in config source of high priority and a specific - configuration is given in a config source of lower priority. In this situation - it is not possible to know the end users intention and WA will error. - - :param generic_name: The name of the generic configuration e.g ``device_config`` - :param specific_name: The name of the specific configuration used, e.g ``nexus10`` - :param cfg_point: A dict of ``ConfigurationPoint``s to be used when merging configuration. - keys=config point name, values=config point - - :rtype: A fully merged and validated configuration in the form of a obj_dict. - """ - generic_config = plugin_cache.get_plugin_config(generic_name) - specific_config = plugin_cache.get_plugin_config(specific_name) - cfg_points = plugin_cache.get_plugin_parameters(specific_name) - sources = plugin_cache.sources - final_config = obj_dict(not_in_dict=['name']) - seen_specific_config = defaultdict(list) - - # set_value uses the 'name' attribute of the passed object in it error - # messages, to ensure these messages make sense the name will have to be - # changed several times during this function. - final_config.name = specific_name - - # Load default config - for cfg_point in cfg_points.itervalues(): - cfg_point.set_value(final_config, check_mandatory=False) - - # pylint: disable=too-many-nested-blocks - for source in sources: - try: - if source in generic_config: - for name, cfg_point in cfg_points.iteritems(): - final_config.name = generic_name - if name in generic_config[source]: - if name in seen_specific_config: - msg = ('"{generic_name}" configuration "{config_name}" has already been ' - 'specified more specifically for {specific_name} in:\n\t\t{sources}') - msg = msg.format(generic_name=generic_name, - config_name=name, - specific_name=specific_name, - sources="\n\t\t".join(seen_specific_config[name])) - raise ConfigError(msg) - value = generic_config[source].pop(name) - cfg_point.set_value(final_config, value, check_mandatory=False) - if generic_config[source]: - msg = 'Invalid entry(ies) for "{}" in "{}": "{}"' - msg = msg.format(specific_name, generic_name, '", "'.join(generic_config[source])) - raise ConfigError(msg) - - if source in specific_config: - final_config.name = specific_name - for name, cfg_point in cfg_points.iteritems(): - if name in specific_config[source]: - seen_specific_config[name].append(source) - value = specific_config[source].pop(name) - cfg_point.set_value(final_config, value, check_mandatory=False) - if specific_config[source]: - msg = 'Invalid entry(ies) for "{}": "{}"' - raise ConfigError(msg.format(specific_name, '", "'.join(specific_config[source]))) - - except ConfigError as e: - raise ConfigError('Error in "{}":\n\t{}'.format(source, str(e))) - - # Validate final configuration - final_config.name = specific_name - for cfg_point in cfg_points.itervalues(): - cfg_point.validate(final_config) - - return final_config - - class Configuration(object): config_points = [] @@ -845,9 +762,8 @@ class RunConfiguration(Configuration): selected device. """ # pylint: disable=no-member - self.device_config = merge_using_priority_specificity("device_config", - self.device, - plugin_cache) + self.device_config = plugin_cache.get_plugin_config(self.device_config, + generic_name="device_config") def to_pod(self): pod = super(RunConfiguration, self).to_pod() @@ -950,9 +866,8 @@ class JobSpec(Configuration): # Only call after the rest of the JobSpec is merged def merge_workload_parameters(self, plugin_cache): # merge global generic and specific config - workload_params = merge_using_priority_specificity("workload_parameters", - self.workload_name, - plugin_cache) + workload_params = plugin_cache.get_plugin_config(self.workload_name, + generic_name="workload_parameters") # Merge entry "workload_parameters" # TODO: Wrap in - "error in [agenda path]"