2019-02-12 14:22:14 +01:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
# vim: ft=jinja
|
|
|
|
|
2020-07-31 10:54:40 +02:00
|
|
|
{#- Get the `tplroot` from `tpldir` #}
|
|
|
|
{%- set tplroot = tpldir.split("/")[0] %}
|
2021-01-11 17:41:20 +01:00
|
|
|
{%- from tplroot ~ "/libmatchers.jinja" import parse_matchers, query_map %}
|
2021-01-11 17:47:50 +01:00
|
|
|
{%- from tplroot ~ "/libmapstack.jinja" import mapstack %}
|
2020-07-31 10:54:40 +02:00
|
|
|
|
|
|
|
{#- Where to lookup parameters source files #}
|
2020-08-21 16:00:56 +02:00
|
|
|
{%- set map_sources_dir = tplroot ~ "/parameters" %}
|
2020-07-31 10:54:40 +02:00
|
|
|
|
|
|
|
{#- List of sources to lookup for parameters #}
|
|
|
|
{#- Fallback to previously used grains plus minion `id` #}
|
|
|
|
{%- set map_sources = [
|
2021-01-11 17:31:22 +01:00
|
|
|
"Y:G@osarch",
|
|
|
|
"Y:G@os_family",
|
|
|
|
"Y:G@os",
|
|
|
|
"Y:G@osfinger",
|
|
|
|
"C@" ~ tplroot ~ ":lookup",
|
|
|
|
"C@" ~ tplroot,
|
|
|
|
"Y:G@id",
|
2020-07-31 10:54:40 +02:00
|
|
|
] %}
|
|
|
|
|
2021-01-11 17:31:22 +01:00
|
|
|
{#- Allow centralised map.jinja configuration #}
|
2021-01-11 17:47:50 +01:00
|
|
|
{%- set _global_param_filename = "parameters/map_jinja.yaml" %}
|
2021-01-11 17:31:22 +01:00
|
|
|
{#- Allow per formula map.jinja configuration #}
|
2021-01-11 17:47:50 +01:00
|
|
|
{%- set _formula_param_filename = map_sources_dir ~ "/map_jinja.yaml" %}
|
2021-01-11 17:31:22 +01:00
|
|
|
|
2021-01-11 17:47:50 +01:00
|
|
|
{%- set _map_settings = mapstack(
|
|
|
|
files=[_global_param_filename, _formula_param_filename],
|
|
|
|
defaults={
|
|
|
|
"values": {"sources": map_sources}
|
|
|
|
},
|
|
|
|
log_prefix="map.jinja configuration: ",
|
|
|
|
)
|
|
|
|
| load_yaml %}
|
2020-07-31 10:54:40 +02:00
|
|
|
|
2021-01-11 17:47:50 +01:00
|
|
|
{%- set map_sources = _map_settings | traverse("values:sources") %}
|
2020-07-31 12:59:33 +02:00
|
|
|
{%- do salt["log.debug"](
|
2021-01-11 17:31:22 +01:00
|
|
|
"map.jinja: load parameters from sources:\n"
|
|
|
|
~ map_sources
|
|
|
|
| yaml(False)
|
2020-07-31 12:59:33 +02:00
|
|
|
) %}
|
2021-01-11 17:31:22 +01:00
|
|
|
|
|
|
|
{#- Load formula defaults values #}
|
|
|
|
{%- set _defaults_filename = map_sources_dir ~ "/defaults.yaml" %}
|
2021-01-11 17:57:30 +01:00
|
|
|
{%- set default_settings = mapstack(
|
|
|
|
files=[_defaults_filename],
|
|
|
|
defaults={"values": {} },
|
|
|
|
log_prefix="map.jinja defaults: ",
|
|
|
|
)
|
|
|
|
| load_yaml %}
|
2021-01-11 17:31:22 +01:00
|
|
|
{#- Make sure to track `map.jinja` configuration with `_mapdata` #}
|
|
|
|
{%- do default_settings["values"].update(
|
|
|
|
{
|
2021-01-11 17:47:50 +01:00
|
|
|
"map_jinja": _map_settings["values"]
|
2021-01-11 17:31:22 +01:00
|
|
|
}
|
2020-07-31 12:59:33 +02:00
|
|
|
) %}
|
2020-07-31 10:54:40 +02:00
|
|
|
|
|
|
|
{#- Work around assignment inside for loop #}
|
|
|
|
{#- load configuration values used in `config.get` merging strategies #}
|
|
|
|
{%- set _config = {
|
|
|
|
"stack": default_settings.get("values", {}),
|
|
|
|
"merge_strategy": salt["config.get"](tplroot ~ ":strategy", None),
|
|
|
|
"merge_lists": salt["config.get"](tplroot ~ ":merge_lists", False),
|
|
|
|
} %}
|
|
|
|
|
2021-01-11 17:41:20 +01:00
|
|
|
{#- `parse_matchers` returns a `list` of `dict` with #}
|
|
|
|
{#- - type: `F` to load file, `C`, `G`, `I` for lookup #}
|
|
|
|
{#- - option: specific to the type #}
|
|
|
|
{#- - query: which key is requested #}
|
2021-01-11 17:47:11 +01:00
|
|
|
{#- - query_delimiter: the separator between query component #}
|
2021-01-11 17:41:20 +01:00
|
|
|
{#- - query_method: the salt method doing the query `config.get`, `pillar.get` and `grains.get` #}
|
|
|
|
{#- - value: the result of the `salt[<query_method>](<query>)` #}
|
|
|
|
{%- set map_matchers = parse_matchers(
|
|
|
|
matchers=map_sources,
|
|
|
|
config_get_strategy=_config["merge_strategy"],
|
|
|
|
log_prefix="map.jinja: "
|
|
|
|
)
|
|
|
|
| load_yaml %}
|
|
|
|
|
|
|
|
{%- for matcher in map_matchers %}
|
|
|
|
|
|
|
|
{%- if matcher.type in query_map.keys() %}
|
|
|
|
{#- Merge in `mapdata.<query>` instead of directcly in `mapdata` #}
|
|
|
|
{%- set is_sub_key = matcher.option | default(False) == "SUB" %}
|
2021-01-11 17:31:22 +01:00
|
|
|
|
|
|
|
{#- `slsutil.merge` defaults to `smart` instead of `None` for `config.get` #}
|
|
|
|
{%- set _strategy = _config["merge_strategy"] | default("smart", boolean=True) %}
|
|
|
|
{%- do salt["log.debug"](
|
|
|
|
"map.jinja: merge "
|
|
|
|
~ "sub key " * is_sub_key
|
|
|
|
~ "'"
|
2021-01-11 17:41:20 +01:00
|
|
|
~ matcher.query
|
2021-01-11 17:31:22 +01:00
|
|
|
~ "' retrieved with '"
|
2021-01-11 17:41:20 +01:00
|
|
|
~ matcher.query_method
|
2021-01-11 17:31:22 +01:00
|
|
|
~ "', merge: strategy='"
|
|
|
|
~ _strategy
|
|
|
|
~ "', lists='"
|
|
|
|
~ _config["merge_lists"]
|
|
|
|
~ "'"
|
|
|
|
) %}
|
|
|
|
|
2021-01-11 17:41:20 +01:00
|
|
|
{#- empty value is an empty list, it must be an empty dict for `.update` #}
|
|
|
|
{%- set value = matcher.value | default({}, boolean=True) %}
|
2021-01-11 17:31:22 +01:00
|
|
|
{%- if is_sub_key %}
|
|
|
|
{#- Merge values with `mapdata.<key>`, `<key>` and `<key>:lookup` are merged together #}
|
2021-01-11 17:41:20 +01:00
|
|
|
{%- set value = { matcher.query | regex_replace("(:lookup)?$", ""): value } %}
|
2021-01-11 17:31:22 +01:00
|
|
|
{%- endif %}
|
|
|
|
{%- do _config.update(
|
|
|
|
{
|
|
|
|
"stack": salt["slsutil.merge"](
|
|
|
|
_config["stack"],
|
2021-01-11 17:41:20 +01:00
|
|
|
value,
|
2021-01-11 17:31:22 +01:00
|
|
|
strategy=_strategy,
|
|
|
|
merge_lists=_config["merge_lists"],
|
|
|
|
)
|
|
|
|
}
|
|
|
|
) %}
|
2020-07-31 10:54:40 +02:00
|
|
|
{%- else %}
|
2021-01-11 17:31:22 +01:00
|
|
|
{#- Load YAML file matching the grain/pillar/... #}
|
2020-07-31 10:54:40 +02:00
|
|
|
{#- Fallback to use the source name as a direct filename #}
|
2021-01-11 17:31:22 +01:00
|
|
|
{#- Mangle `source_key` to use it as literal path #}
|
2021-01-11 17:41:20 +01:00
|
|
|
{%- if matcher.value | length == 0 %}
|
|
|
|
{%- set query_parts = matcher.query.split("/") %}
|
|
|
|
{%- set map_dirname = query_parts[0:-1] | join("/") %}
|
|
|
|
{%- set map_values = query_parts[-1] | regex_replace("(\.yaml)?$", ".yaml") %}
|
|
|
|
{%- else %}
|
|
|
|
{%- set map_dirname = matcher.query %}
|
|
|
|
{%- set map_values = matcher.value %}
|
2020-07-31 10:54:40 +02:00
|
|
|
{%- endif %}
|
|
|
|
|
|
|
|
{#- Some configuration return list #}
|
|
|
|
{%- if map_values is string %}
|
|
|
|
{%- set map_values = [map_values] %}
|
|
|
|
{%- endif %}
|
|
|
|
|
2021-01-11 17:41:20 +01:00
|
|
|
{#- `map_dirname` can be an empty string with literal path like `myconf.yaml` #}
|
2021-01-11 17:31:22 +01:00
|
|
|
{%- set yaml_dir = [
|
|
|
|
map_sources_dir,
|
2021-01-11 17:41:20 +01:00
|
|
|
map_dirname
|
2021-01-11 17:31:22 +01:00
|
|
|
]
|
|
|
|
| select
|
|
|
|
| join("/") %}
|
|
|
|
|
2020-07-31 10:54:40 +02:00
|
|
|
{%- for map_value in map_values %}
|
2020-08-21 16:00:56 +02:00
|
|
|
{%- set yamlfile = [
|
2021-01-11 17:31:22 +01:00
|
|
|
yaml_dir,
|
|
|
|
map_value ~ ".yaml"
|
2020-08-21 16:00:56 +02:00
|
|
|
]
|
2021-01-11 17:31:22 +01:00
|
|
|
| join("/") %}
|
2020-07-31 10:54:40 +02:00
|
|
|
{%- do salt["log.debug"]("map.jinja: load parameters from file " ~ yamlfile) %}
|
|
|
|
{%- load_yaml as loaded_values %}
|
|
|
|
{%- include yamlfile ignore missing %}
|
|
|
|
{%- endload %}
|
|
|
|
|
|
|
|
{%- if loaded_values %}
|
|
|
|
{#- Merge loaded values on the stack #}
|
|
|
|
{%- do salt["log.debug"]("map.jinja: merge parameters from " ~ yamlfile) %}
|
|
|
|
{%- do _config.update(
|
|
|
|
{
|
|
|
|
"stack": salt["slsutil.merge"](
|
|
|
|
_config["stack"],
|
|
|
|
loaded_values.get("values", {}),
|
|
|
|
strategy=loaded_values.get("strategy", "smart"),
|
|
|
|
merge_lists=loaded_values.get("merge_lists", False)
|
|
|
|
| to_bool,
|
|
|
|
)
|
|
|
|
}
|
|
|
|
) %}
|
|
|
|
{%- endif %}
|
|
|
|
{%- endfor %}
|
|
|
|
{%- endif %}
|
|
|
|
{%- endfor %}
|
|
|
|
|
|
|
|
{%- do salt["log.debug"]("map.jinja: save parameters in variable 'mapdata'") %}
|
|
|
|
{%- set mapdata = _config["stack"] %}
|