#!/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()