#!/usr/bin/python # Copyright (c) 2014 The Chromium OS Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """This script copies all data from one index into another, and updates the alias to point to the new index. usage: es_reindex.py [-h] [--host HOST] [--port PORT] [--old OLD] [--new NEW] [--alias ALIAS] optional arguments: -h, --help show this help message and exit --host HOST name of ES server. --port PORT --old OLD Name of the old index. --new NEW Name of the new index. --alias ALIAS alias to be pointed to the new index. """ import argparse import common from elasticsearch import Elasticsearch from elasticsearch import helpers from autotest_lib.client.common_lib.cros.graphite import autotest_es def main(): """main script. """ parser = argparse.ArgumentParser() parser.add_argument('--host', type=str, dest='host', help='name of ES server.') parser.add_argument('--port', type=str, dest='port', default=9200) parser.add_argument('--old', type=str, dest='old', help='Name of the old index.') parser.add_argument('--new', type=str, dest='new', help='Name of the new index.') parser.add_argument('--alias', type=str, dest='alias', help='alias to be pointed to the new index.') options = parser.parse_args() query = {'query' : {'match_all' : {}}, 'size': 1} result = autotest_es.execute_query(index=options.old, host=options.host, port=options.port, query) print 'Total number of records in index %s: %d' % (options.old, result.total) print ('Re-index: %s to index: %s for server %s:%s' % (options.old, options.new, options.host, options.port)) client = Elasticsearch(hosts=[{'host': options.host, 'port': options.port}]) helpers.reindex(client, options.old, options.new) print 'reindex completed.' print 'Checking records in the new index...' result = es.execute_query(index=options.new, host=options.host, port=options.port, query) print 'Total number of records in index %s: %d' % (options.new, result.total) # count_new can be larger than count if new records are added during # reindexing. This check only tries to make sure no record was lost. if count > count_new: raise Exception('Error! There are %d records missing after reindexing. ' 'Alias will not be updated to the new index. You might ' 'want to try reindex again.' % (count - count_new)) body = {'actions': [{'remove': {'alias': options.alias, 'index': options.old}}, {'add': {'alias': options.alias, 'index': options.new}} ] } client.indices.update_aliases(body=body) print 'alias is updated.' print ('Please verify the new index is working before deleting old index ' 'with command:\n.curl -XDELETE %s:%s/%s' % (options.host, options.port, options.old)) if __name__ == '__main__': main()