From 5425d2c6c56b8de78ace096aa41f8527d3837b32 Mon Sep 17 00:00:00 2001 From: Ratnadeep Debnath Date: Thu, 31 Dec 2015 17:00:53 +0530 Subject: [PATCH 1/3] Fix namespace conflicts in answers.conf. Fixes #478 --- atomicapp/nulecule/base.py | 10 ++++++++-- atomicapp/nulecule/lib.py | 6 ++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/atomicapp/nulecule/base.py b/atomicapp/nulecule/base.py index 3c0ace08..b6f7ad8c 100644 --- a/atomicapp/nulecule/base.py +++ b/atomicapp/nulecule/base.py @@ -222,8 +222,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), self.config) component.load(nodeps, dryrun) components.append(component) @@ -246,6 +246,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): diff --git a/atomicapp/nulecule/lib.py b/atomicapp/nulecule/lib.py index 4dd41f39..4339067f 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 fetch(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 From 641f1c9a1777a97a7efd945a1a31f9072c81f02a Mon Sep 17 00:00:00 2001 From: Ratnadeep Debnath Date: Mon, 8 Feb 2016 16:55:52 +0530 Subject: [PATCH 2/3] Use '__' as a separtator in answers.conf section names. As anymarkup is not able to parse '.' or ':' in section names in INI files. --- atomicapp/nulecule/base.py | 2 +- atomicapp/nulecule/lib.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/atomicapp/nulecule/base.py b/atomicapp/nulecule/base.py index b6f7ad8c..a97a8004 100644 --- a/atomicapp/nulecule/base.py +++ b/atomicapp/nulecule/base.py @@ -249,7 +249,7 @@ def render(self, provider_key=None, dryrun=False): def _get_component_namespace(self, component_name): current_namespace = '' if self.namespace == GLOBAL_CONF else self.namespace return ( - '%s:%s' % (current_namespace, component_name) + '%s__%s' % (current_namespace, component_name) if current_namespace else component_name) diff --git a/atomicapp/nulecule/lib.py b/atomicapp/nulecule/lib.py index 4339067f..1436fff6 100644 --- a/atomicapp/nulecule/lib.py +++ b/atomicapp/nulecule/lib.py @@ -113,5 +113,5 @@ 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 + tokens = self.namespace.split('__') + return '__'.join(tokens[:-1]) if len(tokens) > 1 else GLOBAL_CONF From dfbc9121b6bab5d7e44e7545d1a34a13b92c6460 Mon Sep 17 00:00:00 2001 From: Ratnadeep Debnath Date: Mon, 8 Feb 2016 17:45:27 +0530 Subject: [PATCH 3/3] Provide namespace when loading external Nulecule application from path. --- atomicapp/nulecule/base.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/atomicapp/nulecule/base.py b/atomicapp/nulecule/base.py index a97a8004..496bdf30 100644 --- a/atomicapp/nulecule/base.py +++ b/atomicapp/nulecule/base.py @@ -340,7 +340,8 @@ def load_external_application(self, dryrun=False, update=False): 'Found existing external application for %s. ' 'Loading it.' % self.name) nulecule = Nulecule.load_from_path( - external_app_path, dryrun=dryrun, update=update) + external_app_path, dryrun=dryrun, update=update, + namespace=self.namespace) elif not dryrun: logger.info('Pulling external application for %s.' % self.name) nulecule = Nulecule.unpack(