-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstdlib.jinja
219 lines (171 loc) · 6.65 KB
/
stdlib.jinja
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
{##############################################################################
## resource_dep
##############################################################################}
{%- macro resource_dep(type, name) %}
{{- {'test': ('@' ~ type ~ '/' ~ name)}|yaml }}
{%- endmacro %}
{##############################################################################
## ensure_var
##############################################################################}
{%- macro ensure_var(name, var) %}
{%- if name is none %}
{{- salt['test.exception'](
'Required variable [{:s}] has not been set'.format(name)
) }}
{%- endif %}
{%- endmacro %}
{##############################################################################
## formula_name
##############################################################################}
{%- macro formula_name(tpldir) %}
{{- tpldir.split('/')[0] }}
{%- endmacro %}
{##############################################################################
## formula_sls
##############################################################################}
{%- macro formula_sls(tpldir) %}
{{- formula_name(tpldir) ~ '/init.sls' }}
{%- endmacro %}
{##############################################################################
## formula_macros
##############################################################################}
{%- macro formula_macros(tpldir) %}
{{- formula_name(tpldir) ~ '/macros.sls' }}
{%- endmacro %}
{##############################################################################
## formula_config
##############################################################################}
{%- macro formula_config(tpldir, ns) %}
{#- Retrieve formula name #}
{%- set _formula_name = formula_name(tpldir) %}
{#- Load formula defaults and maps #}
{%- import_yaml _formula_name ~ '/defaults.yaml' as _defaults %}
{%- import_yaml _formula_name ~ '/maps.yaml' as _maps %}
{#- Retrieve config dict for formula #}
{%- set _config = salt['config.get'](_formula_name, default={}) %}
{#- Generate map results by processing all maps #}
{%- set _map_results = {} %}
{%- for _map in (_maps or [])|reverse %}
{#- Ensure each entry represents a single dict key #}
{%- set _map_keys = _map.keys()|list %}
{%- if _map_keys|length != 1 %}
{{ salt['test.exception']('Expected single dict key in maps.yaml'
~ 'entry, got ' ~ _map_keys|length ~ ': ' ~ _map_keys) }}
{%- endif %}
{#- Use dict key as grain and value as map data #}
{%- set _map_grain = _map_keys[0] %}
{%- set _map_data = _map[_map_grain] %}
{#- Update defaults with given map using grains.filter_by #}
{%- do _map_results.update(salt['grains.filter_by'](
_map_data,
grain=_map_grain,
merge=_map_results
) or {}) %}
{%- endfor %}
{#- Merge map results over formula defaults #}
{%- set defaults = salt['defaults.merge'](
_defaults, _map_results
) %}
{#- Generate actual config by merging with processed defaults #}
{%- set config = salt['grains.filter_by'](
{'defaults': defaults},
default='defaults',
merge=_config,
) %}
{#- Update formula namespace #}
{%- do ns.update(config) %}
{%- endmacro %}
{##############################################################################
## formula_resource
##############################################################################}
{%- macro formula_resource(tpldir, type, name) %}
{#- Retrieve formula name and generate resource ID #}
{%- set _formula_name = formula_name(tpldir) %}
{%- set _formula_rid = '@' ~ type ~ '/' ~ name %}
{#- Persist resource declaration to support duplicate checks #}
{%- do opts.update({
'__resources__': opts.get('__resources__', []) + [_formula_rid]
}) %}
{#- Create dummy test state as resource declaration #}
{{ _formula_rid|yaml_dquote }}:
test.configurable_test_state:
- result: true
- changes: true
- comment: {{ ('Resource: type=[' ~ type ~ '] name=[' ~ name ~ '] formula='
~ _formula_name ~ ']')|yaml_dquote }}
{%- endmacro %}
{##############################################################################
## formula_resource_block
##############################################################################}
{%- macro formula_resource_block(tpldir, type, name) %}
{#- Generate resource ID #}
{%- set _formula_rid = '@' ~ type ~ '/' ~ name %}
{#- Skip block if resource is already defined #}
{%- if _formula_rid not in opts.get('__resources__', []) %}
{{ formula_resource(tpldir, type, name) }}
{{ caller() }}
{%- endif %}
{%- endmacro %}
{##############################################################################
## formula_tofs
##############################################################################}
{%- macro formula_tofs(tpldir,
source_files,
lookup=None,
default_files_switch=['id', 'os_family']) %}
{#- Retrieve TOFS configuration based on formula name #}
{%- set _tplroot = formula_name(tpldir) %}
{%- set _path_prefix = salt['config.get'](
_tplroot ~ ':tofs:path_prefix',
_tplroot
) %}
{%- set _files_dir = salt['config.get'](
_tplroot ~ ':tofs:dirs:files',
'files'
) %}
{%- set _files_switch_list = salt['config.get'](
_tplroot ~ ':tofs:files_switch',
default_files_switch
) %}
{#- Lookup source files or fallback to an empty list #}
{%- set _custom_source_files = salt['config.get'](
_tplroot ~ ':tofs:source_files:' ~ lookup,
[]
) %}
{#- Append default source_files to custom source files #}
{%- set _source_files = _custom_source_files + source_files %}
{#- Append None to the FSL, evaluated as 'default' below #}
{%- if '' not in _files_switch_list%}
{%- do _files_switch_list.append(none) %}
{%- endif %}
{#- Loop through files switch list to generate URLs #}
{%- set _file_urls = [] %}
{%- for _file_switch in _files_switch_list %}
{%- for _source_file in _source_files %}
{#- Evaluate file switch based on config #}
{%- if _file_switch is none %}
{%- set _file_dirs = salt['config.get'](
_tplroot ~ ':tofs:dirs:default', 'default'
) %}
{%- else %}
{%- set _file_dirs = salt['config.get'](_file_switch, _file_switch) %}
{%- endif %}
{#- Ensure _file_dirs is a list to support list-grains too #}
{%- if _file_dirs is string %}
{%- set _file_dirs = [_file_dirs] %}
{%- endif %}
{#- Generate and print source URL for each file dir #}
{%- for _file_dir in _file_dirs %}
{%- do _file_urls.append([
'salt:/',
_path_prefix.strip('/'),
_files_dir.strip('/'),
_file_dir.strip('/'),
_source_file.strip('/')
]|select|join('/')) %}
{%- endfor %}
{%- endfor %}
{%- endfor %}
{#- Output source URLs as YAML-formatted list #}
{{- _file_urls|yaml }}
{%- endmacro %}