Feature: Cleanup unnecessary files from nodes/_generate folder

    Doc: Nodes definitions

Change-Id: I35bc2c1ea8fe4f9d30037932990fa3f271c0bb9c
diff --git a/README.rst b/README.rst
index aab9378..1b61ae1 100644
--- a/README.rst
+++ b/README.rst
@@ -114,6 +114,65 @@
 
     salt-call event.send 'reclass/minion/declassify'
 
+Nodes definitions generator
+===========================
+
+Generate nodes definitions by running:
+
+.. code-block:: bash
+
+    salt-call state.sls reclass.storage -l debug
+
+Remove unnecessary files from nodes/_generated:
+
+.. code-block:: yaml
+
+    reclass:
+      storage:
+        reclass_nodes_cleanup: true
+
+Static node definition:
+
+.. code-block:: yaml
+
+    reclass:
+      storage:
+        enabled: true
+        node:
+          openstack_benchmark_node01:
+            classes:
+            - cluster.example.openstack.benchmark
+            domain: example.com
+            name: bmk01
+            params:
+              linux_system_codename: xenial
+              salt_master_host: 192.168.0.253
+              single_address: 192.168.2.95
+
+Multiple nodes definitions (using generator):
+
+.. code-block:: yaml
+
+    reclass:
+      storage:
+        enabled: true
+        node:
+          openstack_compute_rack01:
+            classes:
+            - cluster.example.openstack.compute
+            domain: example.com
+            name: cmp<<count>>
+            params:
+              linux_system_codename: xenial
+              salt_master_host: 192.168.0.253
+            repeat:
+              start: 1
+              count: 50
+              digits: 3
+              params:
+                single_address:
+                  start: 101
+                  value: 192.168.2.<<count>>
 
 More Information
 ================
diff --git a/reclass/map.jinja b/reclass/map.jinja
index 9915c0c..efa41bc 100644
--- a/reclass/map.jinja
+++ b/reclass/map.jinja
@@ -13,6 +13,7 @@
             'engine': 'pkg'
         },
         'version': '1.4.1',
+        'reclass_nodes_cleanup': False,
     },
     'Debian': {
         'pkgs': ['reclass', 'python-reclass'],
diff --git a/reclass/storage/node.sls b/reclass/storage/node.sls
index e3ce328..3014b4a 100644
--- a/reclass/storage/node.sls
+++ b/reclass/storage/node.sls
@@ -1,6 +1,18 @@
 {%- from "reclass/map.jinja" import storage with context %}
 {%- if storage.enabled %}
 
+{%- if storage.reclass_nodes_cleanup %}
+{{ storage.base_dir }}/nodes/_generated_cleanup:
+  file.directory:
+    - name: {{ storage.base_dir }}/nodes/_generated
+    - user: root
+    - group: root
+    - dir_mode: 755
+    - file_mode: 644
+    - makedirs: True
+    - clean: True
+{%- endif %}
+
 {%- for node_name, node in storage.get('node', {}).iteritems() %}
 
 {%- if node.repeat is defined %}
@@ -29,6 +41,10 @@
       node: {{ node|yaml }}
       node_name: "{{ node_name }}"
       extra_params: {{ extra_params }}
+{%- if storage.reclass_nodes_cleanup %}
+  - require_in:
+    - file: {{ storage.base_dir }}/nodes/_generated_cleanup
+{%- endif %}
 
 {%- endfor %}
 
@@ -45,6 +61,10 @@
       node: {{ node|yaml }}
       node_name: "{{ node.get('name', node_name) }}"
       extra_params: {}
+{%- if storage.reclass_nodes_cleanup %}
+  - require_in:
+    - file: {{ storage.base_dir }}/nodes/_generated_cleanup
+{%- endif %}
 
 {%- endif %}
 
diff --git a/tests/pillar/generate_multi.sls b/tests/pillar/generate_multi.sls
index d25e2f6..628724e 100644
--- a/tests/pillar/generate_multi.sls
+++ b/tests/pillar/generate_multi.sls
@@ -1,6 +1,7 @@
 reclass:
   storage:
     enabled: true
+    reclass_nodes_cleanup: true
     repeat_replace_symbol: <<count>>
     node:
       service_node01: