CORD-2650 adding more functional tests to dataplane test and using control plane datafile
Change-Id: If2638486e54773017812079f38fd868663d328c3
(cherry picked from commit 9b31109c3cf0259a111c474103b904ff0980a9a9)
diff --git a/Jenkinsfile-ecord-global b/Jenkinsfile-ecord-global
index 431df57..8351f9d 100644
--- a/Jenkinsfile-ecord-global
+++ b/Jenkinsfile-ecord-global
@@ -63,15 +63,16 @@
try {
sh """
if [ -d RobotLogs ]; then rm -r RobotLogs; fi; mkdir RobotLogs
+ mkdir RobotLogs/TestDoc || true
scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/cord-api/Log/* ./RobotLogs || true
scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/robot/Log/* ./RobotLogs || true
scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/diag/Log/* ./RobotLogs || true
- scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/diag/TestDoc/* ./RobotLogs/TestDocs || true
+ scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/diag/TestDoc/* ./RobotLogs/TestDoc || true
"""
step([$class: 'RobotPublisher',
disableArchiveOutput: false,
logFileName: 'RobotLogs/log*.html',
- otherFiles: 'RobotLogs/TestDocs/*.html',
+ otherFiles: 'RobotLogs/TestDoc/*.html',
outputFileName: 'RobotLogs/output*.xml',
outputPath: '.',
passThreshold: 100,
diff --git a/Jenkinsfile-ecord-local b/Jenkinsfile-ecord-local
index b2737d1..28ab7cb 100644
--- a/Jenkinsfile-ecord-local
+++ b/Jenkinsfile-ecord-local
@@ -90,17 +90,18 @@
try {
sh """
if [ -d RobotLogs ]; then rm -r RobotLogs; fi; mkdir RobotLogs
+ mkdir RobotLogs/TestDoc || true
scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/cord-api/Log/* ./RobotLogs || true
scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/robot/Log/* ./RobotLogs || true
scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/diag/Log/* ./RobotLogs || true
- scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/robot/TestDoc/* ./RobotLogs/TestDocs || true
- scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/diag/TestDoc/* ./RobotLogs/TestDocs || true
+ scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/robot/TestDoc/* ./RobotLogs/TestDoc || true
+ scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/diag/TestDoc/* ./RobotLogs/TestDoc || true
"""
step([$class: 'RobotPublisher',
disableArchiveOutput: false,
logFileName: 'RobotLogs/log*.html',
- otherFiles: 'RobotLogs/TestDocs/*.html',
+ otherFiles: 'RobotLogs/TestDoc/*.html',
outputFileName: 'RobotLogs/output*.xml',
outputPath: '.',
passThreshold: 100,
diff --git a/Jenkinsfile-mcord b/Jenkinsfile-mcord
index f336625..62a2d31 100644
--- a/Jenkinsfile-mcord
+++ b/Jenkinsfile-mcord
@@ -90,16 +90,17 @@
try {
sh """
if [ -d RobotLogs ]; then rm -r RobotLogs; fi; mkdir RobotLogs
+ mkdir RobotLogs/TestDoc || true
scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/cord-api/Log/* ./RobotLogs || true
scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/robot/Log/* ./RobotLogs || true
scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/diag/Log/* ./RobotLogs || true
- scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/robot/TestDoc/* ./RobotLogs/TestDocs || true
- scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/diag/TestDoc/* ./RobotLogs/TestDocs || true
+ scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/robot/TestDoc/* ./RobotLogs/TestDoc || true
+ scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/diag/TestDoc/* ./RobotLogs/TestDoc || true
"""
step([$class: 'RobotPublisher',
disableArchiveOutput: false,
logFileName: 'RobotLogs/log*.html',
- otherFiles: 'RobotLogs/TestDocs/*.html',
+ otherFiles: 'RobotLogs/TestDoc/*.html',
outputFileName: 'RobotLogs/output*.xml',
outputPath: '.',
passThreshold: 100,
diff --git a/Jenkinsfile-rcord b/Jenkinsfile-rcord
index 42817f0..48201ab 100644
--- a/Jenkinsfile-rcord
+++ b/Jenkinsfile-rcord
@@ -156,9 +156,7 @@
rm -r Log/ || true
rm -r TestDoc/ || true
mkdir TestDoc || true
- ssh-agent bash
- ssh-add
- pybot -L TRACE -d Log -T vsg_dataplane_test.robot
+ pybot -L TRACE -v pod:${deployment_config.pod_config.file_name} -d Log -T vsg_dataplane_test.robot
python -m robot.testdoc vsg_dataplane_test.robot TestDoc/vsg_dataplane_test.html
""")
} catch(error) { currentBuild.result = 'FAILURE' }
@@ -167,20 +165,21 @@
stage('Publish') {
try {
sh """
- if [ -d RobotLogs ]; then rm -r RobotLogs; fi; mkdir RobotLogs
+ if [ -d RobotLogs ]; then rm -r RobotLogs; fi; mkdir RobotLogs;
+ mkdir RobotLogs/TestDoc || true
scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/cord-api/Log/* ./RobotLogs || true
scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/robot/Log/* ./RobotLogs || true
scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/diag/Log/* ./RobotLogs || true
scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/vsg/Log/* ./RobotLogs || true
- scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/cord-api/TestDoc/* ./RobotLogs/TestDocs || true
- scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/robot/TestDoc/* ./RobotLogs/TestDocs || true
- scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/diag/TestDoc/* ./RobotLogs/TestDocs || true
- scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/vsg/TestDoc/* ./RobotLogs/TestDocs || true
+ scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/cord-api/TestDoc/* ./RobotLogs/TestDoc || true
+ scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/robot/TestDoc/* ./RobotLogs/TestDoc || true
+ scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/diag/TestDoc/* ./RobotLogs/TestDoc || true
+ scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/vsg/TestDoc/* ./RobotLogs/TestDoc || true
"""
step([$class: 'RobotPublisher',
disableArchiveOutput: false,
logFileName: 'RobotLogs/log*.html',
- otherFiles: 'RobotLogs/TestDocs/*.html',
+ otherFiles: 'RobotLogs/TestDoc/*.html',
outputFileName: 'RobotLogs/output*.xml',
outputPath: '.',
passThreshold: 100,
diff --git a/src/test/setup/calix_fabric_test_netcfg.json b/src/test/setup/calix_fabric_test_netcfg.json
new file mode 100644
index 0000000..de4defd
--- /dev/null
+++ b/src/test/setup/calix_fabric_test_netcfg.json
@@ -0,0 +1,92 @@
+{
+ "devices": {
+ "of:0000480fcfae6e0a": {
+ "segmentrouting": {
+ "name": "device-480fcfae6e0a",
+ "ipv4NodeSid": 100,
+ "ipv4Loopback": "10.6.0.102",
+ "routerMac": "48:0f:cf:ae:6e:0a",
+ "isEdgeRouter": false,
+ "adjacencySids": []
+ }
+ },
+ "of:0000480fcfaedea8": {
+ "segmentrouting": {
+ "name": "device-480fcfaedea8",
+ "ipv4NodeSid": 101,
+ "ipv4Loopback": "10.6.0.104",
+ "routerMac": "48:0f:cf:ae:de:a8",
+ "isEdgeRouter": true,
+ "adjacencySids": []
+ }
+ },
+ "of:0000480fcfae8e12": {
+ "segmentrouting": {
+ "name": "device-480fcfae8e12",
+ "ipv4NodeSid": 102,
+ "ipv4Loopback": "10.6.0.101",
+ "routerMac": "48:0f:cf:ae:8e:12",
+ "isEdgeRouter": false,
+ "adjacencySids": []
+ }
+ },
+ "of:0000480fcfaeeeac": {
+ "segmentrouting": {
+ "name": "device-480fcfaeeeac",
+ "ipv4NodeSid": 103,
+ "ipv4Loopback": "10.6.0.103",
+ "routerMac": "48:0f:cf:ae:ee:ac",
+ "isEdgeRouter": true,
+ "adjacencySids": []
+ }
+ }
+ },
+ "ports": {
+ "of:0000480fcfaedea8/2": {
+ "interfaces": [
+ {
+ "ips": [ "10.6.2.254/24" ],
+ "vlan-untagged" : 2
+ }
+ ]
+ },
+ "of:0000480fcfaedea8/1": {
+ "interfaces": [
+ {
+ "ips": [ "10.6.2.254/24" ],
+ "vlan-untagged" : 2
+ }
+ ]
+ },
+ "of:0000480fcfaeeeac/1": {
+ "interfaces": [
+ {
+ "ips": [ "10.6.1.254/24" ],
+ "vlan-untagged" : 1
+ }
+ ]
+ }
+ },
+ "apps" : {
+ "org.onosproject.segmentrouting" : {
+ "segmentrouting" : {
+ "vRouterMacs" : [ "a4:23:05:06:01:01" ]
+ },
+ "xconnect": {
+ "of:0000480fcfaedea8": [{
+ "vlan": 333,
+ "ports": [1, 2],
+ "name": "vsg-1"
+ },
+ {
+ "vlan": 555,
+ "ports": [1, 2],
+ "name": "vsg-2"},
+ {
+ "vlan": 666,
+ "ports": [1, 2],
+ "name": "vsg-3"}]
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/test/setup/cord-test.py b/src/test/setup/cord-test.py
index 4838e49..e7f3f3a 100755
--- a/src/test/setup/cord-test.py
+++ b/src/test/setup/cord-test.py
@@ -1397,7 +1397,7 @@
if args.onos_cord:
#try restoring the onos cord instance
try:
- onos_cord = OnosCord(args.onos_ip, args.onos_cord, args.service_profile, args.synchronizer, start = False, skip = test_manifest.skip_onos_restart)
+ onos_cord = OnosCord(args.onos_ip, args.onos_cord, args.service_profile, args.synchronizer, start = False, skip = manifest.skip_onos_restart)
onos_cord.restore(force = True)
except Exception as e:
print(e)
diff --git a/src/test/vsg/vsg_dataplane_test.robot b/src/test/vsg/vsg_dataplane_test.robot
index c57e795..1fb7ebb 100644
--- a/src/test/vsg/vsg_dataplane_test.robot
+++ b/src/test/vsg/vsg_dataplane_test.robot
@@ -13,7 +13,8 @@
# limitations under the License.
*** Settings ***
-Test Timeout 2 minutes
+Suite Setup Setup
+Test Timeout 10 minutes
Documentation Validates external connectivity from Cord-Tester Container through VSG Subscriber
Library OperatingSystem
Library SSHLibrary
@@ -23,16 +24,42 @@
Resource /opt/cord/test/cord-tester/src/test/cord-api/Framework/utils/utils.robot
*** Variables ***
-${netcfg_file} qct_fabric_test_netcfg.json
+${pod} qct-pod1.yml
+${vsg_data_file} /opt/cord/test/cord-tester/src/test/cord-api/Tests/data/Ch_VoltTenant.json
*** Test Cases ***
+Validate Instances are ACTIVE
+ [Documentation] Validates that all instances are ACTIVE
+ Wait Until Keyword Succeeds 300s 5s Instances ACTIVE
+
+Validate Connectivity to All VSGs via Mgmt Interface
+ [Documentation] Validates that all given vsg instances are reachable through the mgmt interfaces
+ ##Loop through nova ids, get mgmt ips + compute nodes, ssh into compute node, and validate ping to mgmt_ip
+ : FOR ${nova_id} IN @{nova_ids}
+ \ ${mgmt_ip}= Run . /opt/cord_profile/admin-openrc.sh; nova show ${nova_id} | grep management | awk '{print $5}'
+ \ ${node}= Run . /opt/cord_profile/admin-openrc.sh; nova show ${nova_id} | grep :host | awk '{print $4}'
+ \ ${ping_result}= Run ssh ubuntu@${node} ping -c 1 ${mgmt_ip}
+ \ Should Contain ${ping_result} 64 bytes from ${mgmt_ip}
+ \ Should Not Contain ${ping_result} 100% packet loss
+
+Validate VSG External Connectivity
+ [Documentation] Validates that the given vsg instances have external connectivity
+ : FOR ${nova_id} IN @{nova_ids}
+ \ ${mgmt_ip}= Run . /opt/cord_profile/admin-openrc.sh; nova show ${nova_id} | grep management | awk '{print $5}'
+ \ ${node}= Run . /opt/cord_profile/admin-openrc.sh; nova show ${nova_id} | grep :host | awk '{print $4}'
+ \ Wait Until Keyword Succeeds 300s 5s Validate Ext Connectivity ${node} ${mgmt_ip}
+
Configure X-Connects for 3 Subscribers
- [Documentation] Configures the cross connect on the fabric switch with s-tags for the subscribers created via control-plane tests on the correct ports
+ [Documentation] Configures the cross connect on the fabric switch with s-tags for the subscribers created via control-plane tests on the correct ports
+ [Tags] xconnect
${netcfg_init}= onosUtils.onos_command_execute onos-fabric 8101 netcfg
Log ${netcfg_init}
Run http -a onos:rocks DELETE http://onos-fabric:8181/onos/v1/network/configuration/
+ Sleep 5
Run http -a onos:rocks POST http://onos-fabric:8181/onos/v1/network/configuration/ < /opt/cord/test/cord-tester/src/test/setup/${netcfg_file}
+ Sleep 5
Run http -a onos:rocks DELETE http://onos-fabric:8181/onos/v1/applications/org.onosproject.segmentrouting/active
+ Sleep 5
Run http -a onos:rocks POST http://onos-fabric:8181/onos/v1/applications/org.onosproject.segmentrouting/active
Sleep 5
${netcfg}= onosUtils.onos_command_execute onos-fabric 8101 netcfg
@@ -40,9 +67,23 @@
Should Contain ${netcfg} vsg-1
Should Contain ${netcfg} vsg-2
Should Contain ${netcfg} vsg-3
- Should Contain ${netcfg} "vlan" : 333
- Should Contain ${netcfg} "vlan" : 555
- Should Contain ${netcfg} "vlan" : 666
+ Should Contain ${netcfg} "vlan" : ${s_tags[0]}
+ Should Contain ${netcfg} "vlan" : ${s_tags[1]}
+ Should Contain ${netcfg} "vlan" : ${s_tags[2]}
+
+Validate VSG External Connectivity Again
+ [Documentation] Validates that the given vsg instances have external connectivity even after onos-fabric has been re-configured
+ : FOR ${nova_id} IN @{nova_ids}
+ \ ${mgmt_ip}= Run . /opt/cord_profile/admin-openrc.sh; nova show ${nova_id} | grep management | awk '{print $5}'
+ \ ${node}= Run . /opt/cord_profile/admin-openrc.sh; nova show ${nova_id} | grep :host | awk '{print $4}'
+ \ Wait Until Keyword Succeeds 300s 5s Validate Ext Connectivity ${node} ${mgmt_ip}
+
+Validate VCPE Containers
+ [Documentation] Validates that vcpes containers are up in each vsg instance
+ : FOR ${nova_id} IN @{nova_ids}
+ \ ${mgmt_ip}= Run . /opt/cord_profile/admin-openrc.sh; nova show ${nova_id} | grep management | awk '{print $5}'
+ \ ${node}= Run . /opt/cord_profile/admin-openrc.sh; nova show ${nova_id} | grep :host | awk '{print $4}'
+ \ Wait Until Keyword Succeeds 800s 5s Validate VCPE Container is Up ${node} ${mgmt_ip}
Get VSG Subscriber and Tags
[Documentation] Retrieves compute node connected on leaf-1 and s/c tags for that particular subscriber
@@ -57,9 +98,7 @@
\ Run Keyword If '${node}' == '${cnode_on_leaf_1[0]}' Exit For Loop
${mgmt_ip}= Run . /opt/cord_profile/admin-openrc.sh; nova show ${nova_id} | grep management | awk '{print $5}'
## Get s/c tags for vsg
- Run ssh-agent bash \r
- Run ssh-add
- ${result}= Run ssh -A ubuntu@${cnode_on_leaf_1[0]} ssh ubuntu@${mgmt_ip} sudo docker ps | grep vsg- | awk '{print $10}'
+ ${result}= Run ssh -o ProxyCommand="ssh -W %h:%p -l ubuntu ${cnode_on_leaf_1[0]}" ubuntu@${mgmt_ip} "sudo docker ps|grep 'vsg\\|vcpe'" | awk '{print $10}'
@{tags}= Split String ${result} -
${s_tag}= Set Variable ${tags[1]}
${c_tag}= Set Variable ${tags[2]}
@@ -68,10 +107,11 @@
Execute Dataplane Test
[Documentation] Configures interfaces on cord-tester container to connect to vsg instance and validates traffic
+ [Tags] dataplane
${i_num}= Set Variable If
- ... '${s_tag}' == '333' 1
- ... '${s_tag}' == '555' 2
- ... '${s_tag}' == '666' 3
+ ... '${s_tag}' == '${s_tags[0]}' 1
+ ... '${s_tag}' == '${s_tags[1]}' 2
+ ... '${s_tag}' == '${s_tags[2]}' 3
${output}= Run docker exec cord-tester1 bash -c "sudo echo 'nameserver 192.168.0.1' > /etc/resolv.conf"
${output}= Run docker exec cord-tester1 bash -c "sudo dhclient vcpe${i_num}.${s_tag}.${c_tag}"
Sleep 5
@@ -79,4 +119,56 @@
${output}= Run docker exec cord-tester1 bash -c "ping -c 3 -I vcpe${i_num}.${s_tag}.${c_tag} 8.8.8.8"
Log To Console \n ${output}
Should Contain ${output} 64 bytes from 8.8.8.8
- Should Not Contain ${output} 100% packet loss
\ No newline at end of file
+ Should Not Contain ${output} 100% packet loss
+
+*** Keywords ***
+Setup
+ [Documentation] Gets global vars for test suite
+ @{s_tags}= Create List
+ @{c_tags}= Create List
+ ${netcfg_file}= Set Variable If
+ ... '${pod}' == 'qct-pod1.yml' qct_fabric_test_netcfg.json
+ ... '${pod}' == 'flex-pod1.yml' flex_fabric_test_netcfg.json
+ ... '${pod}' == 'calix-pod1.yml' calix_fabric_test_netcfg.json
+ Set Suite Variable ${netcfg_file}
+ ${voltList} = utils.jsonToList ${vsg_data_file} voltSubscriberInfo
+ Set Suite Variable ${vlist} ${voltList}
+ ${voltTenantList} = Get Variable Value ${vlist}
+ ${vsg_count}= Get Length ${vlist}
+ Set Suite Variable ${vsg_count}
+ : FOR ${INDEX} IN RANGE 0 ${vsg_count}
+ \ ${voltTenantDict}= utils.listToDict ${voltTenantList} ${INDEX}
+ \ ${voltDict}= Get From Dictionary ${voltTenantDict} voltTenant
+ \ ${s_tag}= Get From Dictionary ${voltDict} s_tag
+ \ ${c_tag}= Get From Dictionary ${voltDict} c_tag
+ \ Append To List ${s_tags} ${s_tag}
+ \ Append To List ${c_tags} ${c_tag}
+ @{nova_ids}= Wait Until Keyword Succeeds 120s 5s Validate Number of VSGs ${vsg_count}
+ Set Suite Variable @{nova_ids}
+ Set Suite Variable ${s_tags}
+ Set Suite Variable ${c_tags}
+
+Validate Number of VSGs
+ [Arguments] ${count}
+ ${novalist}= Run . /opt/cord_profile/admin-openrc.sh; nova list --all-tenants | awk '{print $2}' | grep '[a-z]'
+ Log ${novalist}
+ @{nova_ids}= Split To Lines ${novalist}
+ ${vsgCount}= Get Length ${nova_ids}
+ Should Be Equal ${vsgCount} ${count}
+ [Return] @{nova_ids}
+
+Instances ACTIVE
+ : FOR ${nova_id} IN @{nova_ids}
+ \ ${status}= Run . /opt/cord_profile/admin-openrc.sh; nova show ${nova_id} | grep status | awk '{print $4}'
+ \ Should Be Equal ${status} ACTIVE
+
+Validate Ext Connectivity
+ [Arguments] ${compute_node} ${vsg_ip}
+ ${ping_ext_result}= Run ssh -o ProxyCommand="ssh -W %h:%p -l ubuntu ${compute_node}" ubuntu@${vsg_ip} "ping -c 3 8.8.8.8"
+ Should Contain ${ping_ext_result} 64 bytes from 8.8.8.8
+ Should Not Contain ${ping_ext_result} 100% packet loss
+
+Validate VCPE Container is Up
+ [Arguments] ${compute_node} ${vsg_ip}
+ ${docker_containers}= Run ssh -o ProxyCommand="ssh -W %h:%p -l ubuntu ${compute_node}" ubuntu@${vsg_ip} sudo docker ps | wc -l
+ Should Not Contain ${docker_containers} 0
\ No newline at end of file