aboutsummaryrefslogtreecommitdiffstats
path: root/qtip/util/env.py
diff options
context:
space:
mode:
Diffstat (limited to 'qtip/util/env.py')
-rw-r--r--qtip/util/env.py137
1 files changed, 137 insertions, 0 deletions
diff --git a/qtip/util/env.py b/qtip/util/env.py
new file mode 100644
index 00000000..4e7a31c7
--- /dev/null
+++ b/qtip/util/env.py
@@ -0,0 +1,137 @@
+##############################################################################
+# Copyright (c) 2016 Dell Inc, ZTE and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+import os
+import paramiko
+import socket
+import time
+from os import path
+from os.path import expanduser
+
+SCRIPT_DIR = path.join(path.dirname(__file__), path.pardir, 'scripts')
+CONFIG_DIR = path.join(path.dirname(__file__), path.pardir, path.pardir,
+ 'config')
+PRIVATE_KEY = CONFIG_DIR + '/QtipKey'
+PUBLIC_KEY = CONFIG_DIR + '/QtipKey.pub'
+IPS_FILE = expanduser('~') + "/qtip/ips.log"
+HOST_FILE = CONFIG_DIR + "/host"
+
+
+def fetch_compute_ips_via_installer():
+ clean_file(IPS_FILE)
+
+ installer_type = str(os.environ['INSTALLER_TYPE'].lower())
+ installer_ip = str(os.environ['INSTALLER_IP'])
+ if installer_type not in ["fuel"]:
+ raise RuntimeError("%s is not supported" % installer_type)
+ if not installer_ip:
+ raise RuntimeError("undefine environment variable INSTALLER_IP")
+
+ cmd = "bash %s/fetch_compute_ips.sh -i %s -a %s" % \
+ (SCRIPT_DIR, installer_type, installer_ip)
+ os.system(cmd)
+ if path.isfile(IPS_FILE):
+ return True
+ else:
+ return False
+
+
+def parse_ips():
+ ip_list = []
+ with open(IPS_FILE, "r") as outfile:
+ data = outfile.read()
+ if data:
+ ip_list.extend(data.rstrip('\n').split('\n'))
+ return ip_list
+
+
+def ssh_test(ip):
+ os.system('ssh-keyscan %s >> /root/.ssh/known_hosts' % ip)
+ time.sleep(2)
+
+ ssh_cmd = '%s/qtip_creds.sh %s' % (SCRIPT_DIR, ip)
+ os.system(ssh_cmd)
+
+ ssh = paramiko.SSHClient()
+ ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+ ssh.connect(ip, key_filename='{0}/QtipKey'.format(CONFIG_DIR))
+
+ for attempts in range(100):
+ try:
+ stdin, stdout, stderr = ssh.exec_command('uname')
+ if not stderr.readlines():
+ print("{0}: SSH test successful")
+ return True
+ except socket.error:
+ if attempts == 99:
+ return False
+ time.sleep(2)
+
+
+def ping_test(ip, attempts=30):
+ ping_cmd = 'ping -D -c1 {0}'.format(ip)
+ for i in range(attempts):
+ if os.system(ping_cmd):
+ print('\nWaiting for machine\n')
+ time.sleep(10)
+ else:
+ print('\n\n %s is UP \n\n ' % ip)
+ return True
+ if i == 29:
+ return False
+
+
+def check_nodes_connectivity():
+ ip_list = parse_ips()
+ for ip in ip_list:
+ if not ping_test(ip):
+ raise RuntimeError("{0}: Ping test failed".format(ip))
+ if not ssh_test(ip):
+ raise RuntimeError("{0}: SSH test failed".format(ip))
+
+
+def generate_host_file():
+ ip_list = parse_ips()
+ with open(HOST_FILE, 'w') as host_file:
+ for index, item in enumerate(ip_list):
+ host_file.write("[host_{0}]\n".format(index))
+ host_file.write(item + '\n')
+
+
+def generate_keypair():
+ """Generating ssh keypair"""
+ if not clean_keypair():
+ raise RuntimeError("Cann't remove old keypair")
+
+ cmd = "ssh-keygen -t rsa -N "" -f {0} -q".format(PRIVATE_KEY)
+ os.system(cmd)
+
+ if path.isfile(PRIVATE_KEY) and path.isfile(PUBLIC_KEY):
+ return True
+ else:
+ return False
+
+
+def clean_file(file_path):
+ try:
+ if path.isfile(file_path):
+ os.remove(file_path)
+ print("Removed: " + file_path)
+ else:
+ print("Not exists: " + file_path)
+ except OSError, error:
+ print("Not able to Remove: " + file_path, error)
+ return False
+ return True
+
+
+def clean_keypair():
+ flag = True
+ flag &= clean_file(PRIVATE_KEY)
+ flag &= clean_file(PUBLIC_KEY)
+ return flag