summaryrefslogtreecommitdiffstats
path: root/ci
diff options
context:
space:
mode:
Diffstat (limited to 'ci')
-rw-r--r--ci/exec_test.sh208
-rw-r--r--ci/prepare_env.py11
-rw-r--r--ci/run_tests.py134
-rw-r--r--ci/testcases.yaml37
-rw-r--r--ci/tier_builder.py21
-rw-r--r--ci/tier_handler.py33
6 files changed, 409 insertions, 35 deletions
diff --git a/ci/exec_test.sh b/ci/exec_test.sh
new file mode 100644
index 000000000..2e16fbb3f
--- /dev/null
+++ b/ci/exec_test.sh
@@ -0,0 +1,208 @@
+#!/bin/bash
+
+#
+# Author: Jose Lausuch (jose.lausuch@ericsson.com)
+# Morgan Richomme (morgan.richomme@orange.com)
+# Installs the Functest framework within the Docker container
+# and run the tests automatically
+#
+#
+# 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="Script to trigger the tests automatically.
+
+usage:
+ bash $(basename "$0") [-h|--help] [-t <test_name>]
+
+where:
+ -h|--help show this help text
+ -r|--report push results to database (false by default)
+ -s|--serial run Tempest tests in one thread
+ -t|--test run specific test case
+ <test_name>"
+
+
+report=""
+serial=false
+
+# Get the list of runnable tests
+# Check if we are in CI mode
+debug=""
+if [[ "${CI_DEBUG,,}" == "true" ]];then
+ debug="--debug"
+fi
+
+FUNCTEST_REPO_DIR=${repos_dir}/functest/
+FUNCTEST_CONF_DIR=/home/opnfv/functest/conf/
+
+
+function odl_tests(){
+ keystone_ip=$(openstack catalog show identity |grep publicURL| cut -f3 -d"/" | cut -f1 -d":")
+ # historically most of the installers use the same IP for neutron and keystone API
+ neutron_ip=$keystone_ip
+ odl_ip=$(openstack catalog show network | grep publicURL | cut -f3 -d"/" | cut -f1 -d":")
+ usr_name=$(env | grep OS | grep OS_USERNAME | cut -f2 -d'=')
+ password=$(env | grep OS | grep OS_PASSWORD | cut -f2 -d'=')
+ odl_port=8181
+ if [ $INSTALLER_TYPE == "fuel" ]; then
+ odl_port=8282
+ elif [ $INSTALLER_TYPE == "apex" ]; then
+ :
+ elif [ $INSTALLER_TYPE == "joid" ]; then
+ odl_ip=$(env | grep SDN_CONTROLLER | cut -f2 -d'=')
+ neutron_ip=$(openstack catalog show network | grep publicURL | cut -f3 -d"/" | cut -f1 -d":")
+ odl_port=8080
+ :
+ elif [ $INSTALLER_TYPE == "compass" ]; then
+ :
+ else
+ error "INSTALLER_TYPE not valid."
+ exit 1
+ fi
+}
+function run_test(){
+ test_name=$1
+ echo -e "\n\n\n\n"
+ echo "----------------------------------------------"
+ echo " Running test case: ${test_name}"
+ echo "----------------------------------------------"
+ echo ""
+ serial_flag=""
+ if [ $serial == "true" ]; then
+ serial_flag="-s"
+ fi
+
+ case $test_name in
+ "healthcheck")
+ echo "Running health check test..."
+ ${FUNCTEST_REPO_DIR}/testcases/VIM/OpenStack/CI/libraries/healthcheck.sh
+ ;;
+ "vping_ssh")
+ echo "Running vPing-SSH test..."
+ python ${FUNCTEST_REPO_DIR}/testcases/vPing/CI/libraries/vPing_ssh.py \
+ $debug $report
+ ;;
+ "vping_userdata")
+ echo "Running vPing-userdata test... "
+ python ${FUNCTEST_REPO_DIR}/testcases/vPing/CI/libraries/vPing_userdata.py \
+ $debug $report
+ ;;
+ "odl")
+ echo "Running ODL test..."
+ odl_tests
+ ODL_PORT=$odl_port ODL_IP=$odl_ip KEYSTONE_IP=$keystone_ip NEUTRON_IP=$neutron_ip USR_NAME=$usr_name PASS=$password \
+ ${FUNCTEST_REPO_DIR}/testcases/Controllers/ODL/CI/start_tests.sh
+
+ # push results to the DB in case of CI
+ if [[ -n "$DEPLOY_SCENARIO" && "$DEPLOY_SCENARIO" != "none" ]]; then
+ odl_logs="/home/opnfv/functest/results/odl/logs/2"
+ odl_path="${FUNCTEST_REPO_DIR}/testcases/Controllers/ODL/CI"
+ node_name=$(env | grep NODE_NAME | cut -f2 -d'=')
+ python ${odl_path}/odlreport2db.py -x ${odl_logs}/output.xml -i ${INSTALLER_TYPE} -p ${node_name} -s ${DEPLOY_SCENARIO}
+ fi
+ ;;
+ "tempest")
+ echo "Running Tempest tests..."
+ python ${FUNCTEST_REPO_DIR}/testcases/VIM/OpenStack/CI/libraries/run_tempest.py \
+ $debug $serial_flag $clean_flag -m smoke $report
+ # save tempest.conf for further troubleshooting
+ tempest_conf="${RALLY_VENV_DIR}/tempest/for-deployment-*/tempest.conf"
+ if [ -f ${tempest_conf} ]; then
+ cp $tempest_conf ${FUNCTEST_CONF_DIR}
+ fi
+ ;;
+ "vims")
+ echo "Running vIMS test..."
+ python ${FUNCTEST_REPO_DIR}/testcases/vIMS/CI/vIMS.py \
+ $debug $clean_flag $report
+ ;;
+ "rally")
+ echo "Running Rally benchmark suite..."
+ python ${FUNCTEST_REPO_DIR}/testcases/VIM/OpenStack/CI/libraries/run_rally-cert.py \
+ $debug $clean_flag all $report
+
+ ;;
+ "bgpvpn")
+ echo "Running BGPVPN Tempest test case..."
+ pushd ${repos_dir}/bgpvpn/
+ pip install --no-deps -e .
+ popd
+ tempest_dir=$(ls -t /home/opnfv/.rally/tempest/ |grep for-deploy |tail -1)
+ if [[ $tempest_dir == "" ]]; then
+ error "Make sure tempest was running before"
+ fi
+ tempest_dir=/home/opnfv/.rally/tempest/$tempest_dir
+ pushd $tempest_dir
+ mkdir -p /etc/tempest/
+ cp tempest.conf /etc/tempest/
+ echo "[service_available]
+bgpvpn = True" >> /etc/tempest/tempest.conf
+ ./run_tempest.sh -t -N -- networking_bgpvpn_tempest
+ rm -rf /etc/tempest/tempest.conf
+ popd
+ ;;
+ "onos")
+ echo "Running ONOS test case..."
+ if [ $INSTALLER_TYPE == "joid" ]; then
+ python ${FUNCTEST_REPO_DIR}/testcases/Controllers/ONOS/Teston/CI/onosfunctest.py -i joid
+ else
+ python ${FUNCTEST_REPO_DIR}/testcases/Controllers/ONOS/Teston/CI/onosfunctest.py
+ fi
+ ;;
+ "promise")
+ echo "Running PROMISE test case..."
+ python ${FUNCTEST_REPO_DIR}/testcases/features/promise.py $debug $report
+ sleep 10 # to let the instances terminate
+ ;;
+ "doctor")
+ echo "Running Doctor test..."
+ python ${FUNCTEST_REPO_DIR}/testcases/features/doctor.py
+ ;;
+ "ovno")
+ echo "Running OpenContrail test..."
+ ${repos_dir}/ovno/Testcases/RunTests.sh
+ ;;
+ esac
+}
+
+
+# Parse parameters
+while [[ $# > 0 ]]
+ do
+ key="$1"
+ case $key in
+ -h|--help)
+ echo "$usage"
+ exit 0
+ shift
+ ;;
+ -r|--report)
+ report="-r"
+ ;;
+ -s|--serial)
+ serial=true
+ ;;
+ -t|--test|--tests)
+ TEST="$2"
+ shift
+ ;;
+ *)
+ echo "unknown option $1 $2"
+ exit 1
+ ;;
+ esac
+ shift # past argument or value
+done
+
+
+# Source credentials
+echo "Sourcing Credentials ${FUNCTEST_CONF_DIR}/openstack.creds to run the tests.."
+source ${FUNCTEST_CONF_DIR}/openstack.creds
+
+
+# Run test
+run_test $TEST
diff --git a/ci/prepare_env.py b/ci/prepare_env.py
index 710a767e5..b462f9634 100644
--- a/ci/prepare_env.py
+++ b/ci/prepare_env.py
@@ -19,7 +19,6 @@ import subprocess
import sys
import yaml
-import functest.ci.tier_builder as tb
import functest.utils.functest_logger as ft_logger
import functest.utils.functest_utils as ft_utils
import functest.utils.generate_defaults as gen_def
@@ -248,15 +247,6 @@ def generate_os_defaults():
gen_def.main()
-def generate_tiers():
- print_separator()
- logger.info("Generating Tiers and test cases...")
- file = FUNCTEST_REPO + "/ci/testcases.yaml"
-
- t = tb.TierBuilder(CI_INSTALLER_TYPE, CI_SCENARIO, file)
- logger.info("Tiers and tests to be executed:\n\n%s" % t)
-
-
def check_environment():
msg_not_active = "The Functest environment is not installed."
if not os.path.isfile(ENV_FILE):
@@ -285,7 +275,6 @@ def main():
verify_deployment()
install_rally()
generate_os_defaults()
- generate_tiers()
with open(ENV_FILE, "w") as env_file:
env_file.write("1")
diff --git a/ci/run_tests.py b/ci/run_tests.py
new file mode 100644
index 000000000..95bc98021
--- /dev/null
+++ b/ci/run_tests.py
@@ -0,0 +1,134 @@
+#!/bin/bash
+#
+# Author: Jose Lausuch (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
+#
+
+import argparse
+import os
+import sys
+
+import functest.ci.tier_builder as tb
+import functest.utils.functest_logger as ft_logger
+import functest.utils.clean_openstack as clean_os
+
+
+""" arguments """
+parser = argparse.ArgumentParser()
+parser.add_argument("-t", "--test", dest="test", action='store',
+ help="Test case or tier (group of tests) to be executed. "
+ "It will run all the test if not specified.")
+parser.add_argument("-n", "--noclean", help="Do not clean OpenStack resources"
+ " after running each test (default=false).",
+ action="store_true")
+parser.add_argument("-r", "--report", help="Push results to database "
+ "(default=false).", action="store_true")
+args = parser.parse_args()
+
+
+""" logging configuration """
+logger = ft_logger.Logger("run_test").getLogger()
+
+
+""" global variables """
+REPOS_DIR = os.getenv('repos_dir')
+FUNCTEST_REPO = ("%s/functest/" % REPOS_DIR)
+EXEC_SCRIPT = ("%sci/exec_test.sh" % FUNCTEST_REPO)
+CLEAN_FLAG = True
+REPORT_FLAG = False
+
+
+def print_separator(str, count=45):
+ line = ""
+ for i in range(0, count - 1):
+ line += str
+
+ logger.info("%s" % line)
+
+
+def cleanup():
+ print_separator("+")
+ logger.info("Cleaning OpenStack resources...")
+ print_separator("+")
+ clean_os.main()
+ print_separator("")
+
+
+def run_test(test):
+ test_name = test.get_name()
+ print_separator("")
+ print_separator("=")
+ logger.info("Running test case '%s'..." % test_name)
+ print_separator("=")
+ logger.debug("\n%s" % test)
+ flags = (" -t %s" % (test_name))
+ if REPORT_FLAG:
+ flags += " -r"
+
+ cmd = ("%s%s" % (EXEC_SCRIPT, flags))
+ logger.debug("Executing command %s" % cmd)
+
+ print_separator("")
+
+ if CLEAN_FLAG:
+ cleanup()
+
+
+def run_tier(tier):
+ print_separator("#")
+ logger.info("Running tier '%s'" % tier.get_name())
+ print_separator("#")
+ logger.debug("\n%s" % tier)
+ for test in tier.get_tests():
+ run_test(test)
+
+
+def run_all(tiers):
+ logger.debug("Tiers to be executed:\n\n%s" % tiers)
+ for tier in tiers.get_tiers():
+ run_tier(tier)
+
+
+def main():
+ global CLEAN_FLAG
+ global REPORT_FLAG
+
+ CI_INSTALLER_TYPE = os.getenv('INSTALLER_TYPE')
+ CI_SCENARIO = os.getenv('DEPLOY_SCENARIO')
+
+ file = FUNCTEST_REPO + "/ci/testcases.yaml"
+ _tiers = tb.TierBuilder(CI_INSTALLER_TYPE, CI_SCENARIO, file)
+
+ if args.noclean:
+ CLEAN_FLAG = False
+
+ if args.report:
+ REPORT_FLAG = True
+
+ if args.test:
+ if _tiers.get_tier(args.test):
+ run_tier(_tiers.get_tier(args.test))
+
+ elif _tiers.get_test(args.test):
+ run_test(_tiers.get_test(args.test))
+
+ elif args.test == "all":
+ run_all(_tiers)
+
+ else:
+ logger.error("Unknown test case or tier '%s', or not supported by "
+ "the given scenario '%s'."
+ % (args.test, CI_SCENARIO))
+ logger.debug("Available tiers are:\n\n%s"
+ % _tiers)
+ else:
+ run_all(_tiers)
+
+ sys.exit(0)
+
+if __name__ == '__main__':
+ main()
diff --git a/ci/testcases.yaml b/ci/testcases.yaml
index 42458bbef..8dc22a640 100644
--- a/ci/testcases.yaml
+++ b/ci/testcases.yaml
@@ -4,7 +4,7 @@ tiers:
order: 0
ci: daily
description : >-
- This is the first tier to be executed to verify the basic
+ First tier to be executed to verify the basic
operations in the VIM.
testcases:
-
@@ -22,8 +22,7 @@ tiers:
order: 1
ci: daily
description : >-
- This is the second tier in Functest and consist of a set of basic
- Functional tests to validate the OpenStack deployment.
+ Set of basic Functional tests to validate the OpenStack deployment.
testcases:
-
name: vping_ssh
@@ -65,22 +64,22 @@ tiers:
installer: ''
scenario: ''
- -
- name: security_groups
- description: >-
- This test case verifies the functionality of the OpenStack
- security groups and that the port rules created are
- fullfilled.
- dependencies:
- installer: ''
- scenario: ''
+ #-
+ # name: security_groups
+ # description: >-
+ # This test case verifies the functionality of the OpenStack
+ # security groups and that the port rules created are
+ # fullfilled.
+ # dependencies:
+ # installer: ''
+ # scenario: ''
-
name: sdn_suites
order: 2
ci: daily
description : >-
- This tier contains the test suites corresponding to the different
+ Test suites corresponding to the different
SDN Controllers existing in OPNFV.
testcases:
-
@@ -117,7 +116,7 @@ tiers:
order: 3
ci: daily
description : >-
- This tier contains the test suites from feature projects
+ Test suites from feature projects
integrated in functest
testcases:
-
@@ -149,14 +148,12 @@ tiers:
order: 4
ci: weekly
description : >-
- This tier contains the test suites from feature projects
- integrated in functest
+ This test case runs the full set of the OpenStack Tempest suite.
testcases:
-
name: tempest_full_parallel
description: >-
- This test case runs the full set of the OpenStack
- Tempest suite. The list of test cases is generated by
+ The list of test cases is generated by
Tempest automatically and depend on the parameters of
the OpenStack deplopyment.
dependencies:
@@ -168,7 +165,7 @@ tiers:
order: 5
ci: weekly
description : >-
- This tier contains the Rally suite from the OpenStack community.
+ Rally suite from the OpenStack community.
testcases:
-
name: rally_full
@@ -184,7 +181,7 @@ tiers:
order: 6
ci: weekly
description : >-
- This tier contains a collection of VNF test cases.
+ Collection of VNF test cases.
testcases:
-
name: vims
diff --git a/ci/tier_builder.py b/ci/tier_builder.py
index e66e97a38..82b58cd03 100644
--- a/ci/tier_builder.py
+++ b/ci/tier_builder.py
@@ -54,6 +54,27 @@ class TierBuilder:
self.tier_objects.append(tier)
+ def get_tiers(self):
+ return self.tier_objects
+
+ def get_tier(self, tier_name):
+ for i in range(0, len(self.tier_objects)):
+ if self.tier_objects[i].get_name() == tier_name:
+ return self.tier_objects[i]
+ return None
+
+ def get_test(self, test_name):
+ for i in range(0, len(self.tier_objects)):
+ if self.tier_objects[i].is_test(test_name):
+ return self.tier_objects[i].get_test(test_name)
+ return None
+
+ def get_tests(self, tier_name):
+ for i in range(0, len(self.tier_objects)):
+ if self.tier_objects[i].get_name() == tier_name:
+ return self.tier_objects[i].get_tests()
+ return None
+
def __str__(self):
output = ""
for i in range(0, len(self.tier_objects)):
diff --git a/ci/tier_handler.py b/ci/tier_handler.py
index 0b7559498..46dbc4347 100644
--- a/ci/tier_handler.py
+++ b/ci/tier_handler.py
@@ -23,17 +23,39 @@ class Tier:
self.tests_array.append(testcase)
def get_tests(self):
- array_str = []
+ array_tests = []
for test in self.tests_array:
- array_str.append(test.name)
- return array_str
+ array_tests.append(test)
+ return array_tests
+
+ def get_test_names(self):
+ array_tests = []
+ for test in self.tests_array:
+ array_tests.append(test.get_name())
+ return array_tests
+
+ def get_test(self, test_name):
+ if self.is_test(test_name):
+ for test in self.tests_array:
+ if test.get_name() == test_name:
+ return test
+ return None
+
+ def is_test(self, test_name):
+ for test in self.tests_array:
+ if test.get_name() == test_name:
+ return True
+ return False
+
+ def get_name(self):
+ return self.name
def __str__(self):
return ("Tier info:\n"
" Name: " + self.name + "\n"
" Description: " + self.description + "\n"
" Order: " + str(self.order) + "\n"
- " Test cases: " + str(self.get_tests()) + "\n")
+ " Test cases: " + str(self.get_test_names()) + "\n")
class TestCase:
@@ -51,6 +73,9 @@ class TestCase:
return True
+ def get_name(self):
+ return self.name
+
def __str__(self):
return ("Testcase info:\n"
" Name: " + self.name + "\n"