Add support for jinja2 renderer options. (2018.2)

Change-Id: Idf6c18597a222e6c1b60bf940eadb1d6d8a611c7
diff --git a/.kitchen.yml b/.kitchen.yml
index 888f83f..75a6540 100644
--- a/.kitchen.yml
+++ b/.kitchen.yml
@@ -17,8 +17,8 @@
     noservices: true
   vendor_repo:
     - type: apt
-      url: http://apt-mk.mirantis.com/xenial
-      key_url: http://apt-mk.mirantis.com/public.gpg
+      url: http://apt.mirantis.com/xenial
+      key_url: http://apt.mirantis.com/public.gpg
       components: salt
       distribution: testing
   state_top:
diff --git a/.travis.yml b/.travis.yml
index cdba2b5..315c896 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -13,7 +13,7 @@
     gem 'kitchen-docker'
     gem 'kitchen-inspec'
     gem 'inspec'
-    gem 'kitchen-salt', :git => 'https://github.com/salt-formulas/kitchen-salt.git'
+    gem 'kitchen-salt' #, :git => 'https://github.com/salt-formulas/kitchen-salt.git'
   - bundle install
 
 env:
diff --git a/README.rst b/README.rst
index cd9abc6..684a871 100644
--- a/README.rst
+++ b/README.rst
@@ -340,7 +340,60 @@
     salt-call event.send 'salt/key/remove'
 
 
-Encrypted Pillars
+Jinja options
+-------------
+
+Use following options to update default jinja renderer options. Salt recognize Jinja options for templates and for sls files.
+
+For full list of options check jinja documentation: http://jinja.pocoo.org/docs/api/#high-level-api.
+
+.. code-block:: yaml
+
+
+  salt:
+    renderer:
+      # for templates
+      jinja: &jina_env
+        # Default Jinja environment options
+        block_start_string: '{%'
+        block_end_string: '%}'
+        variable_start_string: '{{'
+        variable_end_string: '}}'
+        comment_start_string: '{#'
+        comment_end_string: '#}'
+        keep_trailing_newline: False
+        newline_sequence: '\n'
+
+        # Next two are enabled by default in Salt
+        trim_blocks: True
+        lstrip_blocks: True
+
+        # Next two are not enabled by default in Salt
+        # but worth to consider to enable in future for salt-formulas
+        line_statement_prefix: '%'
+        line_comment_prefix: '##'
+
+      # for .sls state files
+      jinja_sls: *jinja_env
+
+
+
+With the line_statement/comment* _prefix options enabled following code statements are valid:
+
+.. code-block:: yaml
+   %- set myvar = 'one'
+
+   ## You can mix even with '{%'
+   {%- set myvar = 'two' %} ## comment
+   %- set mylist = ['one', 'two', 'three'] ## comment
+
+   ## comment
+   %- for item in mylist:  ## comment
+   {{- item }}
+   %- endfor
+
+
+Encrypted pillars
 ~~~~~~~~~~~~~~~~~
 
 Note: NACL + below configuration will be available in Salt > 2017.7.
diff --git a/salt/files/_renderer.conf b/salt/files/_renderer.conf
new file mode 100644
index 0000000..3c864f3
--- /dev/null
+++ b/salt/files/_renderer.conf
@@ -0,0 +1,23 @@
+{%- from "salt/map.jinja" import renderer with context %}
+
+{%- if renderer.get('jinja_sls', {}) | length > 0 %}
+
+jinja_sls_env:
+{% for key, value in renderer.jinja_sls.iteritems() %}
+  {{ key }}: "{{ value }}"
+{%- endfor %}
+
+{%- endif %}
+
+{%- if renderer.get('jinja', {}) | length > 0 %}
+
+jinja_env:
+{% for key, value in renderer.jinja.iteritems() %}
+  {{ key }}: "{{ value }}"
+{%- endfor %}
+
+{%- endif %}
+
+{#-
+vim: syntax=jinja
+-#}
diff --git a/salt/map.jinja b/salt/map.jinja
index 68a7cf2..38906bb 100644
--- a/salt/map.jinja
+++ b/salt/map.jinja
@@ -201,6 +201,12 @@
   - pkg-config
 {%- endload %}
 
+{%- load_yaml as renderer_defaults %}
+default:
+  renderer: {}
+{%- endload %}
+{%- set renderer = salt['grains.filter_by'](renderer_defaults, merge=salt['pillar.get']('salt:renderer')) %}
+
 {%- if pillar.salt.control is defined %}
 {%- set raw_control = salt['grains.filter_by'](control_specific, merge=salt['pillar.get']('salt:control')) %}
 {%- set control = salt['grains.filter_by'](control_common, merge=raw_control) %}
diff --git a/salt/master/service.sls b/salt/master/service.sls
index 0c0ce8c..4e1f502 100644
--- a/salt/master/service.sls
+++ b/salt/master/service.sls
@@ -1,4 +1,4 @@
-{%- from "salt/map.jinja" import master with context %}
+{%- from "salt/map.jinja" import master, renderer with context %}
 {%- if master.enabled %}
 
 {%- if master.source.get('engine', 'pkg') == 'pkg' %}
@@ -70,6 +70,20 @@
 
 {%- endif %}
 
+{%- if renderer | length > 0 %}
+
+/etc/salt/master.d/_renderer.conf:
+  file.managed:
+  - source: salt://salt/files/_renderer.conf
+  - user: root
+  - template: jinja
+  - require:
+    - {{ master.install_state }}
+  - watch_in:
+    - service: salt_master_service
+
+{%- endif %}
+
 salt_master_service:
   service.running:
   - name: {{ master.service }}
diff --git a/salt/minion/service.sls b/salt/minion/service.sls
index 2d03c62..6dbe75a 100644
--- a/salt/minion/service.sls
+++ b/salt/minion/service.sls
@@ -1,4 +1,4 @@
-{%- from "salt/map.jinja" import minion with context %}
+{%- from "salt/map.jinja" import minion,renderer with context %}
 {%- if minion.enabled %}
 
 {%- if minion.source.get('engine', 'pkg') == 'pkg' %}
@@ -92,6 +92,22 @@
     {%- endif %}
 {%- endfor %}
 
+
+{%- if renderer | length > 0 %}
+
+/etc/salt/minion.d/_renderer.conf:
+  file.managed:
+  - source: salt://salt/files/_renderer.conf
+  - user: root
+  - template: jinja
+  - require:
+    - {{ minion.install_state }}
+  - watch_in:
+    - service: salt_minion_service
+
+{%- endif %}
+
+
 salt_minion_service:
   service.running:
     - name: {{ minion.service }}
diff --git a/tests/pillar/master_formulas.sls b/tests/pillar/master_formulas.sls
index 92e270a..0209bb4 100644
--- a/tests/pillar/master_formulas.sls
+++ b/tests/pillar/master_formulas.sls
@@ -49,3 +49,30 @@
             source: git
             address: 'https://github.com/salt-formulas/salt-formula-bind.git'
             revision: master
+  renderer:
+    jinja:
+      block_start_string: {{ '"{%"' }}
+      block_end_string: {{ '"%}"' }}
+      variable_start_string: {{ '"{{"' }}
+      variable_end_string: {{ '"}}"' }}
+      comment_start_string: {{ '"{#"' }}
+      comment_end_string: {{ '"#}"' }}
+      keep_trailing_newline: False
+      newline_sequence: '\n'
+      trim_blocks: True
+      lstrip_blocks: True
+      line_statement_prefix: "%"
+      line_comment_prefix: "##"
+    jinja_sls:
+      block_start_string: {{ '"{%"' }}
+      block_end_string: {{ '"%}"' }}
+      variable_start_string: {{ '"{{"' }}
+      variable_end_string: {{ '"}}"' }}
+      comment_start_string: {{ '"{#"' }}
+      comment_end_string: {{ '"#}"' }}
+      keep_trailing_newline: False
+      newline_sequence: '\n'
+      trim_blocks: True
+      lstrip_blocks: True
+      line_statement_prefix: "%"
+      line_comment_prefix: "##"