2
0

Work around missing is mapping on CentOS/RHEL 6

Checks for 'dict' in `x.__class__.__name__` b/c
neither `type()` nor `isinstance()` is available.
This commit is contained in:
Florian Ermisch 2017-02-24 18:10:54 +01:00 committed by 0xf10e
parent 5327e921fe
commit e86e6fc221
4 changed files with 20 additions and 15 deletions

View File

@ -960,22 +960,19 @@ pillar_roots:
{% 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 #} {#- Workaround for missing `is mapping` on CentOS 6, see #193: #}
{%- do is_mapping.update({key: type(pillar[key]) == type({})}) %} {%- elif pillar[key] is iterable and 'dict' not in pillar[key].__class__.__name__ %}
{%- elif pillar[key] is iterable and not is_mapping[key] %}
- {{ 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 #} {#- Workaround for missing `is mapping` on CentOS 6, see #193: #}
{%- elif is_mapping[key] and pillar[key] is not string %} {%- 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]}}

View File

@ -12,7 +12,8 @@ lxc.container_profile:
{%- 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] }}
@ -29,7 +30,8 @@ lxc.network_profile:
{%- 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] }}

View File

@ -694,12 +694,14 @@ 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] }}
{%- 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]}}

View File

@ -2,21 +2,25 @@
# 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) %}