|  | import argparse | 
|  | import sys | 
|  | import os | 
|  | import paramiko | 
|  |  | 
|  | from urlparse import urlparse | 
|  |  | 
|  |  | 
|  | from disk_perf_test_tool.keystone import KeystoneAuth | 
|  |  | 
|  |  | 
|  | def discover_fuel_nodes(fuel_url, creds, cluster_id): | 
|  | admin_ip = urlparse(fuel_url).hostname | 
|  | fuel = KeystoneAuth(fuel_url, creds, headers=None, echo=None, | 
|  | admin_node_ip=admin_ip) | 
|  | nodes = fuel.do("get", path="/api/nodes?cluster_id=" + str(cluster_id)) | 
|  | ips = [node["ip"] for node in nodes] | 
|  | roles = [node["roles"] for node in nodes] | 
|  |  | 
|  | host = urlparse(fuel_url).hostname | 
|  |  | 
|  | return run_agent(ips, roles, host) | 
|  |  | 
|  |  | 
|  | def discover_fuel_nodes_clean(fuel_url, ssh_creds, nodes, base_port=12345): | 
|  | admin_ip = urlparse(fuel_url).hostname | 
|  | ssh = paramiko.SSHClient() | 
|  | ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) | 
|  | ssh.connect(hostname=admin_ip, port=ssh_creds["port"], | 
|  | password=ssh_creds["password"], username=ssh_creds["username"]) | 
|  |  | 
|  | command = "python /tmp/agent.py --clean=True --base_port=" \ | 
|  | + str(base_port) + " --ports" | 
|  |  | 
|  | for node in nodes: | 
|  | ip = urlparse(node[0]).hostname | 
|  | command += " " + ip | 
|  |  | 
|  | (stdin, stdout, stderr) = ssh.exec_command(command) | 
|  | for line in stdout.readlines(): | 
|  | print line | 
|  |  | 
|  | os.remove('/tmp/fuel_id_rsa') | 
|  |  | 
|  |  | 
|  | def run_agent(ip_addresses, roles, host, password="test37", port=22, | 
|  | base_port=12345): | 
|  | ssh = paramiko.SSHClient() | 
|  | ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) | 
|  | ssh.connect(hostname=host, port=port, password=password, username="root") | 
|  | sftp = ssh.open_sftp() | 
|  | sftp.put(os.path.join(os.path.dirname(__file__), 'agent.py'), | 
|  | "/tmp/agent.py") | 
|  | fuel_id_rsa_path = '/tmp/fuel_id_rsa' | 
|  | sftp.get('/root/.ssh/id_rsa', fuel_id_rsa_path) | 
|  | os.chmod(fuel_id_rsa_path, 700) | 
|  | command = "python /tmp/agent.py --base_port=" + str(base_port) + " --ports" | 
|  |  | 
|  | for address in ip_addresses: | 
|  | command += " " + address | 
|  |  | 
|  | (stdin, stdout, stderr) = ssh.exec_command(command) | 
|  | node_port_mapping = {} | 
|  |  | 
|  | for line in stdout.readlines(): | 
|  | results = line.split(' ') | 
|  |  | 
|  | if len(results) != 2: | 
|  | continue | 
|  |  | 
|  | node, port = results | 
|  | node_port_mapping[node] = port | 
|  |  | 
|  | nodes = [] | 
|  |  | 
|  | for i in range(len(ip_addresses)): | 
|  | ip = ip_addresses[i] | 
|  | role = roles[i] | 
|  | port = node_port_mapping[ip] | 
|  |  | 
|  | nodes.append(("ssh://root@" + ip + ":" + port + | 
|  | ":/tmp/fuel_id_rsa", role)) | 
|  |  | 
|  | ssh.close() | 
|  | print 'Files has been transfered successefully to Fuel node, ' \ | 
|  | 'agent has been launched' | 
|  | print nodes | 
|  |  | 
|  | return nodes | 
|  |  | 
|  |  | 
|  | def parse_command_line(argv): | 
|  | parser = argparse.ArgumentParser( | 
|  | description="Connect to fuel master and setup ssh agent") | 
|  | parser.add_argument("--fuel-url", required=True) | 
|  | parser.add_argument("--cluster-id", required=True) | 
|  | parser.add_argument("--username", default="admin") | 
|  | parser.add_argument("--tenantname", default="admin") | 
|  | parser.add_argument("--password", default="admin") | 
|  | return parser.parse_args(argv) | 
|  |  | 
|  |  | 
|  | def main(argv): | 
|  | args = parse_command_line(argv) | 
|  | creds = {"username": args.username, | 
|  | "tenant_name": args.tenantname, | 
|  | "password": args.password} | 
|  |  | 
|  | nodes = discover_fuel_nodes(args.fuel_url, creds, args.cluster_id) | 
|  | print "Ready", nodes | 
|  | sys.stdin.readline() | 
|  | discover_fuel_nodes_clean(args.fuel_url, {"username": "root", | 
|  | "password": "test37", | 
|  | "port": 22}, nodes) | 
|  |  | 
|  |  | 
|  | if __name__ == "__main__": | 
|  | main(sys.argv[1:]) |