diff --git a/scripts/connector.py b/scripts/connector.py
index 0bbf447..28a4a40 100644
--- a/scripts/connector.py
+++ b/scripts/connector.py
@@ -1,4 +1,7 @@
 import argparse
+import logging
+import re
+import string
 import sys
 import tempfile
 import os
@@ -6,24 +9,63 @@
 
 from urlparse import urlparse
 from nodes.node import Node
+from ssh_utils import ssh_connect, ssh_copy_file, connect
 from utils import parse_creds
-from keystone import KeystoneAuth
-
-
-from keystone import KeystoneAuth
+from fuel_rest_api import KeystoneAuth
 
 tmp_file = tempfile.NamedTemporaryFile().name
+openrc_path = tempfile.NamedTemporaryFile().name
+logger = logging.getLogger("io-perf-tool")
 
 
-def discover_fuel_nodes(fuel_url, creds, cluster_id):
+def get_cluster_id(cluster_name, conn):
+    clusters = conn.do("get", path="/api/clusters")
+    for cluster in clusters:
+        if cluster['name'] == cluster_name:
+            return cluster['id']
+
+
+def get_openrc_data(file_name):
+    openrc_dict = {}
+
+    with open(file_name) as f:
+        for line in f.readlines():
+            if len(line.split(" ")) > 1:
+                line = line.split(' ')[1]
+                key, value = line.split('=')
+
+                if key in ['OS_AUTH_URL', 'OS_PASSWORD',
+                              'OS_TENANT_NAME', 'OS_USERNAME']:
+                    openrc_dict[key] = value[1: len(value) - 2]
+
+    return openrc_dict
+
+
+def get_openrc(nodes):
+    controller = None
+
+    for node in nodes:
+        if 'controller' in node.roles:
+            controller = node
+            break
+
+    url = controller.conn_url[6:]
+    ssh = connect(url)
+    sftp = ssh.open_sftp()
+    sftp.get('/root/openrc', openrc_path)
+    sftp.close()
+
+    return get_openrc_data(openrc_path)
+
+
+def discover_fuel_nodes(fuel_url, creds, cluster_name):
     username, tenant_name, password = parse_creds(creds)
     creds = {"username": username,
              "tenant_name": tenant_name,
              "password": password}
 
-    admin_ip = urlparse(fuel_url).hostname
-    fuel = KeystoneAuth(fuel_url, creds, headers=None, echo=None,
-                        admin_node_ip=admin_ip)
+    fuel = KeystoneAuth(fuel_url, creds, headers=None, echo=None,)
+    cluster_id = get_cluster_id(cluster_name, fuel)
     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]
@@ -33,7 +75,9 @@
     nodes, to_clean = run_agent(ips, roles, host, tmp_file)
     nodes = [Node(node[0], node[1]) for node in nodes]
 
-    return nodes, to_clean
+    openrc_dict = get_openrc(nodes)
+
+    return nodes, to_clean, openrc_dict
 
 
 def discover_fuel_nodes_clean(fuel_url, ssh_creds, nodes, base_port=12345):
@@ -102,9 +146,9 @@
                       + ":" + fuel_id_rsa_path, role))
 
     ssh.close()
-    print 'Files has been transfered successefully to Fuel node, ' \
-          'agent has been launched'
-    print nodes
+    logger.info('Files has been transferred successfully to Fuel node, ' \
+                'agent has been launched')
+    logger.info("Nodes : " + str(nodes))
 
     return nodes, nodes_to_clean
 
@@ -115,11 +159,11 @@
     parser.add_argument(
         "--fuel_url", required=True)
     parser.add_argument(
-        "--cluster_id", required=True)
+        "--cluster_name", required=True)
     parser.add_argument(
         "--iface", default="eth1")
     parser.add_argument(
-        "--creds", default="admin:admin:admin")
+        "--creds", default="admin:admin@admin")
 
     return parser.parse_args(argv)
 
@@ -128,7 +172,7 @@
     args = parse_command_line(argv)
 
     nodes, to_clean = discover_fuel_nodes(args.fuel_url,
-                                          args.creds, args.cluster_id)
+                                          args.creds, args.cluster_name)
     discover_fuel_nodes_clean(args.fuel_url, {"username": "root",
                                               "password": "test37",
                                               "port": 22}, to_clean)
