1 #!/usr/bin/python 2 3 # Copyright (c) 2014 The Chromium OS Authors. All rights reserved. 4 # Use of this source code is governed by a BSD-style license that can be 5 # found in the LICENSE file. 6 7 8 """This script copies all data from one index into another, and updates the 9 alias to point to the new index. 10 11 usage: es_reindex.py [-h] [--host HOST] [--port PORT] [--old OLD] 12 [--new NEW] [--alias ALIAS] 13 14 optional arguments: 15 -h, --help show this help message and exit 16 --host HOST name of ES server. 17 --port PORT 18 --old OLD Name of the old index. 19 --new NEW Name of the new index. 20 --alias ALIAS alias to be pointed to the new index. 21 22 """ 23 24 import argparse 25 26 import common 27 from elasticsearch import Elasticsearch 28 from elasticsearch import helpers 29 from autotest_lib.client.common_lib.cros.graphite import autotest_es 30 31 32 def main(): 33 """main script. """ 34 35 parser = argparse.ArgumentParser() 36 parser.add_argument('--host', type=str, dest='host', 37 help='name of ES server.') 38 parser.add_argument('--port', type=str, dest='port', default=9200) 39 parser.add_argument('--old', type=str, dest='old', 40 help='Name of the old index.') 41 parser.add_argument('--new', type=str, dest='new', 42 help='Name of the new index.') 43 parser.add_argument('--alias', type=str, dest='alias', 44 help='alias to be pointed to the new index.') 45 46 options = parser.parse_args() 47 48 query = {'query' : {'match_all' : {}}, 49 'size': 1} 50 51 result = autotest_es.execute_query(index=options.old, host=options.host, 52 port=options.port, query) 53 print 'Total number of records in index %s: %d' % (options.old, 54 result.total) 55 56 print ('Re-index: %s to index: %s for server %s:%s' % 57 (options.old, options.new, options.host, options.port)) 58 59 client = Elasticsearch(hosts=[{'host': options.host, 'port': options.port}]) 60 helpers.reindex(client, options.old, options.new) 61 print 'reindex completed.' 62 63 print 'Checking records in the new index...' 64 result = es.execute_query(index=options.new, host=options.host, 65 port=options.port, query) 66 print 'Total number of records in index %s: %d' % (options.new, 67 result.total) 68 69 # count_new can be larger than count if new records are added during 70 # reindexing. This check only tries to make sure no record was lost. 71 if count > count_new: 72 raise Exception('Error! There are %d records missing after reindexing. ' 73 'Alias will not be updated to the new index. You might ' 74 'want to try reindex again.' % 75 (count - count_new)) 76 77 body = {'actions': [{'remove': {'alias': options.alias, 78 'index': options.old}}, 79 {'add': {'alias': options.alias, 80 'index': options.new}} 81 ] 82 } 83 client.indices.update_aliases(body=body) 84 print 'alias is updated.' 85 print ('Please verify the new index is working before deleting old index ' 86 'with command:\n.curl -XDELETE %s:%s/%s' % 87 (options.host, options.port, options.old)) 88 89 90 if __name__ == '__main__': 91 main() 92