diff --git a/atomicapp/nulecule/base.py b/atomicapp/nulecule/base.py index a008abd8..01caca61 100644 --- a/atomicapp/nulecule/base.py +++ b/atomicapp/nulecule/base.py @@ -177,9 +177,14 @@ def load_config(self, config=None, ask=False, skip_asking=False): # FIXME: Find a better way to expose config data to components. # A component should not get access to all the variables, # but only to variables it needs. - component.load_config(config=copy.deepcopy(self.config), - ask=ask, skip_asking=skip_asking) - self.merge_config(self.config, component.config) + if isinstance(component.params, dict): + component.load_config(config=copy.deepcopy(self.config), + ask=False, skip_asking=True) + else: + # FIXME: support old style component params list + component.load_config(config=copy.deepcopy(self.config), + ask=ask, skip_asking=skip_asking) + self.merge_config(self.config, component.config) def load_components(self, nodeps=False, dryrun=False): """ @@ -200,8 +205,8 @@ def load_components(self, nodeps=False, dryrun=False): node_name = node[NAME_KEY] source = Utils.getSourceImage(node) component = NuleculeComponent( - node_name, self.basepath, source, - node.get(PARAMS_KEY), node.get(ARTIFACTS_KEY)) + self._get_component_namespace(node_name), self.basepath, + source, node.get(PARAMS_KEY), node.get(ARTIFACTS_KEY)) component.load(nodeps, dryrun) components.append(component) self.components = components @@ -223,6 +228,12 @@ def render(self, provider_key=None, dryrun=False): for component in self.components: component.render(provider_key=provider_key, dryrun=dryrun) + def _get_component_namespace(self, component_name): + current_namespace = '' if self.namespace == GLOBAL_CONF else self.namespace + return ( + '%s:%s' % (current_namespace, component_name) + if current_namespace else component_name) + class NuleculeComponent(NuleculeBase): """ @@ -280,12 +291,26 @@ def load_config(self, config=None, ask=False, skip_asking=False): """ Load config for the Nulecule component. """ - super(NuleculeComponent, self).load_config( - config, ask=ask, skip_asking=skip_asking) - if isinstance(self._app, Nulecule): - self._app.load_config(config=copy.deepcopy(self.config), - ask=ask, skip_asking=skip_asking) - self.merge_config(self.config, self._app.config) + if isinstance(self.params, dict): + _config = {GLOBAL_CONF: {}} if self.source else config + for key, value in self.params.items(): + if value.startswith('$') and value[1:] in config.get( + GLOBAL_CONF, {}): + _config[GLOBAL_CONF][key] = config[GLOBAL_CONF][value[1:]] + else: + _config[GLOBAL_CONF][key] = value + if isinstance(self._app, Nulecule): + self._app.load_config(config=copy.deepcopy(_config), + ask=ask, skip_asking=skip_asking) + self.config = config + else: + # FIXME: Support old style component params list + super(NuleculeComponent, self).load_config( + config, ask=ask, skip_asking=skip_asking) + if isinstance(self._app, Nulecule): + self._app.load_config(config=copy.deepcopy(self.config), + ask=ask, skip_asking=skip_asking) + self.merge_config(self.config, self._app.config) def load_external_application(self, dryrun=False, update=False): """ diff --git a/atomicapp/nulecule/lib.py b/atomicapp/nulecule/lib.py index 141a12d2..b4ef565e 100644 --- a/atomicapp/nulecule/lib.py +++ b/atomicapp/nulecule/lib.py @@ -39,8 +39,10 @@ def load_config(self, config, ask=False, skip_asking=False): Returns: None """ + parent_namespace = self._get_parent_namespace() for param in self.params: value = config.get(self.namespace, {}).get(param[NAME_KEY]) or \ + config.get(parent_namespace, {}).get(param[NAME_KEY]) or \ config.get(GLOBAL_CONF, {}).get(param[NAME_KEY]) if value is None and (ask or ( not skip_asking and param.get(DEFAULTNAME_KEY) is None)): @@ -109,3 +111,7 @@ def install(self): def uninstall(self): raise NotImplementedError + + def _get_parent_namespace(self): + tokens = self.namespace.split(':') + return ':'.join(tokens[:-1]) if len(tokens) > 1 else GLOBAL_CONF