aboutsummaryrefslogtreecommitdiffstats
path: root/func
diff options
context:
space:
mode:
Diffstat (limited to 'func')
-rw-r--r--func/args_handler.py59
-rw-r--r--func/cli.py81
-rw-r--r--func/driver.py95
-rw-r--r--func/env_setup.py59
-rwxr-xr-xfunc/fetch_compute_ips.sh117
5 files changed, 300 insertions, 111 deletions
diff --git a/func/args_handler.py b/func/args_handler.py
new file mode 100644
index 00000000..f2726eb8
--- /dev/null
+++ b/func/args_handler.py
@@ -0,0 +1,59 @@
+##############################################################################
+# Copyright (c) 2016 ZTE Corp 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
+from func.env_setup import Env_setup
+from func.spawn_vm import SpawnVM
+from func.driver import Driver
+
+
+def get_files_in_test_list(suit_name):
+ with open('test_list/' + suit_name, 'r') as fin_put:
+ benchmark_list = fin_put.readlines()
+ return map(lambda x: x.rstrip(), benchmark_list)
+
+
+def get_files_in_test_case(lab, suit_name):
+ return os.listdir('./test_cases/{0}/{1}'.format(lab, suit_name))
+
+
+def get_benchmark_path(lab, suit, benchmark):
+ return './test_cases/{0}/{1}/{2}'.format(lab, suit, benchmark)
+
+
+def check_suit_in_test_list(suit_name):
+ return True if os.path.isfile('test_list/' + suit_name) else False
+
+
+def check_lab_name(lab_name):
+ return True if os.path.isdir('test_cases/' + lab_name) else False
+
+
+def _get_f_name(test_case_path):
+ return test_case_path.split('/')[-1]
+
+
+def prepare_ansible_env(benchmark_test_case):
+ env_setup = Env_setup()
+ [benchmark, vm_info, benchmark_details, proxy_info] = env_setup.parse(benchmark_test_case)
+ SpawnVM(vm_info) if len(vm_info) else None
+ env_setup.call_ping_test()
+ env_setup.call_ssh_test()
+ env_setup.update_ansible()
+ return benchmark, benchmark_details, proxy_info, env_setup
+
+
+def run_benchmark(benchmark, benchmark_details, proxy_info, env_setup, benchmark_test_case):
+ driver = Driver()
+ driver.drive_bench(benchmark, env_setup.roles_dict.items(), _get_f_name(benchmark_test_case),
+ benchmark_details, env_setup.ip_pw_dict.items(), proxy_info)
+
+
+def prepare_and_run_benchmark(benchmark_test_case):
+ benchmark, benchmark_details, proxy_info, env_setup = prepare_ansible_env(benchmark_test_case)
+ run_benchmark(benchmark, benchmark_details, proxy_info, env_setup, benchmark_test_case)
diff --git a/func/cli.py b/func/cli.py
index 4613b507..01694a9b 100644
--- a/func/cli.py
+++ b/func/cli.py
@@ -8,50 +8,13 @@
##############################################################################
import sys
-import os
-from func.env_setup import Env_setup
-from func.driver import Driver
-from func.spawn_vm import SpawnVM
+import args_handler
import argparse
class cli:
@staticmethod
- def _getfile(file_path):
- with open('test_list/' + file_path, 'r') as fin_put:
- _benchmarks = fin_put.readlines()
- for items in range(len(_benchmarks)):
- _benchmarks[items] = _benchmarks[items].rstrip()
- return _benchmarks
-
- @staticmethod
- def _getsuite(file_path):
-
- return file_path
-
- @staticmethod
- def _check_test_list(filename):
-
- if os.path.isfile('test_list/' + filename):
- return True
- else:
- return False
-
- @staticmethod
- def _check_lab_name(lab_name):
-
- if os.path.isdir('test_cases/' + lab_name):
- return True
- else:
- return False
-
- @staticmethod
- def _get_f_name(file_name):
-
- return file_name[0: file_name.find('.')]
-
- @staticmethod
def _parse_args(args):
parser = argparse.ArgumentParser()
parser.add_argument('-l ', '--lab', required=True, help='Name of Lab '
@@ -72,40 +35,22 @@ class cli:
def __init__(self, args=sys.argv[1:]):
- suite = []
args = self._parse_args(args)
-
- if not self._check_test_list(args.file):
+ if not args_handler.check_suit_in_test_list(args.file):
print '\n\n ERROR: Test File Does not exist in test_list/ please enter correct file \n\n'
sys.exit(0)
- if not self._check_lab_name(args.lab):
- print '\n\n You have specified a lab that is not present in test_cases/ please enter correct \
- file. If unsure how to proceed, use -l default.\n\n'
+ if not args_handler.check_lab_name(args.lab):
+ print '\n\n You have specified a lab that is not present in test_cases/ please enter \
+ correct file. If unsure how to proceed, use -l default.\n\n'
sys.exit(0)
+ suite = args.file
+ benchmarks = args_handler.get_files_in_test_list(suite)
+ test_cases = args_handler.get_files_in_test_case(args.lab, suite)
+ benchmarks_list = filter(lambda x: x in test_cases, benchmarks)
- benchmarks = self._getfile(args.file)
- suite.append(args.file)
- suite = self._getsuite(suite)
- for items in range(len(benchmarks)):
- if suite and benchmarks:
- obj = Env_setup()
- if os.path.isfile('./test_cases/' + args.lab.lower() + '/' + suite[0] + '/' + benchmarks[items]):
- [benchmark, vm_info, benchmark_details, proxy_info] = \
- obj.parse('./test_cases/' + args.lab.lower() + '/' + suite[0] + '/' + benchmarks[items])
+ map(lambda x: args_handler.prepare_and_run_benchmark(
+ args_handler.get_benchmark_path(args.lab.lower(), suite, x)), benchmarks_list)
- if len(vm_info) != 0:
- SpawnVM(vm_info)
- obj.call_ping_test()
- obj.call_ssh_test()
- obj.update_ansible()
- dvr = Driver()
- dvr.drive_bench(benchmark,
- obj.roles_dict.items(),
- self._get_f_name(benchmarks[items]),
- benchmark_details,
- obj.ip_pw_dict.items(),
- proxy_info)
- else:
- print (benchmarks[items], ' is not a Template in the Directory - \
- Enter a Valid file name. or use qtip.py -h for list')
+ print('{0} is not a Template in the Directory Enter a Valid file name.'
+ 'or use qtip.py -h for list'.format(filter(lambda x: x not in test_cases, benchmarks)))
diff --git a/func/driver.py b/func/driver.py
index 33dbe320..f26f63db 100644
--- a/func/driver.py
+++ b/func/driver.py
@@ -8,53 +8,66 @@
##############################################################################
import os
import json
-from collections import defaultdict
+import logging
class Driver:
def __init__(self):
- print "Class driver initialized\n"
- print os.environ['PWD']
- self.dic_json = defaultdict()
+ logging.info("Class driver initialized\n")
+ self.installer_username = {'fuel': 'root',
+ 'joid': 'ubuntu',
+ 'apex': 'heat-admin'}
- def drive_bench(self, benchmark, roles, benchmark_fname, benchmark_detail=None, pip_dict=None, proxy_info=None):
+ @staticmethod
+ def merge_two_dicts(x, y):
+ '''
+ It is from http://stackoverflow.com/questions/38987/
+ how-can-i-merge-two-python-dictionaries-in-a-single-expression
+ '''
+ z = x.copy()
+ z.update(y)
+ return z
+
+ def get_common_var_json(self, benchmark_fname, benchmark_detail, pip_dict, proxy_info):
+ common_json = {'Dest_dir': 'results',
+ 'ip1': '',
+ 'ip2': '',
+ 'installer': str(os.environ['INSTALLER_TYPE']),
+ 'workingdir': str(os.environ['PWD']),
+ 'fname': str(benchmark_fname),
+ 'username': self.installer_username[str(os.environ['INSTALLER_TYPE'])]}
+ common_json.update(benchmark_detail) if benchmark_detail else None
+ common_json.update(proxy_info) if proxy_info else None
+ return common_json
+
+ def get_special_var_json(self, role, roles, benchmark_detail, pip_dict):
+ special_json = {}
+ index = roles.index(role) + 1
+ special_json.update({'role': role[0]})
+ private_ip = pip_dict[0][1] if pip_dict[0][1][0] else 'NONE'
+ map(lambda x: special_json.update({'ip' + str(index): x}), role[1])\
+ if benchmark_detail and (role[0] == '1-server') else None
+ map(lambda x: special_json.update({'privateip' + str(index): private_ip}), role[1])\
+ if benchmark_detail and (role[0] == '1-server') else None
+ return special_json
+
+ def run_ansible_playbook(self, benchmark, extra_vars):
+ extra_vars_json = json.dumps(dict(extra_vars.items()))
+ logging.info(extra_vars_json)
+ run_play = 'ansible-playbook ./benchmarks/playbooks/{0}.yaml' \
+ '--private-key=./data/QtipKey -i ./data/hosts --extra-vars \'{1}\'' \
+ .format(benchmark, extra_vars_json)
+ os.system(run_play)
+
+ def drive_bench(self, benchmark, roles, benchmark_fname,
+ benchmark_detail=None, pip_dict=None, proxy_info=None):
roles = sorted(roles)
pip_dict = sorted(pip_dict)
- result_dir = 'results'
- benchmark_name = benchmark + '.yaml'
- self.dic_json['Dest_dir'] = str(result_dir)
- self.dic_json['ip1'] = ''
- self.dic_json['ip2'] = ''
- self.dic_json['installer'] = str(os.environ['INSTALLER_TYPE'])
- self.dic_json['workingdir'] = str(os.environ['PWD'])
- self.dic_json['fname'] = str(benchmark_fname)
- self.dic_json['username'] = str('root')
-
- for key in proxy_info.keys():
- self.dic_json[key] = proxy_info[key]
-
- if os.environ['INSTALLER_TYPE'] == str('joid'):
- self.dic_json['username'] = str('ubuntu')
- if os.environ['INSTALLER_TYPE'] == str('apex'):
- self.dic_json['username'] = str('heat-admin')
- for k, v in benchmark_detail:
- self.dic_json[k] = v
- for k, v in roles:
- self.dic_json['role'] = k
- index = 1
- if benchmark_detail is not None:
- for values in v:
- if k == '1-server':
- print values, 'saving IP'
- self.dic_json['ip' + str(index)] = str(values)
- if pip_dict[0][1][0]:
- self.dic_json['privateip' + str(index)] = pip_dict[0][1]
- if not pip_dict[0][1][0]:
- self.dic_json['privateip' + str(index)] = 'NONE'
- index = index + 1
- dic_json = json.dumps(dict(self.dic_json.items()))
- print dic_json
- run_play = 'ansible-playbook ./benchmarks/playbooks/{0} --private-key=./data/QtipKey -i ./data/hosts --extra-vars \'{1}\''.format(benchmark_name, dic_json)
- os.system(run_play)
+ var_json = self.get_common_var_json(benchmark_fname, benchmark_detail, pip_dict, proxy_info)
+ map(lambda role: self.run_ansible_playbook
+ (benchmark, self.merge_two_dicts(var_json,
+ self.get_special_var_json(role, roles,
+ benchmark_detail,
+ pip_dict))), roles)
diff --git a/func/env_setup.py b/func/env_setup.py
index f59883a0..1f86f0ea 100644
--- a/func/env_setup.py
+++ b/func/env_setup.py
@@ -1,5 +1,5 @@
##############################################################################
-# Copyright (c) 2015 Dell Inc and others.
+# 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
@@ -14,9 +14,16 @@ import yaml
import time
import paramiko
import socket
+from os.path import expanduser
+import random
+import logging
+
+LOG = logging.getLogger(__name__)
+LOG.setLevel(logging.DEBUG)
class Env_setup:
+
roles_ip_list = [] # ROLE and its corresponding IP address list
ip_pw_list = [] # IP and password, this will be used to ssh
roles_dict = defaultdict(list)
@@ -112,10 +119,58 @@ class Env_setup:
break
print ('\n\n %s is UP \n\n ' % ipvar)
- def get_host_machine_info(self, host_tag):
+ @staticmethod
+ def fetch_compute_ips():
+ LOG.info("Fetch compute ips through installer")
+ ips = []
+
+ installer_type = os.environ['INSTALLER_TYPE']
+ installer_ip = os.environ['INSTALLER_IP']
+ if installer_type.down.lower() != "fuel" or "compass":
+ raise RuntimeError("%s is not supported" % installer_type)
+ if installer_ip:
+ raise RuntimeError("undefine environment variable INSTALLER_IP")
+
+ cmd = "bash ./fetch_compute_ip.sh -i %s -a %s" % \
+ (installer_type, installer_ip)
+ os.system(cmd)
+ home = expanduser("~")
+ os.chdir(home)
+ with open("ips.log", "r") as file:
+ data = file.read()
+ if data:
+ ips.extend(data.rstrip('\n').split('\n'))
+ LOG.info("All compute ips: %s" % ips)
+ return ips
+
+ def check_machine_ips(self, host_tag):
+ LOG.info("Check machine ips")
+ ips = self.fetch_compute_ips()
+ ips_num = len(ips)
+ num = len(host_tag)
+ if num > ips_num:
+ err = "host num %s > compute ips num %s" % (num, ips_num)
+ raise RuntimeError(err)
+ for x in range(num):
+ hostlabel = 'machine_' + str(x + 1)
+ if host_tag[hostlabel]['ip']:
+ if host_tag[hostlabel]['ip'] in ips:
+ info = "%s's ip %s is defined by test case yaml file" % \
+ (hostlabel, host_tag[hostlabel]['ip'])
+ LOG.info(info)
+ else:
+ err = "%s is not in %s" % (host_tag[hostlabel]['ip'], ips)
+ raise RuntimeError(err)
+ else:
+ host_tag[hostlabel]['ip'] = random.choice(ips)
+ info = "assign ip %s to %s" % (host_tag[hostlabel]['ip'], hostlabel)
+ ips.remove(host_tag[hostlabel]['ip'])
+
+ def get_host_machine_info(self, host_tag):
num = len(host_tag)
offset = len(self.roles_ip_list)
+ self.check_machine_ips(host_tag)
for x in range(num):
hostlabel = 'machine_' + str(x + 1)
self.roles_ip_list.insert(
diff --git a/func/fetch_compute_ips.sh b/func/fetch_compute_ips.sh
new file mode 100755
index 00000000..c1cc4c6e
--- /dev/null
+++ b/func/fetch_compute_ips.sh
@@ -0,0 +1,117 @@
+#!/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 <installer_type> -a <installer_ip>" >&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
+whilegetopts ":d: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<NF;i++)if($i~/\"host[4-5]\"/) {print $(i+1);}}' \
+ | grep -oP "\d+.\d+.\d+.\d+")
+
+elif[ "$installer_type" == "joid" ]; then
+ echo "not implement now"
+ exit 1
+
+elif[ "$installer_type" == "foreman" ]; then
+ echo "not implement now"
+ exit 1
+
+else
+ error "Installer $installer is not supported by this script"
+fi
+
+if[ -z $IPS ]; then
+ error "The compute node $IPS are not up. Please check that the POD is correctly deployed."
+else
+ echo "-------- all compute node ips: --------"
+ touch $HOME/ips.log
+ echo "$IPS" > $HOME/ips.log
+ echo $IPS
+fi
+
+exit0