blob: 4a1c5dfefed0ed3e74c29f5d294c9d0d39200820 [file] [log] [blame]
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +03001import time
2import json
3import os.path
4import logging
5
6from concurrent.futures import ThreadPoolExecutor, wait
7
8from wally.ssh_utils import copy_paths, run_over_ssh
9
koder aka kdanilov168f6092015-04-19 02:33:38 +030010logger = logging.getLogger('wally.sensors')
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030011
12
13def wait_all_ok(futures):
14 return all(future.result() for future in futures)
15
16
koder aka kdanilov168f6092015-04-19 02:33:38 +030017def deploy_and_start_sensors(sensor_configs,
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030018 remote_path='/tmp/sensors/sensors'):
19
20 paths = {os.path.dirname(__file__): remote_path}
21 with ThreadPoolExecutor(max_workers=32) as executor:
22 futures = []
23
24 for node_sensor_config in sensor_configs:
25 futures.append(executor.submit(deploy_and_start_sensor,
26 paths,
27 node_sensor_config,
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030028 remote_path))
29
30 if not wait_all_ok(futures):
31 raise RuntimeError("Sensor deployment fails on some nodes")
32
33
koder aka kdanilov168f6092015-04-19 02:33:38 +030034def deploy_and_start_sensor(paths, node_sensor_config, remote_path):
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030035 try:
36 copy_paths(node_sensor_config.conn, paths)
37 sftp = node_sensor_config.conn.open_sftp()
38
39 config_remote_path = os.path.join(remote_path, "conf.json")
40
koder aka kdanilov168f6092015-04-19 02:33:38 +030041 sensors_config = node_sensor_config.sensors.copy()
42 sensors_config['source_id'] = node_sensor_config.source_id
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030043 with sftp.open(config_remote_path, "w") as fd:
koder aka kdanilov168f6092015-04-19 02:33:38 +030044 fd.write(json.dumps(sensors_config))
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030045
46 cmd_templ = 'env PYTHONPATH="{0}" python -m ' + \
47 "sensors.main -d start -u {1} {2}"
48
49 cmd = cmd_templ.format(os.path.dirname(remote_path),
koder aka kdanilov168f6092015-04-19 02:33:38 +030050 node_sensor_config.monitor_url,
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030051 config_remote_path)
52
53 run_over_ssh(node_sensor_config.conn, cmd,
54 node=node_sensor_config.url)
55 sftp.close()
56
57 except:
koder aka kdanilov168f6092015-04-19 02:33:38 +030058 msg = "During deploing sensors on {0}".format(node_sensor_config.url)
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030059 logger.exception(msg)
60 return False
61 return True
62
63
64def stop_and_remove_sensor(conn, url, remote_path):
koder aka kdanilovabd6ead2015-04-24 02:03:07 +030065 try:
66 cmd = 'env PYTHONPATH="{0}" python -m sensors.main -d stop'
67 cmd = cmd.format(remote_path)
68 run_over_ssh(conn, cmd, node=url)
69 # some magic
70 time.sleep(0.3)
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030071
koder aka kdanilovabd6ead2015-04-24 02:03:07 +030072 # logger.warning("Sensors don't removed")
koder aka kdanilov416b87a2015-05-12 00:26:04 +030073 run_over_ssh(conn, "rm -rf {0}".format(remote_path),
74 node=url, timeout=10)
koder aka kdanilovabd6ead2015-04-24 02:03:07 +030075 except Exception as exc:
76 msg = "Failed to remove sensors from node {0}: {1!s}"
77 logger.error(msg.format(url, exc))
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030078
79
80def stop_and_remove_sensors(configs, remote_path='/tmp/sensors'):
81 with ThreadPoolExecutor(max_workers=32) as executor:
82 futures = []
83
84 for node_sensor_config in configs:
85 futures.append(executor.submit(stop_and_remove_sensor,
86 node_sensor_config.conn,
87 node_sensor_config.url,
88 remote_path))
89
90 wait(futures)
koder aka kdanilov168f6092015-04-19 02:33:38 +030091 logger.debug("Sensors stopped and removed")