|
- {#- -*- coding: utf-8 -*- #}
- {#- vim: ft=jinja #}
-
- {#- Get the `tplroot` from `tpldir` #}
- {%- set tplroot = tpldir.split("/")[0] %}
-
- {%- macro mapstack(
- files,
- defaults=None,
- log_prefix="libmapstack: "
- ) %}
- {#-
- Load YAML files in the order of `files` and merge successively the
- values with `defaults` if the file exists.
-
- Parameters:
- - `files`: list of files to load
-
- - `defaults`: default values to start the merging, they are
- considered built-ins
-
- - `log_prefix`: prefix used in the log outputs, by default it is
- `libmapstack: `
-
- Each YAML file must conform to the following layout:
- - a mandatory `values` key to store the configuration values
-
- - two optional keys to configure the use of `salt.slsutil.merge`
-
- - an optional `strategy` key to configure the merging strategy,
- for example `strategy: 'recurse'`, the default is `smart`
-
- - an optional `merge_lists` key to configure if lists should be
- merged or overridden for the `recurse` and `overwrite`
- strategies, for example `merge_lists: 'true'`
- #}
- {%- set stack = defaults | default({"values": {} }, boolean=True) %}
-
- {%- do salt["log.debug"](
- log_prefix
- ~ "built-in configuration:\n"
- ~ {"values": defaults | traverse("values")}
- | yaml(False)
- ) %}
-
- {%- for yaml_filename in files %}
- {%- do salt["log.debug"](
- log_prefix
- ~ "load configuration values from "
- ~ yaml_filename
- ) %}
-
- {%- load_yaml as yaml_values %}
- {%- include yaml_filename ignore missing %}
- {%- endload %}
-
- {%- do salt["log.debug"](
- log_prefix
- ~ "loaded configuration values from "
- ~ yaml_filename
- ~ ":\n"
- ~ yaml_values
- | yaml(False)
- ) %}
-
- {%- if yaml_values %}
- {#- Per YAML file `salt["slsutil.merge"]` options or use defaults #}
- {%- set _strategy = yaml_values
- | traverse(
- "strategy",
- defaults
- | traverse(
- "strategy",
- "smart"
- )
- ) %}
- {%- set _merge_lists = yaml_values
- | traverse(
- "merge_lists",
- defaults
- | traverse(
- "merge_lists",
- False
- )
- )
- | to_bool %}
-
- {#- Update only the `values`, the `salt["slsutil.merge"]` options are never updated #}
- {%- do stack.update(
- {
- "values": salt["slsutil.merge"](
- stack["values"],
- yaml_values
- | traverse("values", {}),
- strategy=_strategy,
- merge_lists=_merge_lists,
- )
- }
- ) %}
- {%- do salt["log.debug"](
- log_prefix
- ~ "merged configuration values from "
- ~ yaml_filename
- ~ ", merge: strategy='"
- ~ _strategy
- ~ "', merge_lists='"
- ~ _merge_lists
- ~ "':\n"
- ~ {"values": stack["values"]}
- | yaml(False)
- ) %}
- {%- endif %}
-
- {%- endfor %}
-
- {%- do salt["log.debug"](
- log_prefix
- ~ "final configuration values:\n"
- ~ {"values": stack["values"]}
- | yaml(False)
- ) %}
-
- {#- Output stack as YAML, caller should use with something like #}
- {#- `{%- set config = flexible_config(prefix="foo") | load_yaml %}` #}
- {{ stack | yaml }}
-
- {%- endmacro %}
|