run-tests.py 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. #!/usr/bin/env python
  2. import argparse
  3. import ConfigParser
  4. import sys
  5. import os
  6. from pprint import pprint
  7. from benchmark.benchmarker import Benchmarker
  8. from setup.linux.unbuffered import Unbuffered
  9. ###################################################################################################
  10. # Main
  11. ###################################################################################################
  12. def main(argv=None):
  13. # Do argv default this way, as doing it in the functional declaration sets it at compile time
  14. if argv is None:
  15. argv = sys.argv
  16. # Enable unbuffered output so messages will appear in the proper order with subprocess output.
  17. sys.stdout=Unbuffered(sys.stdout)
  18. # Ensure the current directory (which should be the benchmark home directory) is in the path so that the tests can be imported.
  19. sys.path.append('.')
  20. # Ensure toolset/setup/linux is in the path so that the tests can "import setup_util".
  21. sys.path.append('toolset/setup/linux')
  22. conf_parser = argparse.ArgumentParser(
  23. description=__doc__,
  24. formatter_class=argparse.RawDescriptionHelpFormatter,
  25. add_help=False)
  26. conf_parser.add_argument('--conf_file', default='benchmark.cfg', metavar='FILE', help='Optional configuration file to provide argument defaults. All config options can be overridden using the command line.')
  27. args, remaining_argv = conf_parser.parse_known_args()
  28. try:
  29. with open (args.conf_file):
  30. config = ConfigParser.SafeConfigParser()
  31. config.read([os.getcwd() + '/' + args.conf_file])
  32. defaults = dict(config.items("Defaults"))
  33. except IOError:
  34. if args.conf_file != 'benchmark.cfg':
  35. print 'Configuration file not found!'
  36. defaults = { "client-host":"localhost"}
  37. ##########################################################
  38. # Set up default values
  39. ##########################################################
  40. serverHost = os.environ.get('TFB_SERVER_HOST')
  41. clientHost = os.environ.get('TFB_CLIENT_HOST')
  42. clientUser = os.environ.get('TFB_CLIENT_USER')
  43. clientIden = os.environ.get('TFB_CLIENT_IDENTITY_FILE')
  44. databaHost = os.getenv('TFB_DATABASE_HOST', clientHost)
  45. databaUser = os.getenv('TFB_DATABASE_USER', clientUser)
  46. dbIdenFile = os.getenv('TFB_DATABASE_IDENTITY_FILE', clientIden)
  47. if serverHost != None:
  48. defaults["server_host"] = serverHost
  49. if clientHost != None:
  50. defaults["client_host"] = clientHost
  51. if clientUser != None:
  52. defaults["client_user"] = clientUser
  53. if clientIden != None:
  54. defaults["client_identity_file"] = clientIden
  55. if databaHost != None:
  56. defaults["database_host"] = databaHost
  57. if databaUser != None:
  58. defaults["database_user"] = databaUser
  59. if dbIdenFile != None:
  60. defaults["database_identity_file"] = dbIdenFile
  61. ##########################################################
  62. # Set up argument parser
  63. ##########################################################
  64. parser = argparse.ArgumentParser(description='Run the Framework Benchmarking test suite.',
  65. parents=[conf_parser])
  66. parser.add_argument('-s', '--server-host', required=True, help='The application server.')
  67. parser.add_argument('-c', '--client-host', required=True, help='The client / load generation server.')
  68. parser.add_argument('-u', '--client-user', required=True, help='The username to use for SSH to the client instance.')
  69. parser.add_argument('-i', '--client-identity-file', required=True, dest='client_identity_file', help='The key to use for SSH to the client instance.')
  70. parser.add_argument('-d', '--database-host', help='The database server. If not provided, defaults to the value of --client-host.')
  71. parser.add_argument('--database-user', help='The username to use for SSH to the database instance. If not provided, defaults to the value of --client-user.')
  72. parser.add_argument('--database-identity-file', dest='database_identity_file', help='The key to use for SSH to the database instance. If not provided, defaults to the value of --client-identity-file.')
  73. parser.add_argument('-p', dest='password_prompt', action='store_true')
  74. parser.add_argument('--install-software', action='store_true', help='runs the installation script before running the rest of the commands')
  75. parser.add_argument('--install', choices=['client', 'database', 'server', 'all'], default='all', help='Allows you to only install the server, client, or database software')
  76. parser.add_argument('--install-error-action', choices=['abort', 'continue'], default='continue', help='action to take in case of error during installation')
  77. parser.add_argument('--test', nargs='+', help='names of tests to run')
  78. parser.add_argument('--exclude', nargs='+', help='names of tests to exclude')
  79. parser.add_argument('--type', choices=['all', 'json', 'db', 'query', 'fortune', 'update', 'plaintext'], default='all', help='which type of test to run')
  80. parser.add_argument('-m', '--mode', choices=['benchmark', 'verify'], default='benchmark', help='verify mode will only start up the tests, curl the urls and shutdown')
  81. parser.add_argument('--list-tests', action='store_true', default=False, help='lists all the known tests that can run')
  82. parser.add_argument('--list-test-metadata', action='store_true', default=False, help='writes all the test metadata as a JSON file in the results directory')
  83. parser.add_argument('--max-concurrency', default=256, help='the maximum concurrency that the tests will run at. The query tests will run at this concurrency', type=int)
  84. parser.add_argument('--max-queries', default=20, help='The maximum number of queries to run during the query test', type=int)
  85. parser.add_argument('--query-interval', default=5, type=int)
  86. parser.add_argument('--max-threads', default=8, help='The max number of threads to run weight at, this should be set to the number of cores for your system.', type=int)
  87. parser.add_argument('--duration', default=15, help='Time in seconds that each test should run for.')
  88. parser.add_argument('--starting-concurrency', default=8, type=int)
  89. parser.add_argument('--sleep', type=int, default=60, help='the amount of time to sleep after starting each test to allow the server to start up.')
  90. parser.add_argument('--parse', help='Parses the results of the given timestamp and merges that with the latest results')
  91. parser.add_argument('--name', default="ec2", help='The name to give this test. Results will be placed in a folder using this name.')
  92. parser.add_argument('--os', choices=['linux', 'windows'], default='linux', help='The operating system of the application server.')
  93. parser.add_argument('--database-os', choices=['linux', 'windows'], default='linux', help='The operating system of the database server.')
  94. parser.add_argument('-v', '--verbose', action='store_true', default=False, help='Causes the configuration to print before any other commands are executed.')
  95. parser.set_defaults(**defaults) # Must do this after add, or each option's default will override the configuration file default
  96. args = parser.parse_args(remaining_argv)
  97. if args.verbose:
  98. print 'Configuration options: '
  99. pprint(args)
  100. benchmarker = Benchmarker(vars(args))
  101. # Run the benchmarker in the specified mode
  102. if benchmarker.list_tests:
  103. benchmarker.run_list_tests()
  104. elif benchmarker.list_test_metadata:
  105. benchmarker.run_list_test_metadata()
  106. elif benchmarker.parse != None:
  107. benchmarker.parse_timestamp()
  108. else:
  109. benchmarker.run()
  110. if __name__ == "__main__":
  111. sys.exit(main())