Reclass _states - node_present state
diff --git a/_modules/reclass.py b/_modules/reclass.py
index 34ea4b9..10fcdc3 100644
--- a/_modules/reclass.py
+++ b/_modules/reclass.py
@@ -38,6 +38,45 @@
     return os.path.join(defaults.get('inventory_base_uri'), 'classes')
 
 
+def _get_node_meta(name, cluster="default", environment="prd", classes=None, parameters=None):
+    host_name = name.split('.')[0]
+    domain_name = '.'.join(name.split('.')[1:])
+
+    if classes == None:
+        meta_classes = []
+    else:
+        if isinstance(classes, six.string_types):
+            meta_classes = json.loads(classes)
+        else:
+            meta_classes = classes
+
+    if parameters == None:
+        meta_parameters = {}
+    else:
+        if isinstance(parameters, six.string_types):
+            meta_parameters = json.loads(parameters)
+        else:
+            # generate dict from OrderedDict
+            meta_parameters = {k: v for (k, v) in parameters.items()}
+
+    node_meta = {
+        'classes': meta_classes,
+        'parameters': {
+            '_param': meta_parameters,
+            'linux': {
+                'system': {
+                    'name': host_name,
+                    'domain': domain_name,
+                    'cluster': cluster,
+                    'environment': environment,
+                }
+            }
+        }
+    }
+
+    return node_meta
+
+
 def node_create(name, path=None, cluster="default", environment="prd", classes=None, parameters=None, **kwargs):
     '''
     Create a reclass node
@@ -69,36 +108,7 @@
     host_name = name.split('.')[0]
     domain_name = '.'.join(name.split('.')[1:])
 
-    if classes == None:
-        meta_classes = []
-    else:
-        if isinstance(classes, six.string_types):
-            meta_classes = json.loads(classes)
-        else:
-            meta_classes = classes
-
-    if parameters == None:
-        meta_parameters = {}
-    else:
-        if isinstance(parameters, six.string_types):
-            meta_parameters = json.loads(parameters)
-        else:
-            meta_parameters = parameters
-
-    node_meta = {
-        'classes': meta_classes,
-        'parameters': {
-            '_param': meta_parameters,
-            'linux': {
-                'system': {
-                    'name': host_name,
-                    'domain': domain_name,
-                    'cluster': cluster,
-                    'environment': environment,
-                }
-            }
-        }
-    }
+    node_meta = _get_node_meta(name, cluster, environment, classes, parameters)
     LOG.debug(node_meta)
 
     if path == None:
@@ -176,23 +186,14 @@
     ret = {}
 
     for root, sub_folders, files in os.walk(_get_nodes_dir()):
-        for file in files:
-            file_path = os.path.join(root, file)
-            file_content = open(file_path, 'r')
-            file_data = yaml.load(file_content.read())
-            file_content.close()
-            if 'classes' in file_data:
-                classes = file_data.get('classes')
-            else:
-                classes = []
-            if 'parameters' in file_data:
-                if '_param' in file_data.get('parameters'):
-                    parameters = file_data.get('parameters').get('_param')
-                else:
-                    parameters = []
-            else:
-                parameters = []
-            name = file.replace('.yml', '')
+        for fl in files:
+            file_path = os.path.join(root, fl)
+            with open(file_path, 'r') as file_handle:
+                file_read = yaml.load(file_handle.read())
+            file_data = file_read or {}
+            classes = file_data.get('classes', [])
+            parameters = file_data.get('parameters', {}).get('_param', [])
+            name = fl.replace('.yml', '')
             host_name = name.split('.')[0]
             domain_name = '.'.join(name.split('.')[1:])
             path = root.replace(_get_nodes_dir()+'/', '')
diff --git a/_states/reclass.py b/_states/reclass.py
index 134ec6d..a930021 100644
--- a/_states/reclass.py
+++ b/_states/reclass.py
@@ -19,11 +19,41 @@
           neco2: value2
 
 '''
+import json
+import six
 
 
 def __virtual__():
     '''
-    Always present
+    Only load if the reclass module is in __salt__
     '''
-    return 'reclass'
+    return 'reclass' if 'reclass.node_list' in __salt__ else False
+
+
+def node_present(name, path=None, cluster="default", environment="prd", classes=None, parameters=None, **kwargs):
+    '''
+    Ensure that the reclass node exists
+
+    :param name: new node FQDN
+    :param path: custom path in nodes for new node
+    :param classes: classes given to the new node
+    :param parameters: parameters given to the new node
+    :param environment: node's environment
+    :param cluster: node's cluster
+
+    '''
+    ret = {'name': name,
+           'changes': {},
+           'result': True,
+           'comment': 'Node "{0}" already exists and it is in correct state'.format(name)}
+
+    # Check if node is already present
+    node = __salt__['reclass.node_get'](name, **kwargs)
+
+    if 'Error' in node:
+        # Create node
+        __salt__['reclass.node_create'](name, path, cluster, environment, classes, parameters, **kwargs)
+        ret['comment'] = 'Node "{0}" has been created'.format(name)
+        ret['changes']['Node'] = 'Created'
+    return ret