91 lines
3.4 KiB
Python
Executable file
91 lines
3.4 KiB
Python
Executable file
#!/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()
|