Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

# (c) 2012-2014, Michael DeHaan <michael.dehaan@gmail.com> 

# 

# This file is part of Ansible 

# 

# Ansible is free software: you can redistribute it and/or modify 

# it under the terms of the GNU General Public License as published by 

# the Free Software Foundation, either version 3 of the License, or 

# (at your option) any later version. 

# 

# Ansible is distributed in the hope that it will be useful, 

# but WITHOUT ANY WARRANTY; without even the implied warranty of 

# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 

# GNU General Public License for more details. 

# 

# You should have received a copy of the GNU General Public License 

# along with Ansible. If not, see <http://www.gnu.org/licenses/>. 

 

# Make coding more python3-ish 

from __future__ import (absolute_import, division, print_function) 

__metaclass__ = type 

 

from abc import abstractmethod 

 

from ansible.errors import AnsibleFileNotFound 

from ansible.plugins import AnsiblePlugin 

 

try: 

from __main__ import display 

except ImportError: 

from ansible.utils.display import Display 

display = Display() 

 

__all__ = ['LookupBase'] 

 

 

class LookupBase(AnsiblePlugin): 

 

def __init__(self, loader=None, templar=None, **kwargs): 

 

super(LookupBase, self).__init__() 

 

self._loader = loader 

self._templar = templar 

 

# Backwards compat: self._display isn't really needed, just import the global display and use that. 

self._display = display 

 

def get_basedir(self, variables): 

if 'role_path' in variables: 

return variables['role_path'] 

else: 

return self._loader.get_basedir() 

 

@staticmethod 

def _flatten(terms): 

ret = [] 

for term in terms: 

58 ↛ 59line 58 didn't jump to line 59, because the condition on line 58 was never true if isinstance(term, (list, tuple)): 

ret.extend(term) 

else: 

ret.append(term) 

return ret 

 

@staticmethod 

def _combine(a, b): 

results = [] 

for x in a: 

for y in b: 

results.append(LookupBase._flatten([x, y])) 

return results 

 

@staticmethod 

def _flatten_hash_to_list(terms): 

ret = [] 

for key in terms: 

ret.append({'key': key, 'value': terms[key]}) 

return ret 

 

@abstractmethod 

def run(self, terms, variables=None, **kwargs): 

""" 

When the playbook specifies a lookup, this method is run. The 

arguments to the lookup become the arguments to this method. One 

additional keyword argument named ``variables`` is added to the method 

call. It contains the variables available to ansible at the time the 

lookup is templated. For instance:: 

 

"{{ lookup('url', 'https://toshio.fedorapeople.org/one.txt', validate_certs=True) }}" 

 

would end up calling the lookup plugin named url's run method like this:: 

run(['https://toshio.fedorapeople.org/one.txt'], variables=available_variables, validate_certs=True) 

 

Lookup plugins can be used within playbooks for looping. When this 

happens, the first argument is a list containing the terms. Lookup 

plugins can also be called from within playbooks to return their 

values into a variable or parameter. If the user passes a string in 

this case, it is converted into a list. 

 

Errors encountered during execution should be returned by raising 

AnsibleError() with a message describing the error. 

 

Any strings returned by this method that could ever contain non-ascii 

must be converted into python's unicode type as the strings will be run 

through jinja2 which has this requirement. You can use:: 

 

from ansible.module_utils._text import to_text 

result_string = to_text(result_string) 

""" 

pass 

 

def find_file_in_search_path(self, myvars, subdir, needle, ignore_missing=False): 

''' 

Return a file (needle) in the task's expected search path. 

''' 

 

116 ↛ 119line 116 didn't jump to line 119, because the condition on line 116 was never false if 'ansible_search_path' in myvars: 

paths = myvars['ansible_search_path'] 

else: 

paths = [self.get_basedir(myvars)] 

 

result = None 

try: 

result = self._loader.path_dwim_relative_stack(paths, subdir, needle) 

except AnsibleFileNotFound: 

if not ignore_missing: 

self._display.warning("Unable to find '%s' in expected paths (use -vvvvv to see paths)" % needle) 

 

return result