Merge "Use forward dependency for ca_file instead of reverse one"
diff --git a/salt/map.jinja b/salt/map.jinja
index 3ed0070..8693250 100644
--- a/salt/map.jinja
+++ b/salt/map.jinja
@@ -89,11 +89,15 @@
 Arch:
   pkgs:
   - salt-zmq
+  grains_validity_pkgs:
+    - python-yaml
 Debian:
   pkgs:
   - salt-minion
   - python-m2crypto
   - python-psutil
+  grains_validity_pkgs:
+    - python-yaml
 Gentoo:
   pkgs:
   - app-admin/salt
@@ -105,6 +109,8 @@
   - salt-minion
   - python-m2ext
   - python-psutil
+  grains_validity_pkgs:
+    - PyYaml
 {%- endload %}
 
 {%- if pillar.salt.minion is defined %}
diff --git a/salt/minion/grains.sls b/salt/minion/grains.sls
index 86e9987..dab3585 100644
--- a/salt/minion/grains.sls
+++ b/salt/minion/grains.sls
@@ -22,23 +22,48 @@
   - require:
     - file: salt_minion_grains_dir
 
-{%- set new_grains = salt['cmd.run']('cat /etc/salt/grains.d/*') %}
-{%- set old_grains = salt['cmd.run']('cat /etc/salt/grains') %}
+salt_minion_grains_pkg_validity_check:
+  pkg.installed:
+  - pkgs: {{ minion.grains_validity_pkgs }}
 
-{%- if new_grains != old_grains %}
+{%- for service_name, service in pillar.items() %}
+  {%- set support_fragment_file = service_name+'/meta/salt.yml' %}
+  {%- macro load_support_file() %}{% include support_fragment_file ignore missing %}{% endmacro %}
+  {%- set support_yaml = load_support_file()|load_yaml %}
+
+  {%- if support_yaml %}
+    {%- for name, grain in support_yaml.get('grain', {}).iteritems() %}
+salt_minion_grain_{{ service_name }}_{{ name }}:
+  file.managed:
+    - name: /etc/salt/grains.d/{{ name }}
+    - contents: |
+        {{ grain|yaml(False)|indent(8) }}
+    - require:
+      - file: salt_minion_grains_dir
+
+salt_minion_grain_{{ service_name }}_{{ name }}_validity_check:
+  cmd.wait:
+    - name: python -c "import yaml; stream = file('/etc/salt/grains.d/{{ name }}', 'r'); yaml.load(stream); stream.close()"
+    - require:
+      - pkg: salt_minion_grains_pkg_validity_check
+    - watch:
+      - file: salt_minion_grain_{{ service_name }}_{{ name }}
+    - watch_in:
+      - cmd: salt_minion_grains_file
+    {%- endfor %}
+  {%- endif %}
+{%- endfor %}
 
 salt_minion_grains_file:
-  cmd.run:
+  cmd.wait:
   - name: cat /etc/salt/grains.d/* > /etc/salt/grains
   - require:
     - file: salt_minion_grains_files
 
 salt_minion_grains_publish:
-  module.run:
+  module.wait:
   - name: mine.update
-  - require:
+  - watch:
     - cmd: salt_minion_grains_file
 
 {%- endif %}
-
-{%- endif %}
diff --git a/salt/minion/proxy.sls b/salt/minion/proxy.sls
index 00ec07c..299b9fa 100644
--- a/salt/minion/proxy.sls
+++ b/salt/minion/proxy.sls
@@ -2,7 +2,7 @@
 
 {%- set napalm = false %}
 
-{%- for proxy_name, proxy_device in proxy.device.iteritems() %}
+{%- for proxy_name, proxy_device in proxy.get('device', {}).iteritems() %}
 
 {%- if proxy_device.engine == 'napalm' %}
 
@@ -39,7 +39,7 @@
 
 {%- endif %}
 
-{%- for proxy_name, proxy_device in proxy.device.iteritems() %}
+{%- for proxy_name, proxy_device in proxy.get('device', {}).iteritems() %}
 
 salt_proxy_{{ proxy_name }}_service:
   service.running:
diff --git a/tests/pillar/minion_proxy.sls b/tests/pillar/minion_proxy.sls
index 6363f90..1fe1205 100644
--- a/tests/pillar/minion_proxy.sls
+++ b/tests/pillar/minion_proxy.sls
@@ -1,6 +1,6 @@
 salt:
   minion:
-    enabled:true
+    enabled: true
     proxy:
       master: localhost
       device: