ignore missing class by regexp
diff --git a/reclass/adapters/salt.py b/reclass/adapters/salt.py
index d7d34f0..5b493a0 100755
--- a/reclass/adapters/salt.py
+++ b/reclass/adapters/salt.py
@@ -25,7 +25,8 @@
classes_uri=OPT_CLASSES_URI,
class_mappings=None,
propagate_pillar_data_to_reclass=False,
- ignore_class_notfound=OPT_IGNORE_CLASS_NOTFOUND):
+ ignore_class_notfound=OPT_IGNORE_CLASS_NOTFOUND,
+ ignore_class_regexp=OPT_IGNORE_CLASS_REGEXP):
nodes_uri, classes_uri = path_mangler(inventory_base_uri,
nodes_uri, classes_uri)
@@ -35,7 +36,8 @@
if propagate_pillar_data_to_reclass:
input_data = pillar
reclass = Core(storage, class_mappings, input_data=input_data,
- ignore_class_notfound=ignore_class_notfound)
+ ignore_class_notfound=ignore_class_notfound,
+ ignore_class_regexp=ignore_class_regexp)
data = reclass.nodeinfo(minion_id)
params = data.get('parameters', {})
@@ -50,14 +52,17 @@
def top(minion_id, storage_type=OPT_STORAGE_TYPE,
inventory_base_uri=OPT_INVENTORY_BASE_URI, nodes_uri=OPT_NODES_URI,
classes_uri=OPT_CLASSES_URI,
- class_mappings=None, ignore_class_notfound=OPT_IGNORE_CLASS_NOTFOUND):
+ class_mappings=None,
+ ignore_class_notfound=OPT_IGNORE_CLASS_NOTFOUND,
+ ignore_class_regexp=OPT_IGNORE_CLASS_REGEXP):
nodes_uri, classes_uri = path_mangler(inventory_base_uri,
nodes_uri, classes_uri)
storage = get_storage(storage_type, nodes_uri, classes_uri,
default_environment='base')
reclass = Core(storage, class_mappings, input_data=None,
- ignore_class_notfound=ignore_class_notfound)
+ ignore_class_notfound=ignore_class_notfound,
+ ignore_class_regexp=ignore_class_regexp):
# if the minion_id is not None, then return just the applications for the
# specific minion, otherwise return the entire top data (which we need for
@@ -106,7 +111,8 @@
nodes_uri=options.nodes_uri,
classes_uri=options.classes_uri,
class_mappings=class_mappings,
- ignore_class_notfound=options.ignore_class_notfound)
+ ignore_class_notfound=options.ignore_class_notfound,
+ ignore_class_regexp=options.ignore_class_regexp)
else:
data = top(minion_id=None,
storage_type=options.storage_type,
@@ -114,7 +120,8 @@
nodes_uri=options.nodes_uri,
classes_uri=options.classes_uri,
class_mappings=class_mappings,
- ignore_class_notfound=options.ignore_class_notfound)
+ ignore_class_notfound=options.ignore_class_notfound,
+ ignore_class_regexp=options.ignore_class_regexp)
print output(data, options.output, options.pretty_print)
diff --git a/reclass/cli.py b/reclass/cli.py
index 8f4617b..d7e22b7 100644
--- a/reclass/cli.py
+++ b/reclass/cli.py
@@ -29,7 +29,7 @@
storage = get_storage(options.storage_type, options.nodes_uri,
options.classes_uri, default_environment='base')
class_mappings = defaults.get('class_mappings')
- reclass = Core(storage, class_mappings, ignore_class_notfound=options.ignore_class_notfound)
+ reclass = Core(storage, class_mappings, ignore_class_notfound=options.ignore_class_notfound, ignore_class_regexp=options.ignore_class_regexp)
if options.mode == MODE_NODEINFO:
data = reclass.nodeinfo(options.nodename)
diff --git a/reclass/config.py b/reclass/config.py
index fca982f..36fbf5a 100644
--- a/reclass/config.py
+++ b/reclass/config.py
@@ -32,6 +32,9 @@
ret.add_option('-z', '--ignore-class-notfound', dest='ignore_class_notfound',
default=defaults.get('ignore_class_notfound', OPT_IGNORE_CLASS_NOTFOUND),
help='decision for not found classes [%default]')
+ ret.add_option('-x', '--ignore-class-regexp', dest='ignore_class_regexp',
+ default=defaults.get('ignore_class_regexp', OPT_IGNORE_CLASS_REGEXP),
+ help='decision for not found classes [%default]')
return ret
diff --git a/reclass/core.py b/reclass/core.py
index 0c8543d..c93ab14 100644
--- a/reclass/core.py
+++ b/reclass/core.py
@@ -19,12 +19,17 @@
class Core(object):
def __init__(self, storage, class_mappings, input_data=None,
- ignore_class_notfound=False):
+ ignore_class_notfound=False, ignore_class_regexp=['*']):
self._storage = storage
self._class_mappings = class_mappings
self._ignore_class_notfound = ignore_class_notfound
self._input_data = input_data
+ if type(self._ignore_class_regexp) == type(''):
+ self._ignore_class_regexp = [ignore_class_regexp]
+ else:
+ self._ignore_class_regexp = ignore_class_regexp
+
@staticmethod
def _get_timestamp():
return time.strftime('%c')
@@ -90,13 +95,17 @@
if merge_base is None:
merge_base = Entity(name='empty (@{0})'.format(nodename))
+ cnf_r = None # class_not_found_regexp compiled
for klass in entity.classes.as_list():
if klass not in seen:
try:
class_entity = self._storage.get_class(klass)
except ClassNotFound, e:
if self._ignore_class_notfound:
- continue
+ if not cnf_r:
+ cnf_r = re.compile('||'.join([re.escape(x) for x in self._ignore_class_regexp]))
+ if cnf_r.match(klass):
+ continue
e.set_nodename(nodename)
raise e
diff --git a/reclass/defaults.py b/reclass/defaults.py
index 3892a89..0180521 100644
--- a/reclass/defaults.py
+++ b/reclass/defaults.py
@@ -17,6 +17,7 @@
OPT_PRETTY_PRINT = True
OPT_OUTPUT = 'yaml'
OPT_IGNORE_CLASS_NOTFOUND = False
+OPT_IGNORE_CLASS_REGEXP = ['*']
CONFIG_FILE_SEARCH_PATH = [os.getcwd(),
os.path.expanduser('~'),