Checks for 'dict' in `x.__class__.__name__` b/c neither `type()` nor `isinstance()` is available.master
{% if 'ext_pillar' in cfg_master %} | {% if 'ext_pillar' in cfg_master %} | ||||
{%- do default_keys.append('ext_pillar') %} | {%- do default_keys.append('ext_pillar') %} | ||||
{#- workaround for missing mapping test in CentOS 6, part A #} | |||||
{%- set is_mapping = {} %} | |||||
ext_pillar: | ext_pillar: | ||||
{%- for pillar in cfg_master['ext_pillar'] -%} | {%- for pillar in cfg_master['ext_pillar'] -%} | ||||
{%- for key in pillar -%} | {%- for key in pillar -%} | ||||
{%- if pillar[key] is string %} | {%- if pillar[key] is string %} | ||||
- {{ key }}: {{ pillar[key] }} | - {{ key }}: {{ pillar[key] }} | ||||
{#- workaround for missing mapping test in CentOS 6, part B #} | |||||
{%- do is_mapping.update({key: type(pillar[key]) == type({})}) %} | |||||
{%- elif pillar[key] is iterable and not is_mapping[key] %} | |||||
{#- Workaround for missing `is mapping` on CentOS 6, see #193: #} | |||||
{%- elif pillar[key] is iterable and 'dict' not in pillar[key].__class__.__name__ %} | |||||
- {{ key }}: | - {{ key }}: | ||||
{%- for parameter in pillar[key] %} | {%- for parameter in pillar[key] %} | ||||
- {{ parameter }} | - {{ parameter }} | ||||
{%- endfor -%} | {%- endfor -%} | ||||
{#- workaround for missing mapping test in CentOS 6, part C #} | |||||
{%- elif is_mapping[key] and pillar[key] is not string %} | |||||
{#- Workaround for missing `is mapping` on CentOS 6, see #193: #} | |||||
{%- elif 'dict' in pillar[key].__class__.__name__ and pillar[key] is not string %} | |||||
- {{ key }}: | - {{ key }}: | ||||
{%- for parameter in pillar[key] %} | {%- for parameter in pillar[key] %} | ||||
{{ parameter }}: {{pillar[key][parameter]}} | {{ parameter }}: {{pillar[key][parameter]}} |
{%- for prof in cfg_prof %} | {%- for prof in cfg_prof %} | ||||
{{ prof }}: | {{ prof }}: | ||||
{%- for conf in cfg_prof[prof] %} | {%- for conf in cfg_prof[prof] %} | ||||
{%- if cfg_prof[prof][conf] is mapping %} | |||||
{#- Workaround for missing `is mapping` on CentOS 6, see #193 #} | |||||
{%- if 'dict' in cfg_prof[prof][conf].__class__.__name__ %} | |||||
{{ conf }}: | {{ conf }}: | ||||
{%- for opt in cfg_prof[prof][conf] %} | {%- for opt in cfg_prof[prof][conf] %} | ||||
{{ opt }}: {{ cfg_prof[prof][conf][opt] }} | {{ opt }}: {{ cfg_prof[prof][conf][opt] }} | ||||
{%- for prof in cfg_net %} | {%- for prof in cfg_net %} | ||||
{{ prof }}: | {{ prof }}: | ||||
{%- for conf in cfg_net[prof] -%} | {%- for conf in cfg_net[prof] -%} | ||||
{%- if cfg_net[prof][conf] is mapping %} | |||||
{#- Workaround for missing `is mapping` on CentOS 6, see #193 #} | |||||
{%- if 'dict' in cfg_net[prof][conf].__class__.__name__ %} | |||||
{{ conf }}: | {{ conf }}: | ||||
{%- for opt in cfg_net[prof][conf] %} | {%- for opt in cfg_net[prof][conf] %} | ||||
{{ opt }}: {{ cfg_net[prof][conf][opt] }} | {{ opt }}: {{ cfg_net[prof][conf][opt] }} |
{%- for key in pillar -%} | {%- for key in pillar -%} | ||||
{%- if pillar[key] is string %} | {%- if pillar[key] is string %} | ||||
- {{ key }}: {{ pillar[key] }} | - {{ key }}: {{ pillar[key] }} | ||||
{%- elif pillar[key] is iterable and pillar[key] is not mapping %} | |||||
{#- Workaround for missing `is mapping` on CentOS 6, see #193: #} | |||||
{%- elif pillar[key] is iterable and 'dict' not in pillar[key].__class__.__name__ %} | |||||
- {{ key }}: | - {{ key }}: | ||||
{%- for parameter in pillar[key] %} | {%- for parameter in pillar[key] %} | ||||
- {{ parameter }} | - {{ parameter }} | ||||
{%- endfor -%} | {%- endfor -%} | ||||
{%- elif pillar[key] is mapping and pillar[key] is not string %} | |||||
{#- Workaround for missing `is mapping` on CentOS 6, see #193: #} | |||||
{%- elif 'dict' in pillar[key].__class__.__name__ and pillar[key] is not string %} | |||||
- {{ key }}: | - {{ key }}: | ||||
{%- for parameter in pillar[key] %} | {%- for parameter in pillar[key] %} | ||||
{{ parameter }}: {{pillar[key][parameter]}} | {{ parameter }}: {{pillar[key][parameter]}} |
# vim: ft=jinja | # vim: ft=jinja | ||||
{%- macro deep_merge(a, b) %} | {%- macro deep_merge(a, b) %} | ||||
{#- This whole `'dict' in x.__class__.__name__` mess is a | |||||
workaround for the missing mapping test in CentOS 6's | |||||
ancient Jinja2, see #193 #} | |||||
{%- for k,v in b.iteritems() %} | {%- for k,v in b.iteritems() %} | ||||
{%- if v is string or v is number %} | {%- if v is string or v is number %} | ||||
{%- do a.update({ k: v }) %} | {%- do a.update({ k: v }) %} | ||||
{%- elif v is not mapping %} | |||||
{%- elif 'dict' not in v.__class__.__name__ %} | |||||
{%- if a[k] is not defined %} | {%- if a[k] is not defined %} | ||||
{%- do a.update({ k: v }) %} | {%- do a.update({ k: v }) %} | ||||
{%- elif a[k] is iterable and a[k] is not mapping and a[k] is not string %} | |||||
{%- elif a[k] is iterable and 'dict' not in a[k].__class__.__name__ and | |||||
a[k] is not string %} | |||||
{%- do a.update({ k: v|list + a[k]|list}) %} | {%- do a.update({ k: v|list + a[k]|list}) %} | ||||
{%- else %} | {%- else %} | ||||
{%- do a.update({ k: v }) %} | {%- do a.update({ k: v }) %} | ||||
{%- endif %} | {%- endif %} | ||||
{%- elif v is mapping %} | |||||
{%- elif 'dict' in v.__class__.__name__ %} | |||||
{%- if a[k] is not defined %} | {%- if a[k] is not defined %} | ||||
{%- do a.update({ k: v }) %} | {%- do a.update({ k: v }) %} | ||||
{%- elif a[k] is not mapping %} | |||||
{%- elif 'dict' in a[k].__class__.__name__ %} | |||||
{%- do a.update({ k: v }) %} | {%- do a.update({ k: v }) %} | ||||
{%- else %} | {%- else %} | ||||
{%- do deep_merge(a[k], v) %} | {%- do deep_merge(a[k], v) %} |