Commit 4a6c4892 authored by Daniel Dehennin's avatar Daniel Dehennin
Browse files

feat(map.jinja): default values are incomplete

They must be set for the formula to work.
parent 929e86fd
# -*- coding: utf-8 -*-
# vim: ft=jinja
{#- Get the relevant values from the `opts` dict #}
{%- set opts_cli = opts.get('__cli', '') %}
{%- set opts_masteropts_cli = opts | traverse('__master_opts__:__cli', '') %}
{#- Determine the type of salt command being run #}
{%- if opts_cli == 'salt-minion' %}
{%- set cli = 'minion' %}
{%- elif opts_cli == 'salt-call' %}
{%- set cli = 'ssh' if opts_masteropts_cli == 'salt-ssh' else 'local' %}
{%- else %}
{%- set cli = 'unknown' %}
{%- endif %}
{%- do salt['log.debug']('[libsaltcli] the salt command type has been identified to be: ' ~ cli) %}
# -*- coding: utf-8 -*-
# vim: ft=jinja
{#- Get the `tplroot` from `tpldir` #}
{%- set tplroot = tpldir.split('/')[0] %}
{%- from tplroot ~ "/libsaltcli.jinja" import cli with context %}
{#- Where to lookup parameters source files #}
{%- set map_sources_dir = tplroot | path_join('parameters') %}
{#- Load defaults first to allow per formula default map.jinja configuration #}
{%- set _defaults_filename = map_sources_dir | path_join('defaults.yaml') %}
{%- do salt['log.debug']('map.jinja: initialise parameters from ' ~ _defaults_filename ) %}
{%- import_yaml _defaults_filename as default_settings %}
{#- List of sources to lookup for parameters #}
{%- do salt['log.debug']("map.jinja: lookup 'map_jinja' configuration sources") %}
{#- Fallback to previously used grains plus minion `id` #}
{%- set map_sources = ['osarch', 'os_family', 'os', 'osfinger', 'config_get_lookup', 'config_get', 'id'] %}
{#- Configure map.jinja from defaults.yaml #}
{%- set map_sources = default_settings | traverse('values:map_jinja:sources', map_sources) %}
{#- Lookup global sources #}
{%- set map_sources = salt['config.get']('map_jinja:sources', map_sources) %}
{#- Lookup per formula sources #}
{%- set map_sources = salt['config.get'](tplroot ~ ':map_jinja:sources', map_sources) %}
{%- do salt['log.debug']('map.jinja: load parameters with sources from ' ~ map_sources) %}
{#- 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)
} %}
{#- the `config.get` merge option only works for `minion` or `local` salt command types #}
{%- if cli in ['minion', 'local'] %}
{%- do _config.update({'merge_opt': {'merge': _config['merge_strategy']},
'merge_msg': ", merge: strategy='" ~ _config['merge_strategy'] ~ "'"}) %}
{#- the `config.get` merge option is not available for `ssh` or `unknown` salt command types #}
{%- else %}
{%- if _config['merge_strategy'] %}
{%- do salt['log.error']("map.jinja: the 'merge' option of 'config.get' is skipped when the salt command type is '" ~ cli ~ "'") %}
{%- endif %}
{%- do _config.update({'merge_opt': {},
'merge_msg': ''}) %}
{%- endif %}
{#- process each `map.jinja` source #}
{%- for map_source in map_sources %}
{%- if map_source in ['config_get', 'config_get_lookup'] %}
{%- set _config_key = {'config_get': tplroot,
'config_get_lookup': tplroot ~ ':lookup'}.get(map_source) %}
{%- set _config_type = {'config_get': 'configuration',
'config_get_lookup': 'lookup'}.get(map_source) %}
{%- do salt['log.debug']("map.jinja: retrieve formula " ~ _config_type
~ " with 'config.get'"
~ _config['merge_msg']
) %}
{%- set _config_get = salt['config.get'](_config_key, default={}, **_config['merge_opt']) %}
{#- `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 formula " ~ _config_type
~ " retrieved with 'config.get'"
~ ", merge: strategy='" ~ _strategy
~ "', lists='" ~ _config['merge_lists'] ~ "'"
) %}
{%- do _config.update({'stack': salt['slsutil.merge'](_config['stack'],
_config_get,
strategy=_strategy,
merge_lists=_config['merge_lists'])})
%}
{%- else %}
{#- Lookup the grain/pillar/... #}
{#- Fallback to use the source name as a direct filename #}
{%- set map_values = salt['config.get'](map_source, []) %}
{#- Mangle `map_source` to use it as literal path #}
{%- if map_values|length == 0 %}
{%- set map_source_parts = map_source.split('/') %}
{%- set map_source = map_source_parts[0:-1] | join('/') %}
{%- set map_values = map_source_parts[-1].rstrip('.yaml') %}
{%- endif %}
{#- Some configuration return list #}
{%- if map_values is string %}
{%- set map_values = [map_values] %}
{%- endif %}
{%- for map_value in map_values %}
{%- set yamlfile = map_sources_dir | path_join(map_source, map_value ~ '.yaml') %}
{%- 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 'discourse'") %}
{%- set discourse = _config['stack'] %}
# -*- coding: utf-8 -*-
# vim: ft=yaml
---
values:
docker-git-url: 'https://github.com/discourse/discourse_docker.git'
directory: '/srv/discourse'
# Those values must be set or the deployment will fail
# hostname: 'forum.example.net'
# developer_emails: 'me@example.net'
# smtp:
# address: 'smtp.example.net'
# port: '25'
# user_name: 'me@example.net'
# start_tls: true
# # the following must be set in pillar
# # smtp_password: ~
# letsencrypt:
# enabled: true
# account_email: 'me@example.net'
launcher:
rebuild_cmd: './launcher rebuild app'
bootstrap_cmd: './launcher bootstrap app'
start_cmd: './launcher start app'
stop_cmd: './launcher stop app'
restart_cmd: './launcher restart app'
cleanup_cmd: './launcher cleanup app'
destroy_cmd: './launcher destroy app'
...
# -*- coding: utf-8 -*-
# vim: ft=yaml
---
discourse:
hostname: 'forum.example.net'
developer_emails: 'me@example.net'
smtp:
address: 'smtp.example.net'
port: '25'
user_name: 'me@example.net'
start_tls: true
# the following must be set in pillar
# smtp_password: ~
letsencrypt:
enabled: true
account_email: 'me@example.net'
tofs:
# The files_switch key serves as a selector for alternative
# directories under the formula files directory. See TOFS pattern
# doc for more info.
# Note: Any value not evaluated by `config.get` will be used literally.
# This can be used to set custom paths, as many levels deep as required.
files_switch:
- any/path/can/be/used/here
- id
- roles
- osfinger
- os
- os_family
# All aspects of path/file resolution are customisable using the options below.
# This is unnecessary in most cases; there are sensible defaults.
# Default path: salt://< path_prefix >/< dirs.files >/< dirs.default >
# I.e.: salt://template/files/default
# path_prefix: template_alt
# dirs:
# files: files_alt
# default: default_alt
# The entries under `source_files` are prepended to the default source files
# given for the state
source_files:
...
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment