aboutsummaryrefslogtreecommitdiffstats
path: root/testcases/Controllers
diff options
context:
space:
mode:
Diffstat (limited to 'testcases/Controllers')
-rw-r--r--testcases/Controllers/ODL/CI/create_venv.sh35
-rw-r--r--testcases/Controllers/ODL/CI/custom_tests/neutron/040__delete_ports.txt37
-rw-r--r--testcases/Controllers/ODL/CI/custom_tests/neutron/050__delete_subnets.txt37
-rw-r--r--testcases/Controllers/ODL/CI/custom_tests/neutron/060__delete_networks.txt37
-rw-r--r--testcases/Controllers/ODL/CI/requirements.pip4
-rwxr-xr-x[-rw-r--r--]testcases/Controllers/ODL/CI/start_tests.sh67
-rw-r--r--testcases/Controllers/ODL/CI/test_list.txt4
-rw-r--r--testcases/Controllers/ONOS/Teston/CI/Readme.txt5
-rw-r--r--testcases/Controllers/ONOS/Teston/CI/__init__.py0
-rw-r--r--testcases/Controllers/ONOS/Teston/CI/adapters/__init__.py0
-rw-r--r--testcases/Controllers/ONOS/Teston/CI/adapters/client.py76
-rw-r--r--testcases/Controllers/ONOS/Teston/CI/adapters/connection.py190
-rw-r--r--testcases/Controllers/ONOS/Teston/CI/adapters/environment.py268
-rw-r--r--testcases/Controllers/ONOS/Teston/CI/adapters/foundation.py90
-rw-r--r--testcases/Controllers/ONOS/Teston/CI/dependencies/onos23
-rw-r--r--testcases/Controllers/ONOS/Teston/CI/log/gitignore0
-rw-r--r--testcases/Controllers/ONOS/Teston/CI/onosfunctest.py24
17 files changed, 822 insertions, 75 deletions
diff --git a/testcases/Controllers/ODL/CI/create_venv.sh b/testcases/Controllers/ODL/CI/create_venv.sh
deleted file mode 100644
index 5d0733a5a..000000000
--- a/testcases/Controllers/ODL/CI/create_venv.sh
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/bin/bash -e
-
-# Script checks that venv exists. If it doesn't it will be created
-# It requires python2.7 and virtualenv packages installed
-
-BASEDIR=`dirname $0`
-
-function venv_install() {
- if command -v virtualenv-2.7; then
- virtualenv-2.7 $1
- elif command -v virtualenv2; then
- virtualenv2 $1
- elif command -v virtualenv; then
- virtualenv $1
- else
- echo Please make sure virtualenv package is installed.
- return 1
- fi
-}
-
-# exit when something goes wrong during venv install
-set -e
-if [ ! -d "$BASEDIR/venv" ]; then
- venv_install $BASEDIR/venv
- echo "Virtualenv created."
-fi
-
-if [ ! -f "$BASEDIR/venv/updated" -o $BASEDIR/requirements.pip -nt $BASEDIR/venv/updated ]; then
- source $BASEDIR/venv/bin/activate
- pip install -r $BASEDIR/requirements.pip
- touch $BASEDIR/venv/updated
- echo "Requirements installed."
- deactivate
-fi
-set +e
diff --git a/testcases/Controllers/ODL/CI/custom_tests/neutron/040__delete_ports.txt b/testcases/Controllers/ODL/CI/custom_tests/neutron/040__delete_ports.txt
new file mode 100644
index 000000000..02c90c37c
--- /dev/null
+++ b/testcases/Controllers/ODL/CI/custom_tests/neutron/040__delete_ports.txt
@@ -0,0 +1,37 @@
+*** Settings ***
+Documentation Checking Port deleted in OpenStack are deleted also in OpenDaylight
+Suite Setup Create Session OSSession http://${OPENSTACK}:9696 headers=${X-AUTH}
+Suite Teardown Delete All Sessions
+Library SSHLibrary
+Library Collections
+Library OperatingSystem
+Library ../../../libraries/RequestsLibrary.py
+Library ../../../libraries/Common.py
+Variables ../../../variables/Variables.py
+
+*** Variables ***
+${ODLREST} /controller/nb/v2/neutron/ports
+${OSREST} /v2.0/ports/${PORTID}
+${data} {"port":{"network_id":"${NETID}","admin_state_up": true}}
+
+*** Test Cases ***
+Delete New Port
+ [Documentation] Delete previously created port in OpenStack
+ [Tags] Delete port OpenStack Neutron
+ Log ${data}
+ ${resp} delete OSSession ${OSREST}
+ Should be Equal As Strings ${resp.status_code} 204
+ Log ${resp.content}
+ sleep 2
+
+Check Port Deleted
+ [Documentation] Check port deleted in OpenDaylight
+ [Tags] Check port deleted OpenDaylight
+ Create Session ODLSession http://${CONTROLLER}:${PORT} headers=${HEADERS} auth=${AUTH}
+ ${resp} get ODLSession ${ODLREST}
+ Should be Equal As Strings ${resp.status_code} 200
+ ${ODLResult} To Json ${resp.content}
+ Set Suite Variable ${ODLResult}
+ Log ${ODLResult}
+ ${resp} get ODLSession ${ODLREST}/${PORTID}
+ Should be Equal As Strings ${resp.status_code} 404
diff --git a/testcases/Controllers/ODL/CI/custom_tests/neutron/050__delete_subnets.txt b/testcases/Controllers/ODL/CI/custom_tests/neutron/050__delete_subnets.txt
new file mode 100644
index 000000000..4121c98fe
--- /dev/null
+++ b/testcases/Controllers/ODL/CI/custom_tests/neutron/050__delete_subnets.txt
@@ -0,0 +1,37 @@
+*** Settings ***
+Documentation Checking Subnets deleted in OpenStack are deleted also in OpenDaylight
+Suite Setup Create Session OSSession http://${OPENSTACK}:9696 headers=${X-AUTH}
+Suite Teardown Delete All Sessions
+Library SSHLibrary
+Library Collections
+Library OperatingSystem
+Library ../../../libraries/RequestsLibrary.py
+Library ../../../libraries/Common.py
+Variables ../../../variables/Variables.py
+
+*** Variables ***
+${ODLREST} /controller/nb/v2/neutron/subnets
+${OSREST} /v2.0/subnets/${SUBNETID}
+${data} {"subnet":{"network_id":"${NETID}","ip_version":4,"cidr":"172.16.64.0/24","allocation_pools":[{"start":"172.16.64.20","end":"172.16.64.120"}]}}
+
+*** Test Cases ***
+Delete New subnet
+ [Documentation] Delete previously created subnet in OpenStack
+ [Tags] Delete Subnet OpenStack Neutron
+ Log ${data}
+ ${resp} delete OSSession ${OSREST}
+ Should be Equal As Strings ${resp.status_code} 204
+ Log ${resp.content}
+ sleep 2
+
+Check New subnet deleted
+ [Documentation] Check subnet deleted in OpenDaylight
+ [Tags] Check subnet deleted OpenDaylight
+ Create Session ODLSession http://${CONTROLLER}:${PORT} headers=${HEADERS} auth=${AUTH}
+ ${resp} get ODLSession ${ODLREST}
+ Should be Equal As Strings ${resp.status_code} 200
+ ${ODLResult} To Json ${resp.content}
+ Set Suite Variable ${ODLResult}
+ Log ${ODLResult}
+ ${resp} get ODLSession ${ODLREST}/${SUBNETID}
+ Should be Equal As Strings ${resp.status_code} 404
diff --git a/testcases/Controllers/ODL/CI/custom_tests/neutron/060__delete_networks.txt b/testcases/Controllers/ODL/CI/custom_tests/neutron/060__delete_networks.txt
new file mode 100644
index 000000000..fc823fa4b
--- /dev/null
+++ b/testcases/Controllers/ODL/CI/custom_tests/neutron/060__delete_networks.txt
@@ -0,0 +1,37 @@
+*** Settings ***
+Documentation Checking Network deleted in OpenStack are deleted also in OpenDaylight
+Suite Setup Create Session OSSession http://${OPENSTACK}:9696 headers=${X-AUTH}
+Suite Teardown Delete All Sessions
+Library SSHLibrary
+Library Collections
+Library OperatingSystem
+Library ../../../libraries/RequestsLibrary.py
+Library ../../../libraries/Common.py
+Variables ../../../variables/Variables.py
+
+*** Variables ***
+${ODLREST} /controller/nb/v2/neutron/networks
+${OSREST} /v2.0/networks/${NETID}
+${postNet} {"network":{"name":"odl_network","admin_state_up":true}}
+
+*** Test Cases ***
+Delete Network
+ [Documentation] Delete network in OpenStack
+ [Tags] Delete Network OpenStack Neutron
+ Log ${postNet}
+ ${resp} delete OSSession ${OSREST}
+ Should be Equal As Strings ${resp.status_code} 204
+ Log ${resp.content}
+ sleep 2
+
+Check Network deleted
+ [Documentation] Check Network deleted in OpenDaylight
+ [Tags] Check Network OpenDaylight
+ Create Session ODLSession http://${CONTROLLER}:${PORT} headers=${HEADERS} auth=${AUTH}
+ ${resp} get ODLSession ${ODLREST}
+ Should be Equal As Strings ${resp.status_code} 200
+ ${ODLResult} To Json ${resp.content}
+ Set Suite Variable ${ODLResult}
+ Log ${ODLResult}
+ ${resp} get ODLSession ${ODLREST}/${NetID}
+ Should be Equal As Strings ${resp.status_code} 404
diff --git a/testcases/Controllers/ODL/CI/requirements.pip b/testcases/Controllers/ODL/CI/requirements.pip
deleted file mode 100644
index 43845e251..000000000
--- a/testcases/Controllers/ODL/CI/requirements.pip
+++ /dev/null
@@ -1,4 +0,0 @@
-requests
-robotframework
-robotframework-requests
-robotframework-sshlibrary
diff --git a/testcases/Controllers/ODL/CI/start_tests.sh b/testcases/Controllers/ODL/CI/start_tests.sh
index 367a075f7..5e87726b8 100644..100755
--- a/testcases/Controllers/ODL/CI/start_tests.sh
+++ b/testcases/Controllers/ODL/CI/start_tests.sh
@@ -1,9 +1,11 @@
#!/bin/bash
-# Script requires that test environment is created already
# it includes python2.7 virtual env with robot packages and git
-# use create_env.sh script for creating python virtualenv
BASEDIR=`dirname $0`
+RESULTS_DIR='/home/opnfv/functest/results/odl/'
+REPO_DIR='/home/opnfv/repos/odl_integration'
+#TODO: read this form config_functest.yaml
+
# Colors
green='\033[0;32m'
light_green='\033[1;32m'
@@ -17,11 +19,11 @@ usage:
where:
-h show this help text
- var one of the following: OSTACK_IP, ODL_PORT, USR_NAME, USR_PASSWORD
+ var one of the following: ODL_IP, ODL_PORT, USR_NAME, PASS, NEUTRON_IP
value new value for var
example:
- OSTACK_IP=oscontro1 ODL_PORT=8080 bash $(basename "$0")"
+ ODL_IP=oscontro1 ODL_PORT=8080 bash $(basename "$0")"
while getopts ':h' option; do
case "$option" in
@@ -38,36 +40,30 @@ done
echo -e "${green}Current environment parameters for ODL suite.${nc}"
# Following vars might be also specified as CLI params
set -x
-OSTACK_IP=${OSTACK_IP:-'oscontrol'}
+ODL_IP=${ODL_IP:-'192.168.1.5'}
ODL_PORT=${ODL_PORT:-8081}
-USR_NAME=${USR_NAME:-'admin'}
-USR_PASSWORD=${USR_PASSWORD:-'octopus'}
+USR_NAME=${USR_NAME:-'neutron'}
+PASS=${PASS:-'octopus'}
+NEUTRON_IP=${NEUTRON_IP:-192.168.0.68}
set +x
-echo -e "${green}Cloning ODL integration git repo.${nc}"
-if [ -d integration ]; then
- cd integration
- git checkout -- .
- git pull
- cd -
-else
- git clone https://github.com/opendaylight/integration.git
-fi
# Change openstack password for admin tenant in neutron suite
-sed -i "s/\"password\": \"admin\"/\"password\": \"${USR_PASSWORD}\"/" integration/test/csit/suites/openstack/neutron/__init__.robot
+sed -i "s/\"password\": \".*\"/\"password\": \"${PASS}\"/" ${REPO_DIR}/test/csit/suites/openstack/neutron/__init__.robot
+
+# Add Start Suite and Teardown Suite
+sed -i "/^Documentation.*/a Suite Teardown Stop Suite" ${REPO_DIR}/test/csit/suites/openstack/neutron/__init__.robot
+sed -i "/^Documentation.*/a Suite Setup Start Suite" ${REPO_DIR}/test/csit/suites/openstack/neutron/__init__.robot
+
-if source $BASEDIR/venv/bin/activate; then
- echo -e "${green}Python virtualenv activated.${nc}"
-else
- echo -e "${red}ERROR${nc}"
- exit 1
-fi
+# 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}/test/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=1
+test_num=0
while read line
do
# skip comments
@@ -75,16 +71,19 @@ do
# skip empty lines
[[ -z "${line}" ]] && continue
- echo -e "${light_green}Starting test: $line ${nc}"
- pybot -v OPENSTACK:${OSTACK_IP} -v PORT:${ODL_PORT} -v CONTROLLER:${OSTACK_IP} $line
- mkdir -p $BASEDIR/logs/${test_num}
- mv log.html $BASEDIR/logs/${test_num}/
- mv report.html $BASEDIR/logs/${test_num}/
- mv output.xml $BASEDIR/logs/${test_num}/
((test_num++))
-done < test_list.txt
+ echo -e "${light_green}Starting test: $line ${nc}"
+ pybot -v OPENSTACK:${NEUTRON_IP} -v PORT:${ODL_PORT} -v CONTROLLER:${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
-echo -e "${green}Deactivate venv.${nc}"
-deactivate
+# 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
-# Now we can copy output.xml, log.html and report.xml files generated by robot.
+echo -e "${green}Final report is located:${nc}"
+rebot $rebot_params
diff --git a/testcases/Controllers/ODL/CI/test_list.txt b/testcases/Controllers/ODL/CI/test_list.txt
index e5e52129b..ad791e553 100644
--- a/testcases/Controllers/ODL/CI/test_list.txt
+++ b/testcases/Controllers/ODL/CI/test_list.txt
@@ -1,5 +1,5 @@
# 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)
-integration/test/csit/suites/integration/basic/
-integration/test/csit/suites/openstack/neutron/
+test/csit/suites/integration/basic/
+test/csit/suites/openstack/neutron/
diff --git a/testcases/Controllers/ONOS/Teston/CI/Readme.txt b/testcases/Controllers/ONOS/Teston/CI/Readme.txt
new file mode 100644
index 000000000..7393f59a1
--- /dev/null
+++ b/testcases/Controllers/ONOS/Teston/CI/Readme.txt
@@ -0,0 +1,5 @@
+1.This is a basic test run about onos,we will make them better and better
+2.This test include two suites:
+(1)Test northbound(network/subnet/ports create/update/delete)
+(2)Ovsdb test,default configuration,openflow connection,vm go onlines.
+3.Later we will make a framework to do this test \ No newline at end of file
diff --git a/testcases/Controllers/ONOS/Teston/CI/__init__.py b/testcases/Controllers/ONOS/Teston/CI/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/testcases/Controllers/ONOS/Teston/CI/__init__.py
diff --git a/testcases/Controllers/ONOS/Teston/CI/adapters/__init__.py b/testcases/Controllers/ONOS/Teston/CI/adapters/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/testcases/Controllers/ONOS/Teston/CI/adapters/__init__.py
diff --git a/testcases/Controllers/ONOS/Teston/CI/adapters/client.py b/testcases/Controllers/ONOS/Teston/CI/adapters/client.py
new file mode 100644
index 000000000..535b71f85
--- /dev/null
+++ b/testcases/Controllers/ONOS/Teston/CI/adapters/client.py
@@ -0,0 +1,76 @@
+"""
+Description:
+ This file is used to run testcase
+ lanqinglong@huawei.com
+"""
+from environment import environment
+import os
+import time
+import pexpect
+import re
+import requests
+import json
+
+class client( environment ):
+
+ def __init__( self ):
+ environment.__init__( self )
+ self.loginfo = environment()
+ self.testcase = ''
+
+ def RunScript( self, handle, testname, timeout=300 ):
+ """
+ Run ONOS Test Script
+ Parameters:
+ testname: ONOS Testcase Name
+ masterusername: The server username of running ONOS
+ masterpassword: The server password of running ONOS
+ """
+ self.testcase = testname
+ self.ChangeTestCasePara( testname, self.masterusername, self.masterpassword )
+ runhandle = handle
+ runtest = self.home + "/OnosSystemTest/TestON/bin/cli.py run " + testname
+ runhandle.sendline(runtest)
+ circletime = 0
+ lastshowscreeninfo = ''
+ while True:
+ Result = runhandle.expect(["PEXPECT]#", pexpect.EOF, pexpect.TIMEOUT])
+ curshowscreeninfo = runhandle.before
+ if (len(lastshowscreeninfo) != len(curshowscreeninfo)):
+ self.loginfo.log(str(curshowscreeninfo)[len(lastshowscreeninfo)::])
+ lastshowscreeninfo = curshowscreeninfo
+ if Result == 0:
+ print "Done!"
+ return
+ time.sleep(1)
+ circletime += 1
+ if circletime > timeout:
+ break
+ self.loginfo.log( "Timeout when running the test, please check!" )
+
+ def onosstart( self ):
+ #This is the compass run machine user&pass,you need to modify
+
+ print "Test Begin....."
+ self.OnosConnectionSet()
+ masterhandle = self.SSHlogin(self.localhost, self.masterusername,
+ self.masterpassword)
+ self.OnosEnvSetup( masterhandle )
+ return masterhandle
+
+ def onosclean( self, handle ):
+ self.SSHRelease( handle )
+ self.loginfo.log('Release onos handle Successful')
+
+ def push_results_to_db( self, payload, pushornot = 1):
+ if pushornot != 1:
+ return 1
+ url = self.Result_DB + "/results"
+ params = {"project_name": "functest", "case_name": "ONOS-" + self.testcase,
+ "pod_name": 'huawei-build-2', "details": payload}
+ headers = {'Content-Type': 'application/json'}
+ try:
+ r = requests.post(url, data=json.dumps(params), headers=headers)
+ self.loginfo.log(r)
+ except:
+ self.loginfo.log('Error pushing results into Database')
diff --git a/testcases/Controllers/ONOS/Teston/CI/adapters/connection.py b/testcases/Controllers/ONOS/Teston/CI/adapters/connection.py
new file mode 100644
index 000000000..c0eb464af
--- /dev/null
+++ b/testcases/Controllers/ONOS/Teston/CI/adapters/connection.py
@@ -0,0 +1,190 @@
+"""
+Description:
+ This file is used to make connections
+ Include ssh & exchange public-key to each other so that
+ it can run without password
+
+ lanqinglong@huawei.com
+"""
+import os
+import time
+import pexpect
+import re
+import sys
+from foundation import foundation
+
+class connection( foundation ):
+
+ def __init__( self ):
+ foundation.__init__( self )
+ self.loginfo = foundation()
+
+ def AddKnownHost( self, handle, ipaddr, username, password ):
+ """
+ Add an user to known host,so that onos can login in with onos $ipaddr.
+ parameters:
+ ipaddr: ip address
+ username: login user name
+ password: login password
+ """
+ print( "Now Adding an user to known hosts " + ipaddr )
+ login = handle
+ login.sendline( "ssh -l %s -p 8101 %s"%( username, ipaddr ) )
+ index = 0
+ while index != 2:
+ index = login.expect( ['assword:', 'yes/no', pexpect.EOF, \
+ pexpect.TIMEOUT] )
+ if index == 0:
+ login.sendline( password )
+ login.sendline( "logout" )
+ index = login.expect( ["closed", pexpect.EOF] )
+ if index == 0:
+ self.loginfo.log( "Add SSH Known Host Success!" )
+ break
+ else:
+ self.loginfo.log( "Add SSH Known Host Failed! Please Check!" )
+ break
+ login.prompt( )
+
+ if index == 1:
+ login.sendline('yes')
+
+ def GetEnvValue( self, handle, envname):
+ """
+ os.getenv only returns current user value
+ GetEnvValue returns a environment value of
+ current handle
+ eg: GetEnvValue(handle,'HOME')
+ """
+ envhandle = handle
+ envhandle.sendline( 'echo $' + envname )
+ envhandle.prompt( )
+ reg = envname + '\r\n(.*)\r'
+ envaluereg = re.compile( reg )
+ envalue = envaluereg.search( envhandle.before )
+ if envalue:
+ return envalue.groups()[0]
+ else:
+ return None
+
+ def Gensshkey( self, handle ):
+ """
+ Generate ssh keys, used for some server have no sshkey.
+ """
+ print "Now Generating SSH keys..."
+ #Here file name may be id_rsa or id_ecdsa or others
+ #So here will have a judgement
+ keysub = handle
+ filepath = self.GetEnvValue( keysub, 'HOME' ) + '/.ssh'
+ filelist = os.listdir( filepath )
+ for item in filelist:
+ if 'id' in item:
+ self.loginfo.log("SSH keys are exsit in ssh directory.")
+ return True
+ keysub.sendline("ssh-keygen -t rsa")
+ Result = 0
+ while Result != 2:
+ Result = keysub.expect( ["Overwrite", "Enter", pexpect.EOF, \
+ 'PEXPECT]#', pexpect.TIMEOUT])
+ if Result == 0:
+ keysub.sendline("y")
+ if Result == 1 or Result == 2:
+ keysub.sendline("\n")
+ if Result == 3:
+ self.loginfo.log( "Generate SSH key success." )
+ keysub.prompt()
+ break
+ if Result == 4:
+ self.loginfo.log("Generate SSH key failed.")
+ keysub.prompt()
+ break
+
+ def GetRootAuth( self, password ):
+ """
+ Get root user
+ parameters:
+ password: root login password
+ """
+ print( "Now changing to user root" )
+ login = pexpect.spawn( "su - root" )
+ index = 0
+ while index != 2:
+ index = login.expect( ['assword:', "failure", \
+ pexpect.EOF, pexpect.TIMEOUT] )
+ if index == 0:
+ login.sendline( password )
+ if index == 1:
+ self.loginfo.log("Change user to root failed.")
+
+ login.interact()
+
+ def ReleaseRootAuth( self ):
+ """
+ Exit root user.
+ """
+ print( "Now Release user root" )
+ login = pexpect.spawn( "exit" )
+ index = login.expect( ['logout', \
+ pexpect.EOF, pexpect.TIMEOUT] )
+ if index == 0:
+ self.loginfo.log("Release root user success.")
+ if index == 1:
+ self.loginfo.log("Release root user failed.")
+
+ login.interact()
+
+ def AddEnvIntoBashrc( self, envalue ):
+ """
+ Add Env var into /etc/profile.
+ parameters:
+ envalue: environment value to add
+ """
+ print "Now Adding bash environment"
+ fileopen = open( "/etc/profile", 'r' )
+ findContext = 1
+ while findContext:
+ findContext = fileopen.readline( )
+ result = findContext.find( envalue )
+ if result != -1:
+ break
+ fileopen.close
+ if result == -1:
+ envAdd = open( "/etc/profile", 'a+' )
+ envAdd.writelines( "\n" + envalue )
+ envAdd.close( )
+ self.loginfo.log( "Add env to bashrc success!" )
+
+ def OnosRootPathChange( self, onospath ):
+ """
+ Change ONOS root path in file:bash_profile
+ onospath: path of onos root
+ """
+ print "Now Changing ONOS Root Path"
+ filepath = onospath + 'onos/tools/dev/bash_profile'
+ line = open(filepath, 'r').readlines()
+ lenall = len(line) - 1
+ for i in range(lenall):
+ if "export ONOS_ROOT" in line[i]:
+ line[i] = 'export ONOS_ROOT=' + onospath + 'onos\n'
+ NewFile = open(filepath, 'w')
+ NewFile.writelines(line)
+ NewFile.close
+ print "Done!"
+
+ def OnosConnectionSet (self):
+ """
+ Intergrate for ONOS connection setup
+ """
+ if self.masterusername == 'root':
+ filepath = '/root/'
+ else :
+ filepath = '/home/' + self.masterusername + '/'
+ filepath = os.path.join( filepath, "onos/tools/dev/bash_profile" )
+ self.AddEnvIntoBashrc("source " + filepath + "\n")
+ self.AddEnvIntoBashrc("export OCT=" + self.OCT)
+ self.AddEnvIntoBashrc("export OC1=" + self.OC1)
+ self.AddEnvIntoBashrc("export OC2=" + self.OC2)
+ self.AddEnvIntoBashrc("export OC3=" + self.OC3)
+ self.AddEnvIntoBashrc("export OCN=" + self.OCN)
+ self.AddEnvIntoBashrc("export OCN2=" + self.OCN2)
+ self.AddEnvIntoBashrc("export localhost=" + self.localhost)
diff --git a/testcases/Controllers/ONOS/Teston/CI/adapters/environment.py b/testcases/Controllers/ONOS/Teston/CI/adapters/environment.py
new file mode 100644
index 000000000..f0bafd760
--- /dev/null
+++ b/testcases/Controllers/ONOS/Teston/CI/adapters/environment.py
@@ -0,0 +1,268 @@
+"""
+Description:
+ This file is used to setup the running environment
+ Include Download code,setup environment variable
+ Set onos running config
+ Set user name/password
+ Onos-push-keys and so on
+ lanqinglong@huawei.com
+"""
+
+import os
+import time
+import pexpect
+import re
+import sys
+import pxssh
+from connection import connection
+
+class environment( connection ):
+
+ def __init__( self ):
+ connection.__init__( self )
+ self.loginfo = connection( )
+ self.masterhandle = ''
+ self.home = ''
+
+ def DownLoadCode( self, handle, codeurl ):
+ """
+ Download Code use 'git clone'
+ parameters:
+ handle: current working handle
+ codeurl: clone code url
+ """
+ print "Now loading test codes! Please wait in patient..."
+ originalfolder = sys.path[0]
+ print originalfolder
+ gitclone = handle
+ gitclone.sendline( "git clone " + codeurl )
+ index = 0
+ increment = 0
+ while index != 1 or index != 4:
+ index = gitclone.expect ( ['already exists', 'esolving deltas: 100%', \
+ 'eceiving objects', 'Already up-to-date', \
+ 'npacking objects: 100%', pexpect.EOF] )
+
+ filefolder = self.home + '/' + codeurl.split('/')[-1].split('.')[0]
+ if index == 0 :
+ os.chdir( filefolder )
+ os.system( 'git pull' )
+ os.chdir( originalfolder )
+ self.loginfo.log( 'Download code success!' )
+ break
+ elif index == 1 or index == 4:
+ self.loginfo.log( 'Download code success!' )
+ gitclone.sendline( "mkdir onos" )
+ gitclone.prompt( )
+ gitclone.sendline( "cp -rf " + filefolder+ "/tools onos/" )
+ gitclone.prompt( )
+ break
+ elif index == 2 :
+ os.write(1, gitclone.before)
+ sys.stdout.flush()
+ else :
+ self.loginfo.log( 'Download code failed!' )
+ self.loginfo.log( 'Information before' + gitclone.before )
+ break
+ gitclone.prompt( )
+
+ def InstallDefaultSoftware( self, handle ):
+ """
+ Install default software
+ parameters:
+ handle(input): current working handle
+ """
+ print "Now Cleaning test environment"
+ handle.sendline("sudo apt-get install -y mininet")
+ handle.prompt( )
+ handle.sendline("sudo pip install configobj")
+ handle.prompt( )
+ handle.sendline("sudo apt-get install -y sshpass")
+ handle.prompt( )
+ handle.sendline("OnosSystemTest/TestON/bin/cleanup.sh")
+ handle.prompt( )
+ time.sleep(5)
+ self.loginfo.log( 'Clean environment success!' )
+
+ def OnosPushKeys(self, handle, cmd, password):
+ """
+ Using onos-push-keys to make ssh device without password
+ parameters:
+ handle(input): working handle
+ cmd(input): onos-push-keys xxx(xxx is device)
+ password(input): login in password
+ """
+ print "Now Pushing Onos Keys:"+cmd
+ Pushkeys = handle
+ Pushkeys.sendline( cmd )
+ Result = 0
+ while Result != 2:
+ Result = Pushkeys.expect( ["(yes/no)", "assword:", "PEXPECT]#", \
+ pexpect.EOF, pexpect.TIMEOUT])
+ if ( Result == 0 ):
+ Pushkeys.sendline( "yes" )
+ if ( Result == 1 ):
+ Pushkeys.sendline( password )
+ if ( Result == 2 ):
+ self.loginfo.log( "ONOS Push keys Success!" )
+ break
+ if ( Result == 3 ):
+ self.loginfo.log( "ONOS Push keys Error!" )
+ break
+ time.sleep(2)
+ Pushkeys.prompt( )
+ print "Done!"
+
+ def SetOnosEnvVar( self, handle, masterpass, agentpass):
+ """
+ Setup onos pushkeys to all devices(3+2)
+ parameters:
+ handle(input): current working handle
+ masterpass: scripts running server's password
+ agentpass: onos cluster&compute node password
+ """
+ print "Now Setting test environment"
+ for host in self.hosts:
+ print "try to connect " + str(host)
+ result = self.CheckSshNoPasswd(host)
+ if not result:
+ print "ssh lgin failed,try to copy master publickey to agent " + str(host)
+ self.CopyPublicKey(host)
+ self.OnosPushKeys( handle, "onos-push-keys " + self.OCT, masterpass)
+ self.OnosPushKeys( handle, "onos-push-keys " + self.OC1, agentpass)
+ self.OnosPushKeys( handle, "onos-push-keys " + self.OC2, agentpass)
+ self.OnosPushKeys( handle, "onos-push-keys " + self.OC3, agentpass)
+ self.OnosPushKeys( handle, "onos-push-keys " + self.OCN, agentpass)
+ self.OnosPushKeys( handle, "onos-push-keys " + self.OCN2, agentpass)
+
+ def CheckSshNoPasswd( self, host):
+ """
+ Check master can connect agent with no password
+ """
+ login = pexpect.spawn( "ssh " + str(host))
+ index = 4
+ while index == 4:
+ index = login.expect(['(yes/no)','>|#|\$', \
+ pexpect.EOF, pexpect.TIMEOUT] )
+ if index == 0:
+ login.sendline( "yes" )
+ index = 4
+ if index == 1:
+ self.loginfo.log("ssh connect to " + str(host) + " success,no need to copy ssh public key" )
+ return True
+ login.interact()
+ return False
+
+ def ChangeOnosName( self, user, password):
+ """
+ Change onos name in envDefault file
+ Because some command depend on this
+ parameters:
+ user: onos&compute node user
+ password: onos&compute node password
+ """
+ print "Now Changing ONOS name&password"
+ filepath = self.home + '/onos/tools/build/envDefaults'
+ line = open(filepath, 'r').readlines()
+ lenall = len(line) - 1
+ for i in range(lenall):
+ if "ONOS_USER=" in line[i]:
+ line[i]=line[i].replace("sdn",user)
+ if "ONOS_GROUP" in line[i]:
+ line[i]=line[i].replace("sdn",user)
+ if "ONOS_PWD" in line[i]:
+ line[i]=line[i].replace("rocks",password)
+ NewFile = open(filepath, 'w')
+ NewFile.writelines(line)
+ NewFile.close
+ print "Done!"
+
+ def ChangeTestCasePara(self, testcase, user, password):
+ """
+ When running test script, there's something need \
+ to change in every test folder's *.param & *.topo files
+ user: onos&compute node user
+ password: onos&compute node password
+ """
+ print "Now Changing " + testcase + " name&password"
+ if self.masterusername == 'root':
+ filepath = '/root/'
+ else :
+ filepath = '/home/' + self.masterusername + '/'
+ filepath = filepath +"OnosSystemTest/TestON/tests/" + testcase + "/" + \
+ testcase + ".topo"
+ line = open(filepath,'r').readlines()
+ lenall = len(line)-1
+ for i in range(lenall-2):
+ if ("localhost" in line[i]) or ("OCT" in line[i]):
+ line[i+1]=re.sub(">\w+",">"+user,line[i+1])
+ line[i+2]=re.sub(">\w+",">"+password,line[i+2])
+ if "OC1" in line [i] \
+ or "OC2" in line [i] \
+ or "OC3" in line [i] \
+ or "OCN" in line [i] \
+ or "OCN2" in line[i]:
+ line[i+1]=re.sub(">\w+",">root",line[i+1])
+ line[i+2]=re.sub(">\w+",">root",line[i+2])
+ NewFile = open(filepath,'w')
+ NewFile.writelines(line)
+ NewFile.close
+
+ def SSHlogin ( self, ipaddr, username, password ) :
+ """
+ SSH login provide a connection to destination.
+ parameters:
+ ipaddr: ip address
+ username: login user name
+ password: login password
+ return: handle
+ """
+ login = pxssh.pxssh( )
+ login.login ( ipaddr, username, password, original_prompt='[$#>]')
+ #send command ls -l
+ login.sendline ('ls -l')
+ #match prompt
+ login.prompt()
+ print ("SSH login " + ipaddr + " success!")
+ return login
+
+ def SSHRelease( self, handle ):
+ #Release ssh
+ handle.logout()
+
+ def CopyOnostoTestbin( self ):
+ sourcefile = self.cipath + '/dependencies/onos'
+ destifile = self.home + '/onos/tools/test/bin/'
+ os.system( 'pwd' )
+ runcommand = 'cp ' + sourcefile + ' ' + destifile
+ os.system( runcommand )
+
+ def CopyPublicKey( self, host ):
+ output = os.popen( 'cat /root/.ssh/id_rsa.pub' )
+ publickey = output.read().strip('\n')
+ tmphandle = self.SSHlogin( self.installer_master, self.installer_master_username, self.installer_master_password )
+ tmphandle.sendline("ssh "+ host + " -T \'echo " + str(publickey) + ">>/root/.ssh/authorized_keys\'" )
+ tmphandle.prompt()
+ self.SSHRelease(tmphandle)
+ print "Add OCT PublicKey to " + host + " success"
+
+ def OnosEnvSetup( self, handle ):
+ """
+ Onos Environment Setup function
+ """
+ self.Gensshkey( handle )
+ self.home = self.GetEnvValue( handle, 'HOME' )
+ self.AddKnownHost( handle, self.OC1, "karaf", "karaf" )
+ self.AddKnownHost( handle, self.OC2, "karaf", "karaf" )
+ self.AddKnownHost( handle, self.OC3, "karaf", "karaf" )
+ self.DownLoadCode( handle, 'https://github.com/sunyulin/OnosSystemTest.git' )
+ #self.DownLoadCode( handle, 'https://gerrit.onosproject.org/onos' )
+ if self.masterusername == 'root':
+ filepath = '/root/'
+ else :
+ filepath = '/home/' + self.masterusername + '/'
+ self.OnosRootPathChange( filepath )
+ self.CopyOnostoTestbin()
+ self.ChangeOnosName(self.agentusername,self.agentpassword)
+ self.InstallDefaultSoftware( handle )
+ self.SetOnosEnvVar(handle, self.masterpassword,self.agentpassword)
diff --git a/testcases/Controllers/ONOS/Teston/CI/adapters/foundation.py b/testcases/Controllers/ONOS/Teston/CI/adapters/foundation.py
new file mode 100644
index 000000000..83cbcb242
--- /dev/null
+++ b/testcases/Controllers/ONOS/Teston/CI/adapters/foundation.py
@@ -0,0 +1,90 @@
+"""
+Description:
+ This file include basis functions
+ lanqinglong@huawei.com
+"""
+
+import logging
+import os
+import time
+import yaml
+import re
+import datetime
+
+class foundation:
+
+ def __init__(self):
+
+ #currentpath = os.getcwd()
+ REPO_PATH = os.environ['repos_dir']+'/functest/'
+ currentpath = REPO_PATH + 'testcases/Controllers/ONOS/Teston/CI'
+ self.cipath = currentpath
+ self.logdir = os.path.join( currentpath, 'log' )
+ self.workhome = currentpath[0:currentpath.rfind('testcases')-1]
+ self.Result_DB = ''
+ filename = time.strftime( '%Y-%m-%d-%H-%M-%S' ) + '.log'
+ self.logfilepath = os.path.join( self.logdir, filename )
+ self.starttime = datetime.datetime.now()
+
+ def log (self, loginfo):
+ """
+ Record log in log directory for deploying test environment
+ parameters:
+ loginfo(input): record info
+ """
+ logging.basicConfig( level=logging.INFO,
+ format = '%(asctime)s %(filename)s:%(message)s',
+ datefmt = '%d %b %Y %H:%M:%S',
+ filename = self.logfilepath,
+ filemode = 'w')
+ filelog = logging.FileHandler( self.logfilepath )
+ logging.getLogger( 'Functest' ).addHandler( filelog )
+ print loginfo
+ logging.info(loginfo)
+
+ def getdefaultpara( self ):
+ """
+ Get Default Parameters value
+ """
+ with open(self.workhome + "/testcases/config_functest.yaml") as f:
+ functest_yaml = yaml.safe_load(f)
+ f.close()
+
+ self.Result_DB = str(functest_yaml.get("results").get("test_db_url"))
+ self.masterusername = str(functest_yaml.get("ONOS").get("general").\
+ get('onosbench_username'))
+ self.masterpassword = str(functest_yaml.get("ONOS").get("general").\
+ get("onosbench_password"))
+ self.agentusername = str(functest_yaml.get("ONOS").get("general").\
+ get("onoscli_username"))
+ self.agentpassword = str(functest_yaml.get("ONOS").get("general").\
+ get("onoscli_password"))
+ self.runtimeout = functest_yaml.get("ONOS").get("general").get("runtimeout")
+ self.OCT = str(functest_yaml.get("ONOS").get("environment").get("OCT"))
+ self.OC1 = str(functest_yaml.get("ONOS").get("environment").get("OC1"))
+ self.OC2 = str(functest_yaml.get("ONOS").get("environment").get("OC2"))
+ self.OC3 = str(functest_yaml.get("ONOS").get("environment").get("OC3"))
+ self.OCN = str(functest_yaml.get("ONOS").get("environment").get("OCN"))
+ self.OCN2 = str(functest_yaml.get("ONOS").get("environment").get("OCN2"))
+ self.installer_master = str(functest_yaml.get("ONOS").get("environment").get("installer_master"))
+ self.installer_master_username = str(functest_yaml.get("ONOS").get("environment").get("installer_master_username"))
+ self.installer_master_password = str(functest_yaml.get("ONOS").get("environment").get("installer_master_password"))
+ self.hosts = [self.OC1, self.OCN, self.OCN2]
+ self.localhost = self.OCT
+
+ def GetResult( self ):
+ cmd = "cat " + self.logfilepath + " | grep Fail"
+ Resultbuffer = os.popen(cmd).read()
+ duration = datetime.datetime.now() - self.starttime
+ time.sleep(2)
+
+ if re.search("[1-9]+", Resultbuffer):
+ self.log("Testcase Fails\n" + Resultbuffer)
+ Result = "POK"
+ else:
+ self.log("Testcases Pass")
+ Result = "OK"
+ payload={'timestart': str(self.starttime),
+ 'duration': str(duration),
+ 'status': Result}
+ return payload
diff --git a/testcases/Controllers/ONOS/Teston/CI/dependencies/onos b/testcases/Controllers/ONOS/Teston/CI/dependencies/onos
new file mode 100644
index 000000000..d4d59e0f7
--- /dev/null
+++ b/testcases/Controllers/ONOS/Teston/CI/dependencies/onos
@@ -0,0 +1,23 @@
+#!/bin/bash
+# -----------------------------------------------------------------------------
+# ONOS remote command-line client.
+# -----------------------------------------------------------------------------
+
+[ ! -d "$ONOS_ROOT" ] && echo "ONOS_ROOT is not defined" >&2 && exit 1
+. /root/.bashrc
+. $ONOS_ROOT/tools/build/envDefaults
+. $ONOS_ROOT/tools/test/bin/find-node.sh
+
+[ "$1" = "-w" ] && shift && onos-wait-for-start $1
+
+[ -n "$1" ] && OCI=$(find_node $1) && shift
+
+if which client 1>/dev/null 2>&1 && [ -z "$ONOS_USE_SSH" ]; then
+ # Use Karaf client only if we can and are allowed to
+ unset KARAF_HOME
+ client -h $OCI -u karaf "$@" 2>/dev/null
+else
+ # Otherwise use raw ssh; strict checking is off for dev environments only
+ #ssh -p 8101 -o StrictHostKeyChecking=no $OCI "$@"
+ sshpass -p karaf ssh -l karaf -p 8101 $OCI "$@"
+fi
diff --git a/testcases/Controllers/ONOS/Teston/CI/log/gitignore b/testcases/Controllers/ONOS/Teston/CI/log/gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/testcases/Controllers/ONOS/Teston/CI/log/gitignore
diff --git a/testcases/Controllers/ONOS/Teston/CI/onosfunctest.py b/testcases/Controllers/ONOS/Teston/CI/onosfunctest.py
new file mode 100644
index 000000000..675b3fc68
--- /dev/null
+++ b/testcases/Controllers/ONOS/Teston/CI/onosfunctest.py
@@ -0,0 +1,24 @@
+"""
+Description: This test is to run onos Teston VTN scripts
+
+List of test cases:
+CASE1 - Northbound NBI test network/subnet/ports
+CASE2 - Ovsdb test&Default configuration&Vm go online
+
+lanqinglong@huawei.com
+"""
+from adapters.client import client
+
+if __name__=="__main__":
+
+ main = client()
+ main.getdefaultpara()
+
+ #scripts to run
+ runhandle = main.onosstart()
+ main.RunScript(runhandle, "FUNCvirNetNB")
+# main.RunScript(runhandle, "FUNCovsdbtest")
+ main.RunScript(runhandle, "FUNCvirNetNBL3")
+# main.RunScript(runhandle, "FUNCovsdbtestL3")
+ main.onosclean( runhandle )
+ main.push_results_to_db(main.GetResult())