# 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 is a script that inserts a bunch of entries into elasticdb by reporting stats with metadata in the stats module. Usage: # runs tests on all stats objects on prod instance of es python stats_es_functionaltest.py --all --es_host=prod # runs tests on all stats objects on test instance of es (localhost) python stats_es_functionaltest.py --all --es_host=test python stats_es_functionaltest.py --test=timer # runs tests on timer obj. """ import optparse import time import common from autotest_lib.client.common_lib.cros.graphite import autotest_es from autotest_lib.client.common_lib.cros.graphite import es_test_utils TESTS_ALL = ['timer', 'gauge', 'raw', 'average', 'counter'] class StatsFunctionalTest(object): """Test stats module with metadata""" def __init__(self, es_host, es_port, index): self.host = es_host self.port = es_port self.index = index self.wait_time = 6 # Bulk flush is 5 seconds if autotest_es.ES_USE_HTTP: # No flush time for http requests. self.wait_time = 2 def run_tests(self, tests=TESTS_ALL, num_entries=10, keys=['job_id', 'host_id', 'job_start']): """Runs test listed in the param tests. @param tests: list of tests to run @param num_entries: number of metadata entries to insert @param keys: keys each metadata dictionary will have """ for test_type in tests: if test_type not in TESTS_ALL: print 'Skipping test %s, it is not supported. ' % (test_type) es_test_utils.clear_index(index=self.index, host=self.host, port=self.port, timeout=10) print 'running %s test.' % (test_type) self._run_one_test_metadata(test_type, num_entries, keys) def _run_one_test_metadata(self, test_type, num_entries, keys): """Puts many entries into elasticdb, then query it. """ print ('preparing to insert %s entries with keys %s into elasticdb...' % (num_entries, keys)) es_test_utils.sequential_random_insert_ints( keys=keys, target_type=test_type, index=self.index, host=self.host, port=self.port, use_http = autotest_es.ES_USE_HTTP, udp_port = autotest_es.ES_UDP_PORT, num_entries=num_entries, print_interval=num_entries/5) # Wait a bit for es to be populated with the metadata entry. # I set this to 6 seconds because bulk.udp.flush_interval (es server) # is configured to be 5 seconds. print 'waiting %s seconds...' % (self.wait_time) time.sleep(self.wait_time) result = autotest_es.query(host=self.host, port=self.port, index=self.index, fields_returned=keys, range_constraints=[('host_id', 0, None)]) if not result: print ('%s test error: Index %s not found.' %(test_type, self.index)) return # TODO(michaelliang): Check hits and total are valid keys at each layer. num_entries_found = result.total print(' Inserted %s entries, found %s entries.' %(num_entries, num_entries_found)) if num_entries_found != num_entries: print '\n\n%s test failed! \n\n' % (test_type) else: print '\n\n%s test passed! \n\n' % (test_type) def main(): """main script. """ parser = optparse.OptionParser() parser.add_option('--all', action='store_true', dest='run_all', default=False, help='set --all flag to run all tests.') parser.add_option('--test', type=str, help=('Enter subset of [\'timer\', \'gauge\', \'raw\',' '\'average\', \'counter\']'), dest='test_to_run', default=None) parser.add_option('--es_host', type=str, help=('Enter "prod" or "test" or an ip'), dest='es_host', default='localhost') parser.add_option('--es_port', type=int, help=('Enter port of es instance, usually 9200'), dest='es_port', default=9200) options, _ = parser.parse_args() if not options.run_all and not options.test_to_run: print ('No tests specified.' 'For help: python stats_es_functionaltest.py -h') if options.es_host == 'prod': es_host = autotest_es.METADATA_ES_SERVER es_port = autotest_es.ES_PORT elif options.es_host == 'test': es_host = 'http://localhost' es_port = autotest_es.ES_PORT else: es_host = options.es_host es_port = options.es_port test_obj = StatsFunctionalTest(es_host, es_port, 'stats_es_functionaltest') if options.run_all: test_obj.run_tests() elif options.test_to_run: test_obj.run_tests([options.test_to_run]) if __name__ == '__main__': main()