blob: feb8bcb7a4646f00cdb7842e718ba5c966043bf7 [file] [log] [blame]
koder aka kdanilovdda86d32015-03-16 11:20:04 +02001import time
2import json
3import os.path
koder aka kdanilov2c473092015-03-29 17:12:13 +03004import logging
koder aka kdanilovdda86d32015-03-16 11:20:04 +02005
koder aka kdanilovdda86d32015-03-16 11:20:04 +02006from concurrent.futures import ThreadPoolExecutor, wait
7
koder aka kdanilove06762a2015-03-22 23:32:09 +02008from disk_perf_test_tool.ssh_utils import connect, copy_paths
9
koder aka kdanilov2c473092015-03-29 17:12:13 +030010logger = logging.getLogger('io-perf-tool')
11
koder aka kdanilovdda86d32015-03-16 11:20:04 +020012
13def wait_all_ok(futures):
14 return all(future.result() for future in futures)
15
16
koder aka kdanilov2c473092015-03-29 17:12:13 +030017def deploy_and_start_sensors(monitor_uri, config,
18 remote_path='/tmp/sensors',
19 connected_config=None):
koder aka kdanilov12ae0632015-04-15 01:13:43 +030020
koder aka kdanilovdda86d32015-03-16 11:20:04 +020021 paths = {os.path.dirname(__file__): remote_path}
22 with ThreadPoolExecutor(max_workers=32) as executor:
23 futures = []
24
koder aka kdanilov2c473092015-03-29 17:12:13 +030025 if connected_config is not None:
26 assert config is None
27 node_iter = connected_config
28 else:
29 node_iter = config.items()
30
31 for uri_or_conn, config in node_iter:
koder aka kdanilovdda86d32015-03-16 11:20:04 +020032 futures.append(executor.submit(deploy_and_start_sensor,
koder aka kdanilov2c473092015-03-29 17:12:13 +030033 paths, uri_or_conn,
34 monitor_uri,
koder aka kdanilovdda86d32015-03-16 11:20:04 +020035 config, remote_path))
36
37 if not wait_all_ok(futures):
38 raise RuntimeError("Sensor deployment fails on some nodes")
39
40
koder aka kdanilov2c473092015-03-29 17:12:13 +030041def deploy_and_start_sensor(paths, uri_or_conn, monitor_uri, config,
42 remote_path):
koder aka kdanilovdda86d32015-03-16 11:20:04 +020043 try:
koder aka kdanilov2c473092015-03-29 17:12:13 +030044 if isinstance(uri_or_conn, basestring):
45 conn = connect(uri_or_conn)
46 else:
47 conn = uri_or_conn
48
koder aka kdanilovdda86d32015-03-16 11:20:04 +020049 copy_paths(conn, paths)
50 sftp = conn.open_sftp()
51
52 config_remote_path = os.path.join(remote_path, "conf.json")
53 main_remote_path = os.path.join(remote_path, "main.py")
54
55 with sftp.open(config_remote_path, "w") as fd:
56 fd.write(json.dumps(config))
57
58 cmd_templ = "python {0} -d start -u {1} {2}"
59 cmd = cmd_templ.format(main_remote_path,
60 monitor_uri,
61 config_remote_path)
62 conn.exec_command(cmd)
63 sftp.close()
koder aka kdanilov2c473092015-03-29 17:12:13 +030064
65 if isinstance(uri_or_conn, basestring):
66 conn.close()
koder aka kdanilove4ade1a2015-03-16 20:44:16 +020067 except:
koder aka kdanilov2c473092015-03-29 17:12:13 +030068 logger.exception("During deploing sensors in {0}".format(uri_or_conn))
koder aka kdanilovdda86d32015-03-16 11:20:04 +020069 return False
70 return True
71
72
koder aka kdanilov2c473092015-03-29 17:12:13 +030073def stop_and_remove_sensor(uri_or_conn, remote_path):
74 if isinstance(uri_or_conn, basestring):
75 conn = connect(uri_or_conn)
76 else:
77 conn = uri_or_conn
78
koder aka kdanilovdda86d32015-03-16 11:20:04 +020079 main_remote_path = os.path.join(remote_path, "main.py")
80
81 cmd_templ = "python {0} -d stop"
82 conn.exec_command(cmd_templ.format(main_remote_path))
koder aka kdanilove4ade1a2015-03-16 20:44:16 +020083
84 # some magic
koder aka kdanilovdda86d32015-03-16 11:20:04 +020085 time.sleep(0.3)
koder aka kdanilovdda86d32015-03-16 11:20:04 +020086
87 conn.exec_command("rm -rf {0}".format(remote_path))
88
koder aka kdanilov2c473092015-03-29 17:12:13 +030089 if isinstance(uri_or_conn, basestring):
90 conn.close()
koder aka kdanilovdda86d32015-03-16 11:20:04 +020091
koder aka kdanilovda45e882015-04-06 02:24:42 +030092 logger.debug("Sensors stopped and removed")
93
koder aka kdanilovdda86d32015-03-16 11:20:04 +020094
koder aka kdanilov2c473092015-03-29 17:12:13 +030095def stop_and_remove_sensors(config, remote_path='/tmp/sensors',
96 connected_config=None):
koder aka kdanilovdda86d32015-03-16 11:20:04 +020097 with ThreadPoolExecutor(max_workers=32) as executor:
98 futures = []
99
koder aka kdanilov2c473092015-03-29 17:12:13 +0300100 if connected_config is not None:
101 assert config is None
102 conf_iter = connected_config
103 else:
104 conf_iter = config.items()
105
106 for uri_or_conn, config in conf_iter:
koder aka kdanilovdda86d32015-03-16 11:20:04 +0200107 futures.append(executor.submit(stop_and_remove_sensor,
koder aka kdanilov2c473092015-03-29 17:12:13 +0300108 uri_or_conn, remote_path))
koder aka kdanilovdda86d32015-03-16 11:20:04 +0200109
110 wait(futures)