From b678b9828cb7e7b3da8db20140ba9f4454a8076d Mon Sep 17 00:00:00 2001 From: Brian Coca Date: Wed, 22 Jul 2015 22:32:18 -0400 Subject: [PATCH] simplified and normalized lookup search path behaviour --- lib/ansible/plugins/lookup/csvfile.py | 11 ++++++--- lib/ansible/plugins/lookup/file.py | 32 +++++++++++--------------- lib/ansible/plugins/lookup/template.py | 16 +++++++++---- 3 files changed, 33 insertions(+), 26 deletions(-) diff --git a/lib/ansible/plugins/lookup/csvfile.py b/lib/ansible/plugins/lookup/csvfile.py index 2a98d19fe4c..e15fd3fc36f 100644 --- a/lib/ansible/plugins/lookup/csvfile.py +++ b/lib/ansible/plugins/lookup/csvfile.py @@ -46,6 +46,12 @@ class LookupModule(LookupBase): terms = [ terms ] ret = [] + + if 'role_path' in variables: + basedir = variables['role_path'] + else: + basedir = self._loader.get_basedir() + for term in terms: params = term.split() key = params[0] @@ -69,9 +75,8 @@ class LookupModule(LookupBase): if paramvals['delimiter'] == 'TAB': paramvals['delimiter'] = "\t" - path = self._loader.path_dwim(paramvals['file']) - - var = self.read_csv(path, key, paramvals['delimiter'], paramvals['default'], paramvals['col']) + lookupfile = self._loader.path_dwim_relative(basedir, 'files', term) + var = self.read_csv(lookupfile, key, paramvals['delimiter'], paramvals['default'], paramvals['col']) if var is not None: if type(var) is list: for v in var: diff --git a/lib/ansible/plugins/lookup/file.py b/lib/ansible/plugins/lookup/file.py index b38c2eff555..f3a1db47cf0 100644 --- a/lib/ansible/plugins/lookup/file.py +++ b/lib/ansible/plugins/lookup/file.py @@ -31,10 +31,13 @@ class LookupModule(LookupBase): terms = [ terms ] ret = [] + + if 'role_path' in variables: + basedir = variables['role_path'] + else: + basedir = self._loader.get_basedir() + for term in terms: - basedir_path = self._loader.path_dwim(term) - relative_path = None - playbook_path = None # Special handling of the file lookup, used primarily when the # lookup is done from a role. If the file isn't found in the @@ -42,23 +45,14 @@ class LookupModule(LookupBase): # role/files/ directory, and finally the playbook directory # itself (which will be relative to the current working dir) - if 'role_path' in variables: - relative_path = self._loader.path_dwim_relative(variables['role_path'], 'files', term) - - # FIXME: the original file stuff still needs to be worked out, but the - # playbook_dir stuff should be able to be removed as it should - # be covered by the fact that the loader contains that info - if 'playbook_dir' in variables: - playbook_path = self._loader.path_dwim_relative(variables['playbook_dir'],'files', term) - - for path in (basedir_path, relative_path, playbook_path): - try: - contents, show_data = self._loader._get_file_contents(path) + lookupfile = self._loader.path_dwim_relative(basedir, 'files', term) + try: + if lookupfile: + contents, show_data = self._loader._get_file_contents(lookupfile) ret.append(contents.rstrip()) - break - except AnsibleParserError: - continue - else: + else: + raise AnsibleParserError() + except AnsibleParserError: raise AnsibleError("could not locate file in lookup: %s" % term) return ret diff --git a/lib/ansible/plugins/lookup/template.py b/lib/ansible/plugins/lookup/template.py index e53e1990a0d..afb19a974c7 100644 --- a/lib/ansible/plugins/lookup/template.py +++ b/lib/ansible/plugins/lookup/template.py @@ -30,16 +30,24 @@ class LookupModule(LookupBase): if not isinstance(terms, list): terms = [ terms ] + ret = [] + templar = Templar(loader=self._loader, variables=variables) - ret = [] + if 'role_path' in variables: + basedir = variables['role_path'] + else: + basedir = self._loader.get_basedir() + for term in terms: - path = self._loader.path_dwim(term) - if os.path.exists(path): - with open(path, 'r') as f: + + lookupfile = self._loader.path_dwim_relative(basedir, 'templates', term) + if lookupfile and os.path.exists(lookupfile): + with open(lookupfile, 'r') as f: template_data = f.read() res = templar.template(template_data, preserve_trailing_newlines=True) ret.append(res) else: raise AnsibleError("the template file %s could not be found for the lookup" % term) + return ret