Cluster metadata module and state methods
diff --git a/_modules/reclass.py b/_modules/reclass.py
index 10fcdc3..ae94541 100644
--- a/_modules/reclass.py
+++ b/_modules/reclass.py
@@ -6,12 +6,13 @@
from __future__ import absolute_import
+import io
+import json
import logging
import os
import sys
import six
import yaml
-import json
from reclass import get_storage, output
from reclass.core import Core
@@ -38,6 +39,11 @@
return os.path.join(defaults.get('inventory_base_uri'), 'classes')
+def _get_cluster_dir():
+ classes_dir = _get_classes_dir()
+ return os.path.join(classes_dir, 'cluster')
+
+
def _get_node_meta(name, cluster="default", environment="prd", classes=None, parameters=None):
host_name = name.split('.')[0]
domain_name = '.'.join(name.split('.')[1:])
@@ -257,3 +263,71 @@
'services': service_classification,
}
return output
+
+
+def cluster_meta_list(file_name="overrides.yml", cluster="", **kwargs):
+ path = os.path.join(_get_cluster_dir(), cluster, file_name)
+ try:
+ with io.open(path, 'r') as file_handle:
+ meta_yaml = yaml.safe_load(file_handle.read())
+ meta = meta_yaml or {}
+ except Exception as e:
+ msg = "Unable to load cluster metadata YAML %s: %s" % (path, repr(e))
+ LOG.debug(msg)
+ meta = {'Error': msg}
+ return meta
+
+
+def cluster_meta_delete(name, file_name="overrides.yml", cluster="", **kwargs):
+ ret = {}
+ path = os.path.join(_get_cluster_dir(), cluster, file_name)
+ meta = __salt__['reclass.cluster_meta_list'](path, **kwargs)
+ if 'Error' not in meta:
+ metadata = meta.get('parameters', {}).get('_param', {})
+ if name not in metadata:
+ return ret
+ del metadata[name]
+ try:
+ with io.open(path, 'w') as file_handle:
+ file_handle.write(unicode(yaml.dump(meta, default_flow_style=False)))
+ except Exception as e:
+ msg = "Unable to save cluster metadata YAML: %s" % repr(e)
+ LOG.error(msg)
+ return {'Error': msg}
+ ret = 'Cluster metadata entry {0} deleted'.format(name)
+ return ret
+
+
+def cluster_meta_set(name, value, file_name="overrides.yml", cluster="", **kwargs):
+ path = os.path.join(_get_cluster_dir(), cluster, file_name)
+ meta = __salt__['reclass.cluster_meta_list'](path, **kwargs)
+ if 'Error' not in meta:
+ if not meta:
+ meta = {'parameters': {'_param': {}}}
+ metadata = meta.get('parameters', {}).get('_param', {})
+ if name in metadata and metadata[name] == value:
+ return {name: 'Cluster metadata entry %s already exists and is in correct state' % name}
+ metadata.update({name: value})
+ try:
+ with io.open(path, 'w') as file_handle:
+ file_handle.write(unicode(yaml.dump(meta, default_flow_style=False)))
+ except Exception as e:
+ msg = "Unable to save cluster metadata YAML %s: %s" % (path, repr(e))
+ LOG.error(msg)
+ return {'Error': msg}
+ return cluster_meta_get(name, path, **kwargs)
+ return meta
+
+
+def cluster_meta_get(name, file_name="overrides.yml", cluster="", **kwargs):
+ ret = {}
+ path = os.path.join(_get_cluster_dir(), cluster, file_name)
+ meta = __salt__['reclass.cluster_meta_list'](path, **kwargs)
+ metadata = meta.get('parameters', {}).get('_param', {})
+ if 'Error' in meta:
+ ret['Error'] = meta['Error']
+ elif name in metadata:
+ ret[name] = metadata.get(name)
+
+ return ret
+