2 # Copyright (C) The Arvados Authors. All rights reserved.
4 # SPDX-License-Identifier: AGPL-3.0
8 # Launch a test Keep and API server and PUT and GET a bunch of blocks.
9 # Can be used to simulate client traffic in Keep to evaluate memory usage,
10 # error logging, performance, etc.
12 # This script is warty and is relatively environment-specific, but the
13 # example run described below should execute cleanly.
16 # traffic_test.py start
17 # Starts the test servers.
18 # traffic_test.py put file1 file2 file3 ....
19 # Runs arv-put on each file.
20 # traffic_test.py get hash1 hash2 hash3 ....
21 # Loops forever issuing GET requests for specified blocks.
22 # traffic_test.py stop
23 # Stops the test servers.
27 # $ ./traffic_test.py start
28 # $ ./traffic_test.py put GS00253-DNA_A02_200_37.tsv.bz2 \
29 # GS00253-DNA_B01_200_37.tsv.bz2 \
30 # GS00253-DNA_B02_200_37.tsv.bz2
31 # $ ./traffic_test.py get $(find /tmp/tmp* -type f -printf "%f ")
34 # $ ./traffic_test.py stop
36 # Multiple "get" runs may be run concurrently to evaluate Keep's handling
37 # of additional concurrent clients.
39 PYSDK_DIR = "../../../sdk/python"
40 PYTEST_DIR = PYSDK_DIR + "/tests"
41 ARV_PUT_PATH = PYSDK_DIR + "/bin/arv-put"
42 ARV_GET_PATH = PYSDK_DIR + "/bin/arv-get"
43 SECONDS_BETWEEN_GETS = 1
53 # for run_test_server.py
54 sys.path.insert(0, PYSDK_DIR)
55 sys.path.insert(0, PYTEST_DIR)
57 import run_test_server
60 p = subprocess.Popen([sys.executable] + list(args),
61 stdout=subprocess.PIPE)
62 (arvout, arverr) = p.communicate()
64 print "error {} from {} {}: {}".format(
65 p.returncode, sys.executable, args, arverr)
66 sys.exit(p.returncode)
71 run_test_server.run_keep()
74 os.environ["ARVADOS_API_HOST"] = "127.0.0.1:3000"
75 run_test_server.authorize_with('active')
76 for v in ["ARVADOS_API_HOST",
77 "ARVADOS_API_HOST_INSECURE",
79 os.environ[v] = arvados.config.settings()[v]
81 if not os.environ.has_key('PYTHONPATH'):
82 os.environ['PYTHONPATH'] = ''
83 os.environ['PYTHONPATH'] = "{}:{}:{}".format(
84 PYSDK_DIR, PYTEST_DIR, os.environ['PYTHONPATH'])
87 manifest_uuid = arv_cmd(ARV_PUT_PATH, c)
90 os.environ["ARVADOS_API_HOST"] = "127.0.0.1:3000"
92 run_test_server.authorize_with('active')
93 for v in ["ARVADOS_API_HOST",
94 "ARVADOS_API_HOST_INSECURE",
96 os.environ[v] = arvados.config.settings()[v]
100 b = random.choice(blocks)
102 body = arv_cmd(ARV_GET_PATH, b)
103 print "got {} bytes".format(len(body))
104 time.sleep(SECONDS_BETWEEN_GETS)
105 nqueries = nqueries + 1
108 run_test_server.stop_keep()
109 run_test_server.stop()
111 if __name__ == "__main__":
112 parser = argparse.ArgumentParser()
113 parser.add_argument('action',
116 help='''"start", "put", "get", "stop"''')
117 args = parser.parse_args()
119 if args.action[0] == 'start':
121 elif args.action[0] == 'put':
123 elif args.action[0] == 'get':
125 elif args.action[0] == 'stop':
128 print('Unrecognized action "{}"'.format(args.action))
129 print('actions are "start", "put", "get", "stop"')