Propose a new python file to launch ODL testing
authorCédric Ollivier <cedric.ollivier@orange.com>
Mon, 11 Jul 2016 13:19:30 +0000 (15:19 +0200)
committerCédric Ollivier <cedric.ollivier@orange.com>
Wed, 13 Jul 2016 10:50:11 +0000 (12:50 +0200)
OpenDaylightTesting.py safely replaces start_tests.sh.
It also adds the report of the basic test of RESTConf which was
previously ignored.

JIRA: FUNCTEST-367

Change-Id: I8ba288271455fd9f31cf87aa65bf45cfb53cd8d6
Signed-off-by: Cédric Ollivier <cedric.ollivier@orange.com>
ci/exec_test.sh
testcases/Controllers/ODL/OpenDaylightTesting.py [new file with mode: 0755]
testcases/Controllers/ODL/start_tests.sh [deleted file]
testcases/Controllers/ODL/test_list.txt [deleted file]

index 32988f8..89e2966 100755 (executable)
@@ -80,9 +80,11 @@ function run_test(){
         ;;
         "odl")
             odl_tests
-            ODL_WEB_PORT=$odl_port ODL_IP=$odl_ip KEYSTONE_IP=$keystone_ip NEUTRON_IP=$neutron_ip \
-                TENANT_NAME=${OS_TENANT_NAME} USR_NAME=${OS_USERNAME} PASS=${OS_PASSWORD} \
-                ${FUNCTEST_REPO_DIR}/testcases/Controllers/ODL/start_tests.sh
+            ${FUNCTEST_REPO_DIR}/testcases/Controllers/ODL/OpenDaylightTesting.py \
+                --keystoneip $keystone_ip --neutronip $neutron_ip \
+                --osusername ${OS_USERNAME} --ostenantname ${OS_TENANT_NAME} \
+                --ospassword ${OS_PASSWORD} \
+                --odlip $odl_ip --odlwebport $odl_port
 
             # push results to the DB in case of CI
             if [[ "$report" == "-r" &&
diff --git a/testcases/Controllers/ODL/OpenDaylightTesting.py b/testcases/Controllers/ODL/OpenDaylightTesting.py
new file mode 100755 (executable)
index 0000000..b1f94b1
--- /dev/null
@@ -0,0 +1,116 @@
+#!/usr/bin/python
+
+import argparse
+import fileinput
+import os
+import re
+from robot import run
+import shutil
+import sys
+
+
+class ODLTestCases:
+
+    repos = "/home/opnfv/repos/"
+    odl_test_repo = repos + "odl_test/"
+    neutron_suite_dir = odl_test_repo + "csit/suites/openstack/neutron/"
+    basic_suite_dir = odl_test_repo + "csit/suites/integration/basic/"
+
+    @classmethod
+    def copy_opnf_testcases(cls):
+        opnfv_testcases_dir = (os.path.dirname(os.path.abspath(__file__)) +
+                               "/custom_tests/neutron/")
+        files = [opnfv_testcases_dir + "001__reachability.robot",
+                 opnfv_testcases_dir + "040__delete_ports.robot",
+                 opnfv_testcases_dir + "050__delete_subnets.robot",
+                 opnfv_testcases_dir + "060__delete_networks.robot"]
+        for f in files:
+            try:
+                shutil.copy(f, cls.neutron_suite_dir)
+            except IOError as e:
+                print "Cannot copy OPNFV's testcases to ODL directory", e
+                return False
+        return True
+
+    @classmethod
+    def set_robotframework_vars(cls, odlusername="admin", odlpassword="admin"):
+        odl_variables_files = cls.odl_test_repo + 'csit/variables/Variables.py'
+        try:
+            print cls.neutron_suite_dir + '__init__.robot'
+            for line in fileinput.input(odl_variables_files,
+                                        inplace=True):
+                print re.sub("AUTH = .*",
+                             ("AUTH = [u'" + odlusername + "', u'" +
+                              odlpassword + "']"),
+                             line.rstrip())
+            return True
+        except Exception as e:
+            print "Cannot set ODL creds", e
+            return False
+
+    @classmethod
+    def run(cls, **kwargs):
+        dirs = [cls.basic_suite_dir, cls.neutron_suite_dir]
+        try:
+            odlusername = kwargs['odlusername']
+            odlpassword = kwargs['odlpassword']
+            variables = ['KEYSTONE:' + kwargs['keystoneip'],
+                         'NEUTRON:' + kwargs['neutronip'],
+                         'OSUSERNAME:"' + kwargs['osusername'] + '"',
+                         'OSTENANTNAME:"' + kwargs['ostenantname'] + '"',
+                         'OSPASSWORD:"' + kwargs['ospassword'] + '"',
+                         'ODL_SYSTEM_IP:' + kwargs['odlip'],
+                         'PORT:' + kwargs['odlwebport'],
+                         'RESTCONFPORT:' + kwargs['odlrestconfport']]
+        except KeyError as e:
+            print "Cannot run ODL testcases. Please check", e
+            return False
+        res_dir = '/home/opnfv/functest/results/odl/'
+        if (cls.copy_opnf_testcases() and
+                cls.set_robotframework_vars(odlusername, odlpassword)):
+            try:
+                os.makedirs(res_dir)
+            except OSError:
+                pass
+            return run(*dirs, variable=variables,
+                       output=res_dir + 'output.xml',
+                       log=res_dir + 'log.html',
+                       report=res_dir + 'report.html')
+        else:
+            return False
+
+
+if __name__ == '__main__':
+    parser = argparse.ArgumentParser()
+    parser.add_argument('-k', '--keystoneip',
+                        help='Keystone IP',
+                        default='127.0.0.1')
+    parser.add_argument('-n', '--neutronip',
+                        help='Neutron IP',
+                        default='127.0.0.1')
+    parser.add_argument('-a', '--osusername',
+                        help='Username for OpenStack',
+                        default='admin')
+    parser.add_argument('-b', '--ostenantname',
+                        help='Tenantname for OpenStack',
+                        default='admin')
+    parser.add_argument('-c', '--ospassword',
+                        help='Password for OpenStack',
+                        default='admin')
+    parser.add_argument('-o', '--odlip',
+                        help='OpenDaylight IP',
+                        default='127.0.0.1')
+    parser.add_argument('-w', '--odlwebport',
+                        help='OpenDaylight Web Portal Port',
+                        default='8080')
+    parser.add_argument('-r', '--odlrestconfport',
+                        help='OpenDaylight RESTConf Port',
+                        default='8181')
+    parser.add_argument('-d', '--odlusername',
+                        help='Username for ODL',
+                        default='admin')
+    parser.add_argument('-e', '--odlpassword',
+                        help='Password for ODL',
+                        default='admin')
+    args = vars(parser.parse_args())
+    sys.exit(ODLTestCases.run(**args))
diff --git a/testcases/Controllers/ODL/start_tests.sh b/testcases/Controllers/ODL/start_tests.sh
deleted file mode 100755 (executable)
index 01c8553..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-#!/bin/bash
-# it includes python2.7 virtual env with robot packages and git
-#
-# 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
-#
-
-BASEDIR=`dirname $0`
-RESULTS_DIR='/home/opnfv/functest/results/odl/'
-REPO_DIR='/home/opnfv/repos/odl_test'
-#TODO: read this form config_functest.yaml
-
-# Colors
-green='\033[0;32m'
-light_green='\033[1;32m'
-red='\033[1;31m'
-nc='\033[0m' # No Color
-
-usage="Script for starting ODL tests. Tests to be executed are specified in test_list.txt file.
-
-usage:
-[var=value] bash $(basename "$0") [-h]
-
-where:
-    -h     show this help text
-    var    one of the following: ODL_IP, ODL_WEB_PORT, ODL_RESTCONF_PORT, ODL_USER, ODL_PASS, TENANT_NAME, USR_NAME, PASS, NEUTRON_IP, KEYSTONE_IP
-    value  new value for var
-
-example:
-    ODL_IP=oscontro1 ODL_PORT=8080 bash $(basename "$0")"
-
-while getopts ':h' option; do
-  case "$option" in
-    h) echo "$usage"
-       exit
-       ;;
-   \?) printf "illegal option: -%s\n" "$OPTARG" >&2
-       echo "$usage" >&2
-       exit 1
-       ;;
-  esac
-done
-
-echo -e "${green}Current environment parameters for ODL suite.${nc}"
-# Following vars might be also specified as CLI params
-set -x
-ODL_IP=${ODL_IP:-'127.0.0.1'}
-ODL_WEB_PORT=${ODL_WEB_PORT:-8080}
-ODL_RESTCONF_PORT=${ODL_RESTCONF_PORT:-8181}
-ODL_USER=${ODL_USER:-'admin'}
-ODL_PASS=${ODL_PASS:-'admin'}
-TENANT_NAME=${TENANT_NAME:-'admin'}
-USR_NAME=${USR_NAME:-'admin'}
-PASS=${PASS:-'admin'}
-NEUTRON_IP=${NEUTRON_IP:-'127.0.0.1'}
-KEYSTONE_IP=${KEYSTONE_IP:-'127.0.0.1'}
-set +x
-
-# set ODL credentials in ${REPO_DIR}/csit/variables/Variables.py
-sed -i "s/^AUTH\ =.*$/AUTH\ =\ [u'$ODL_USER', u'$ODL_PASS']/"  \
-    ${REPO_DIR}/csit/variables/Variables.py
-
-# add custom tests to suite, if there are more custom tests needed this will be reworked
-echo -e "${green}Copy custom tests to suite.${nc}"
-cp -vf ${BASEDIR}/custom_tests/neutron/* ${REPO_DIR}/csit/suites/openstack/neutron/
-
-# List of tests are specified in test_list.txt
-# those are relative paths to test directories from integartion suite
-echo -e "${green}Executing chosen tests.${nc}"
-test_num=0
-while read line
-do
-    # skip comments
-    [[ ${line:0:1} == "#" ]] && continue
-    # skip empty lines
-    [[ -z "${line}" ]] && continue
-
-    ((test_num++))
-    echo -e "${light_green}Starting test: $line ${nc}"
-    pybot -v KEYSTONE:${KEYSTONE_IP} -v NEUTRON:${NEUTRON_IP} \
-        -v OSUSERNAME:\"${USR_NAME}\" -v OSTENANTNAME:\"${TENANT_NAME}\" -v OSPASSWORD:\"${PASS}\"  \
-        -v PORT:${ODL_WEB_PORT} -v RESTCONFPORT:${ODL_RESTCONF_PORT} -v ODL_SYSTEM_IP:${ODL_IP} \
-        ${REPO_DIR}/$line
-    mkdir -p $RESULTS_DIR/logs/${test_num}
-    mv log.html $RESULTS_DIR/logs/${test_num}/
-    mv report.html $RESULTS_DIR/logs/${test_num}/
-    mv output.xml $RESULTS_DIR/logs/${test_num}/
-done < ${BASEDIR}/test_list.txt
-
-# create final report which includes all partial test reports
-for i in $(seq $test_num); do
-  rebot_params="$rebot_params $RESULTS_DIR/logs/$i/output.xml"
-done
-
-echo -e "${green}Final report is located:${nc}"
-rebot $rebot_params
diff --git a/testcases/Controllers/ODL/test_list.txt b/testcases/Controllers/ODL/test_list.txt
deleted file mode 100644 (file)
index ec8cd32..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-# List of tests` which will be executed by script start_test.sh
-# You can specify path to specific robot test file or directory (in that case all tests from directory will be executed)
-
-csit/suites/integration/basic/
-csit/suites/openstack/neutron/