new sensor manage code
diff --git a/sensors/deploy_sensors.py b/sensors/deploy_sensors.py
new file mode 100644
index 0000000..b7e29b3
--- /dev/null
+++ b/sensors/deploy_sensors.py
@@ -0,0 +1,76 @@
+import time
+import json
+import os.path
+
+from disk_perf_test_tool.ssh_copy_directory import copy_paths
+from disk_perf_test_tool.ssh_runner import connect
+
+from concurrent.futures import ThreadPoolExecutor, wait
+
+
+def wait_all_ok(futures):
+    return all(future.result() for future in futures)
+
+
+def deploy_and_start_sensors(monitor_uri, config, remote_path='/tmp/sensors'):
+    paths = {os.path.dirname(__file__): remote_path}
+    with ThreadPoolExecutor(max_workers=32) as executor:
+        futures = []
+
+        for uri, config in config.items():
+            futures.append(executor.submit(deploy_and_start_sensor,
+                                           paths, uri, monitor_uri,
+                                           config, remote_path))
+
+        if not wait_all_ok(futures):
+            raise RuntimeError("Sensor deployment fails on some nodes")
+
+
+def deploy_and_start_sensor(paths, uri, monitor_uri, config, remote_path):
+    try:
+        conn = connect(uri)
+        copy_paths(conn, paths)
+        sftp = conn.open_sftp()
+
+        config_remote_path = os.path.join(remote_path, "conf.json")
+        main_remote_path = os.path.join(remote_path, "main.py")
+
+        with sftp.open(config_remote_path, "w") as fd:
+            fd.write(json.dumps(config))
+
+        cmd_templ = "python {0} -d start -u {1} {2}"
+        cmd = cmd_templ.format(main_remote_path,
+                               monitor_uri,
+                               config_remote_path)
+        conn.exec_command(cmd)
+        sftp.close()
+        conn.close()
+    except Exception as exc:
+        print exc
+        return False
+    return True
+
+
+def stop_and_remove_sensor(uri, remote_path):
+    conn = connect(uri)
+    main_remote_path = os.path.join(remote_path, "main.py")
+
+    cmd_templ = "python {0} -d stop"
+    conn.exec_command(cmd_templ.format(main_remote_path))
+    time.sleep(0.3)
+    # print out.read(), err.read()
+
+    conn.exec_command("rm -rf {0}".format(remote_path))
+
+    conn.close()
+
+
+def stop_and_remove_sensors(config, remote_path='/tmp/sensors'):
+    with ThreadPoolExecutor(max_workers=32) as executor:
+        futures = []
+
+        for uri, config in config.items():
+            futures.append(executor.submit(stop_and_remove_sensor,
+                                           uri, remote_path))
+
+        wait(futures)