diff --git a/pillar/api/search/index.py b/pillar/api/search/index.py index 0ecc70d8..fab826a6 100644 --- a/pillar/api/search/index.py +++ b/pillar/api/search/index.py @@ -21,13 +21,15 @@ class ResetIndexTask(object): """ Clear and build index / mapping """ - index = '' + index_key = '' + """Key into the ELASTIC_INDICES dict in the app config.""" + doc_types = [] name = 'remove index' def __init__(self): - if not self.index: + if not self.index_key: raise ValueError("No index specified") if not self.doc_types: @@ -40,16 +42,16 @@ class ResetIndexTask(object): ) def execute(self): - - idx = es.Index(self.index) + index = current_app.config['ELASTIC_INDICES'][self.index_key] + idx = es.Index(index) try: idx.delete(ignore=404) - log.info("Deleted index %s", self.index) + log.info("Deleted index %s", index) except AttributeError: - log.warning("Could not delete index '%s', ignoring", self.index) + log.warning("Could not delete index '%s', ignoring", index) except NotFoundError: - log.warning("Could not delete index '%s', ignoring", self.index) + log.warning("Could not delete index '%s', ignoring", index) # create doc types for dt in self.doc_types: @@ -60,25 +62,10 @@ class ResetIndexTask(object): class ResetNodeIndex(ResetIndexTask): - index = current_app.config['ELASTIC_INDICES']['NODE'] + index_key = 'NODE' doc_types = [documents.Node] class ResetUserIndex(ResetIndexTask): - index = current_app.config['ELASTIC_INDICES']['USER'] + index_key = 'USER' doc_types = [documents.User] - - -def reset_node_index(): - resettask = ResetNodeIndex() - resettask.execute() - - -def reset_index(indexnames): - if 'users' in indexnames: - resettask = ResetUserIndex() - resettask.execute() - if 'nodes' in indexnames: - resettask = ResetUserIndex() - resettask.execute() - diff --git a/pillar/cli/elastic.py b/pillar/cli/elastic.py index b463db4a..c9c2d3f1 100644 --- a/pillar/cli/elastic.py +++ b/pillar/cli/elastic.py @@ -5,17 +5,21 @@ import bson from flask_script import Manager from pillar import current_app +from pillar.api.search import index log = logging.getLogger(__name__) manager_elk = Manager( current_app, usage="Elastic utilities, like reset_index()") -indexes = ['users', 'nodes'] +name_to_task = { + 'nodes': index.ResetNodeIndex, + 'users': index.ResetUserIndex, +} -@manager_elk.command -def reset_index(elk_index=None): +@manager_elk.option('indices', nargs='*') +def reset_index(indices): """ Destroy and recreate elastic indices @@ -23,16 +27,16 @@ def reset_index(elk_index=None): """ with current_app.app_context(): - from pillar.api.search import index - if not elk_index: - index.reset_index(indexes) - return - if elk_index == 'nodes': - index.reset_index(['node']) - return - if elk_index == 'users': - index.reset_index(['user']) - return + if not indices: + indices = name_to_task.keys() + + for elk_index in indices: + try: + task = name_to_task[elk_index]() + except KeyError: + raise SystemError('Unknown elk_index, choose from %s' % + (', '.join(name_to_task.keys()))) + task.execute() def _reindex_users(): @@ -71,7 +75,6 @@ def _public_project_ids() -> typing.List[bson.ObjectId]: def _reindex_nodes(): - db = current_app.db() pipeline = [ {'$match': {'project': {'$in': _public_project_ids()}}}, @@ -95,16 +98,15 @@ def _reindex_nodes(): continue -@manager_elk.command -def reindex(indexname): - +@manager_elk.option('indexname', nargs='?') +def reindex(indexname=''): if not indexname: - log.debug('reindex everything..') + log.info('reindex everything..') _reindex_nodes() _reindex_users() elif indexname == 'users': - log.debug('Indexing %s', indexname) + log.info('Indexing %s', indexname) _reindex_users() elif indexname == 'nodes': - log.debug('Indexing %s', indexname) + log.info('Indexing %s', indexname) _reindex_nodes()