From cf7acd2b1f054c220da1a1582a005035bfd92a56 Mon Sep 17 00:00:00 2001 From: "wu.zhihui" Date: Thu, 19 Jan 2017 15:49:10 +0800 Subject: refactor useful legacy code about preparing test enviroment - move useful scripts to qtip/scripts - refactor some functions which belong to env_setup.py and add them to qtip/runner/env.py Change-Id: Ibf6c27103dfc45016920f4b602cd72d703c1f636 Signed-off-by: wu.zhihui --- legacy/scripts/fetch_compute_ips.sh | 117 ------------------------------ legacy/scripts/qtip_creds.sh | 30 -------- qtip/scripts/fetch_compute_ips.sh | 117 ++++++++++++++++++++++++++++++ qtip/scripts/qtip_creds.sh | 30 ++++++++ qtip/util/env.py | 137 ++++++++++++++++++++++++++++++++++++ 5 files changed, 284 insertions(+), 147 deletions(-) delete mode 100755 legacy/scripts/fetch_compute_ips.sh delete mode 100755 legacy/scripts/qtip_creds.sh create mode 100755 qtip/scripts/fetch_compute_ips.sh create mode 100755 qtip/scripts/qtip_creds.sh create mode 100644 qtip/util/env.py diff --git a/legacy/scripts/fetch_compute_ips.sh b/legacy/scripts/fetch_compute_ips.sh deleted file mode 100755 index 4bdc9a48..00000000 --- a/legacy/scripts/fetch_compute_ips.sh +++ /dev/null @@ -1,117 +0,0 @@ -#!/bin/bash -############################################################################## -#Copyright (c) 2016 Ericsson AB, ZTE and others. -#jose.lausuch@ericsson.com -#wu.zhihui1@zte.com.cn -#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 -############################################################################## - - -usage(){ - echo "usage: $0 [-v] -i -a " >&2 - echo "[-v] Virtualized deployment" >&2 -} - -info() { - logger -s -t "fetch_compute_info.info" "$*" -} - - -error() { - logger -s -t "fetch_compute_info.error" "$*" - exit 1 -} - -verify_connectivity(){ - local ip=$1 - info "Verifying connectivity to $ip..." - for i in $(seq 0 10); do - if ping -c 1 -W 1 $ip > /dev/null; then - info "$ip is reachable!" - return 0 - fi - sleep 1 - done - error "Can not talk to $ip." -} - -:${DEPLOY_TYPE:=''} - -#Getoptions -while getopts ":i:a:h:v" optchar; do - case "${optchar}" in - i) installer_type=${OPTARG} ;; - a) installer_ip=${OPTARG} ;; - v) DEPLOY_TYPE="virt" ;; - *) echo "Non-option argument: '-${OPTARG}'" >&2 - usage - exit 2 - ;; - esac -done - -#set vars from env if not provided by user as options -installer_type=${installer_type:-$INSTALLER_TYPE} -installer_ip=${installer_ip:-$INSTALLER_IP} - -if [ -z $installer_type ] || [ -z $installer_ip ]; then - usage - exit 2 -fi - -ssh_options="-oUserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" - -#Start fetching compute ip -if [ "$installer_type" == "fuel" ]; then - verify_connectivity $installer_ip - - env=$(sshpass -p r00tme ssh 2>/dev/null $ssh_options root@${installer_ip} \ - 'fuel env'|grep operational|head -1|awk '{print $1}') &> /dev/null - if [ -z $env ]; then - error "No operational environment detected in Fuel" - fi - env_id="${FUEL_ENV:-$env}" - - # Check if compute is alive (online='True') - IPS=$(sshpass -p r00tme ssh 2>/dev/null $ssh_options root@${installer_ip} \ - "fuel node --env ${env_id} | grep compute | grep 'True\| 1' | awk -F\| '{print \$5}' " | \ - sed 's/ //g') &> /dev/null - - -elif [ "$installer_type" == "apex" ]; then - echo "not implement now" - exit 1 - -elif [ "$installer_type" == "compass" ]; then - # need test - verify_connectivity $installer_ip - IPS=$(sshpass -p'root' ssh 2>/dev/null $ssh_options root@${installer_ip} \ - 'mysql -ucompass -pcompass -Dcompass -e"select * from cluster;"' \ - | awk -F"," '{for(i=1;i $HOME/qtip/ips.log - echo $IPS -fi - -exit 0 diff --git a/legacy/scripts/qtip_creds.sh b/legacy/scripts/qtip_creds.sh deleted file mode 100755 index af051ac5..00000000 --- a/legacy/scripts/qtip_creds.sh +++ /dev/null @@ -1,30 +0,0 @@ -#! /bin/bash - -DEST_IP=$1 -echo $INSTALLER_TYPE -echo $INSTALLER_IP -sshoptions="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" -case "$INSTALLER_TYPE" in - apex) - scp $sshoptions -i $APEX_KEY ./config/QtipKey.pub stack@$INSTALLER_IP:/home/stack - scp $sshoptions -i $APEX_KEY ./config/QtipKey stack@$INSTALLER_IP:/home/stack - ssh $sshoptions -i $APEX_KEY stack@$INSTALLER_IP "ssh-copy-id $sshoptions -i /home/stack/QtipKey.pub heat-admin@$DEST_IP && rm -rf /home/stack/QtipKey && rm -rf /home/stack/QtipKey.pub" - ;; - fuel) - PSWD="r00tme" - sshpass -p $PSWD scp $sshoptions ./config/QtipKey.pub root@$INSTALLER_IP:/root - sshpass -p $PSWD scp $sshoptions ./config/QtipKey root@$INSTALLER_IP:/root - sshpass -p $PSWD ssh $sshoptions root@$INSTALLER_IP "grep -q '\-F /dev/null ' /usr/bin/ssh-copy-id || sed -i 's/\(ssh -i.*$\)/\1\n -F \/dev\/null \\\/g' `which ssh-copy-id`" - sshpass -p $PSWD ssh $sshoptions root@$INSTALLER_IP "ssh-copy-id $sshoptions -i /root/QtipKey root@$DEST_IP && rm -rf /root/QtipKey && rm -rf /root/QtipKey.pub" - ;; - compass) - PSWD="root" - sshpass -p $PSWD scp $sshoptions ./config/QtipKey.pub root@$INSTALLER_IP:/root - sshpass -p $PSWD scp $sshoptions ./config/QtipKey root@$INSTALLER_IP:/root - sshpass -p $PSWD ssh $sshoptions root@$INSTALLER_IP "ssh-copy-id $sshoptions -i /root/QtipKey.pub root@$DEST_IP && rm -rf /root/QtipKey && rm -rf /root/QtipKey.pub" - ;; - joid) - PSWD="joid";; - *) - echo "Unkown installer $INSTALLER_TYPE specified";; -esac diff --git a/qtip/scripts/fetch_compute_ips.sh b/qtip/scripts/fetch_compute_ips.sh new file mode 100755 index 00000000..a2618ec9 --- /dev/null +++ b/qtip/scripts/fetch_compute_ips.sh @@ -0,0 +1,117 @@ +#!/bin/bash +############################################################################## +#Copyright (c) 2016 Ericsson AB, ZTE and others. +#jose.lausuch@ericsson.com +#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 +############################################################################## + + +usage(){ + echo "usage: $0 [-v] -i -a " >&2 + echo "[-v] Virtualized deployment" >&2 +} + +info() { + logger -s -t "fetch_compute_info.info" "$*" +} + + +error() { + logger -s -t "fetch_compute_info.error" "$*" + exit 1 +} + +verify_connectivity(){ + local ip=$1 + info "Verifying connectivity to $ip..." + for i in $(seq 0 10); do + if ping -c 1 -W 1 $ip > /dev/null; then + info "$ip is reachable!" + return 0 + fi + sleep 1 + done + error "Can not talk to $ip." +} + +:${DEPLOY_TYPE:=''} + +#Getoptions +while getopts ":i:a:h:v" optchar; do + case "${optchar}" in + i) installer_type=${OPTARG} ;; + a) installer_ip=${OPTARG} ;; + v) DEPLOY_TYPE="virt" ;; + *) echo "Non-option argument: '-${OPTARG}'" >&2 + usage + exit 2 + ;; + esac +done + +#set vars from env if not provided by user as options +installer_type=${installer_type:-$INSTALLER_TYPE} +installer_ip=${installer_ip:-$INSTALLER_IP} + +if [ -z $installer_type ] || [ -z $installer_ip ]; then + usage + exit 2 +fi + +ssh_options="-oUserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" + +#Start fetching compute ip +if [ "$installer_type" == "fuel" ]; then + verify_connectivity $installer_ip + + env=$(sshpass -p r00tme ssh 2>/dev/null $ssh_options root@${installer_ip} \ + 'fuel env'|grep operational|head -1|awk '{print $1}') &> /dev/null + if [ -z $env ]; then + error "No operational environment detected in Fuel" + fi + env_id="${FUEL_ENV:-$env}" + + # Check if compute is alive (online='True') + IPS=$(sshpass -p r00tme ssh 2>/dev/null $ssh_options root@${installer_ip} \ + "fuel node --env ${env_id} | grep compute | grep 'True\| 1' | awk -F\| '{print \$5}' " | \ + sed 's/ //g') &> /dev/null + + +elif [ "$installer_type" == "apex" ]; then + echo "not implement now" + exit 1 + +elif [ "$installer_type" == "compass" ]; then + # need test + verify_connectivity $installer_ip + IPS=$(sshpass -p'root' ssh 2>/dev/null $ssh_options root@${installer_ip} \ + 'mysql -ucompass -pcompass -Dcompass -e"select * from cluster;"' \ + | awk -F"," '{for(i=1;i $HOME/qtip/ips.log + echo $IPS +fi + +exit 0 diff --git a/qtip/scripts/qtip_creds.sh b/qtip/scripts/qtip_creds.sh new file mode 100755 index 00000000..af051ac5 --- /dev/null +++ b/qtip/scripts/qtip_creds.sh @@ -0,0 +1,30 @@ +#! /bin/bash + +DEST_IP=$1 +echo $INSTALLER_TYPE +echo $INSTALLER_IP +sshoptions="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" +case "$INSTALLER_TYPE" in + apex) + scp $sshoptions -i $APEX_KEY ./config/QtipKey.pub stack@$INSTALLER_IP:/home/stack + scp $sshoptions -i $APEX_KEY ./config/QtipKey stack@$INSTALLER_IP:/home/stack + ssh $sshoptions -i $APEX_KEY stack@$INSTALLER_IP "ssh-copy-id $sshoptions -i /home/stack/QtipKey.pub heat-admin@$DEST_IP && rm -rf /home/stack/QtipKey && rm -rf /home/stack/QtipKey.pub" + ;; + fuel) + PSWD="r00tme" + sshpass -p $PSWD scp $sshoptions ./config/QtipKey.pub root@$INSTALLER_IP:/root + sshpass -p $PSWD scp $sshoptions ./config/QtipKey root@$INSTALLER_IP:/root + sshpass -p $PSWD ssh $sshoptions root@$INSTALLER_IP "grep -q '\-F /dev/null ' /usr/bin/ssh-copy-id || sed -i 's/\(ssh -i.*$\)/\1\n -F \/dev\/null \\\/g' `which ssh-copy-id`" + sshpass -p $PSWD ssh $sshoptions root@$INSTALLER_IP "ssh-copy-id $sshoptions -i /root/QtipKey root@$DEST_IP && rm -rf /root/QtipKey && rm -rf /root/QtipKey.pub" + ;; + compass) + PSWD="root" + sshpass -p $PSWD scp $sshoptions ./config/QtipKey.pub root@$INSTALLER_IP:/root + sshpass -p $PSWD scp $sshoptions ./config/QtipKey root@$INSTALLER_IP:/root + sshpass -p $PSWD ssh $sshoptions root@$INSTALLER_IP "ssh-copy-id $sshoptions -i /root/QtipKey.pub root@$DEST_IP && rm -rf /root/QtipKey && rm -rf /root/QtipKey.pub" + ;; + joid) + PSWD="joid";; + *) + echo "Unkown installer $INSTALLER_TYPE specified";; +esac 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 -- cgit 1.2.3-korg