diff --git a/Jenkinsfile-ecord-global b/Jenkinsfile-ecord-global
deleted file mode 100644
index 3215d61..0000000
--- a/Jenkinsfile-ecord-global
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright 2017-present Open Networking Foundation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-pod_config = null
-deployment_config = null
-
-
-node ("${devNodeName}") {
-
-    stage ("Parse deployment configuration file") {
-        sh returnStdout: true, script: 'rm -rf ${configRepoBaseDir}'
-        sh returnStdout: true, script: 'git clone -b ${branch} ${configRepoUrl}'
-        deployment_config = readYaml file: "${configRepoBaseDir}${configRepoFile}"
-        pod_config = readYaml file: "${configRepoBaseDir}${deployment_config.pod_config.file_name}"
-    }
-
-    stage('Prerequisites') {
-        runHeadNodeCmd("""
-        cd /opt/cord/test/cord-tester/src/test/setup
-        sudo ./prerequisites.sh --cord
-        """)
-    }
-    stage('Verify Collect Diag') {
-        timeout(10) {
-            try {
-                runHeadNodeCmd("""
-                export SERVER_IP=localhost
-                export SERVER_PORT=9101
-                export XOS_USER=xosadmin@opencord.org
-                export XOS_PASSWD=\\\$(cat /opt/credentials/xosadmin@opencord.org)
-                rm -rf ~/diag-*
-                cd /opt/cord/build; make collect-diag
-                cd /opt/cord/test/cord-tester/src/test/diag/
-                rm -r Log/ || true
-                rm -r TestDoc/ || true
-                mkdir TestDoc || true
-                pybot -v CORD_PROFILE:${pod_config.cord_profile} -d Log -T verifyCollectDiag.robot
-                python -m robot.testdoc verifyCollectDiag.robot TestDoc/verifyCollectDiag.html
-                """)
-            } catch(error) { currentBuild.result = 'FAILURE' }
-        }
-    }
-    stage('XOS API Tests') {
-        timeout(10) {
-            try {
-                runHeadNodeCmd("""
-                export SERVER_IP=localhost
-                export SERVER_PORT=9101
-                export XOS_USER=xosadmin@opencord.org
-                export XOS_PASSWD=\\\$(cat /opt/credentials/xosadmin@opencord.org)
-                """)
-            } catch(error) { currentBuild.result = 'FAILURE' }
-        }
-    }
-    stage('Publish') {
-        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/TestDoc || true
-            """
-            step([$class: 'RobotPublisher',
-                disableArchiveOutput: false,
-                logFileName: 'RobotLogs/log*.html',
-                otherFiles: 'RobotLogs/TestDoc/*.html',
-                outputFileName: 'RobotLogs/output*.xml',
-                outputPath: '.',
-                passThreshold: 100,
-                reportFileName: 'RobotLogs/report*.html',
-                unstableThreshold: 0])
-        } catch(error) {}
-    }
-    step([$class: 'Mailer', notifyEveryUnstableBuild: true, recipients: "${notificationEmail}", sendToIndividuals: false])
-}
-
-/**
- * Runs a command on the head node.
- *
- * @param command the command to run
- * @param sshArgs arguments for the ssh command
- * @return the output of the command
- */
-def runHeadNodeCmd(command, sshArgs="") {
-    return sh(returnStdout: true, script: "sshpass -p ${deployment_config.head.pass} ssh ${sshArgs} -oStrictHostKeyChecking=no -l ${deployment_config.head.user} ${deployment_config.head.ip} \"${command}\"")
-}
diff --git a/Jenkinsfile-ecord-local b/Jenkinsfile-ecord-local
deleted file mode 100644
index 050621a..0000000
--- a/Jenkinsfile-ecord-local
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright 2017-present Open Networking Foundation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-pod_config = null
-deployment_config = null
-
-node ("${devNodeName}") {
-
-    stage ("Parse deployment configuration file") {
-        sh returnStdout: true, script: 'rm -rf ${configRepoBaseDir}'
-        sh returnStdout: true, script: 'git clone -b ${branch} ${configRepoUrl}'
-        deployment_config = readYaml file: "${configRepoBaseDir}${configRepoFile}"
-        pod_config = readYaml file: "${configRepoBaseDir}${deployment_config.pod_config.file_name}"
-    }
-
-    stage('Prerequisites') {
-        runHeadNodeCmd("""
-        cd /opt/cord/test/cord-tester/src/test/setup
-        sudo ./prerequisites.sh --cord
-        """)
-    }
-    stage('Verify Collect Diag') {
-        timeout(10) {
-            try {
-                runHeadNodeCmd("""
-                export SERVER_IP=localhost
-                export SERVER_PORT=9101
-                export XOS_USER=xosadmin@opencord.org
-                export XOS_PASSWD=\\\$(cat /opt/credentials/xosadmin@opencord.org)
-                rm -rf ~/diag-*
-                cd /opt/cord/build; make collect-diag
-                cd /opt/cord/test/cord-tester/src/test/diag/
-                rm -r Log/ || true
-                rm -r TestDoc/ || true
-                mkdir TestDoc || true
-                pybot -v CORD_PROFILE:${pod_config.cord_profile} -d Log -T verifyCollectDiag.robot
-                python -m robot.testdoc verifyCollectDiag.robot TestDoc/verifyCollectDiag.html
-                """)
-            } catch(error) { currentBuild.result = 'FAILURE' }
-        }
-    }
-    stage('Sanity Test') {
-        timeout(10) {
-            try {
-                runHeadNodeCmd("""
-                export SERVER_IP=localhost
-                export SERVER_PORT=9101
-                export XOS_USER=xosadmin@opencord.org
-                export XOS_PASSWD=\\\$(cat /opt/credentials/xosadmin@opencord.org)
-                cd /opt/cord/test/cord-tester/src/test/robot/
-                rm -r Log/ || true
-                rm -r TestDoc/ || true
-                mkdir TestDoc || true
-                """)
-                if (deployment_config.fabric_switches != null) {
-                    runHeadNodeCmd("""
-                    export SERVER_IP=localhost
-                    export SERVER_PORT=9101
-                    export XOS_USER=xosadmin@opencord.org
-                    export XOS_PASSWD=\\\$(cat /opt/credentials/xosadmin@opencord.org)
-                    cd /opt/cord/test/cord-tester/src/test/robot/
-                    pybot --exclude notready -v FABRIC:on -v PUBLIC_IFACE:${pod_config.external_iface} -v CORD_PROFILE:${pod_config.cord_profile} -d Log -T SanityPhyPOD.robot
-                    python -m robot.testdoc SanityPhyPOD.robot TestDoc/SanityPhyPOD.html
-                    """)
-                }
-                else {
-                    // Exclude fabric related tests
-                    runHeadNodeCmd("""
-                    export SERVER_IP=localhost
-                    export SERVER_PORT=9101
-                    export XOS_USER=xosadmin@opencord.org
-                    export XOS_PASSWD=\\\$(cat /opt/credentials/xosadmin@opencord.org)
-                    cd /opt/cord/test/cord-tester/src/test/robot/
-                    pybot --exclude notready --exclude fabric -v FABRIC:off -v PUBLIC_IFACE:${pod_config.external_iface} -v CORD_PROFILE:${pod_config.cord_profile} -d Log -T SanityPhyPOD.robot
-                    python -m robot.testdoc SanityPhyPOD.robot TestDoc/SanityPhyPOD.html
-                    """)
-                }
-            } catch(error) { currentBuild.result = 'FAILURE' }
-        }
-    }
-    stage('XOS API Tests') {
-        timeout(10) {
-            try {
-                runHeadNodeCmd("""
-                export SERVER_IP=localhost
-                export SERVER_PORT=9101
-                export XOS_USER=xosadmin@opencord.org
-                export XOS_PASSWD=\\\$(cat /opt/credentials/xosadmin@opencord.org)
-                """)
-            } catch(error) { currentBuild.result = 'FAILURE' }
-        }
-    }
-    stage('Publish') {
-        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/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/TestDoc/*.html',
-                outputFileName: 'RobotLogs/output*.xml',
-                outputPath: '.',
-                passThreshold: 100,
-                reportFileName: 'RobotLogs/report*.html',
-                unstableThreshold: 0])
-        } catch(error) {}
-    }
-    step([$class: 'Mailer', notifyEveryUnstableBuild: true, recipients: "${notificationEmail}", sendToIndividuals: false])
-}
-
-/**
- * Runs a command on the head node.
- *
- * @param command the command to run
- * @param sshArgs arguments for the ssh command
- * @return the output of the command
- */
-def runHeadNodeCmd(command, sshArgs="") {
-    return sh(returnStdout: true, script: "sshpass -p ${deployment_config.head.pass} ssh ${sshArgs} -oStrictHostKeyChecking=no -l ${deployment_config.head.user} ${deployment_config.head.ip} \"${command}\"")
-}
diff --git a/Jenkinsfile-mcord b/Jenkinsfile-mcord
deleted file mode 100644
index d3070c2..0000000
--- a/Jenkinsfile-mcord
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright 2017-present Open Networking Foundation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-pod_config = null
-deployment_config = null
-
-
-node ("${devNodeName}") {
-
-    stage ("Parse deployment configuration file") {
-        sh returnStdout: true, script: 'rm -rf ${configRepoBaseDir}'
-        sh returnStdout: true, script: 'git clone -b ${branch} ${configRepoUrl}'
-        deployment_config = readYaml file: "${configRepoBaseDir}${configRepoFile}"
-        pod_config = readYaml file: "${configRepoBaseDir}${deployment_config.pod_config.file_name}"
-    }
-
-    stage('Prerequisites') {
-        runHeadNodeCmd("""
-        cd /opt/cord/test/cord-tester/src/test/setup
-        sudo ./prerequisites.sh --cord
-        """)
-    }
-    stage('Verify Collect Diag') {
-        timeout(10) {
-            try {
-                runHeadNodeCmd("""
-                export SERVER_IP=localhost
-                export SERVER_PORT=9101
-                export XOS_USER=xosadmin@opencord.org
-                export XOS_PASSWD=\\\$(cat /opt/credentials/xosadmin@opencord.org)
-                rm -rf ~/diag-*
-                cd /opt/cord/build; make collect-diag
-                cd /opt/cord/test/cord-tester/src/test/diag/
-                rm -r Log/ || true
-                rm -r TestDoc/ || true
-                mkdir TestDoc || true
-                pybot -v CORD_PROFILE:${pod_config.cord_profile} -d Log -T verifyCollectDiag.robot
-                python -m robot.testdoc verifyCollectDiag.robot TestDoc/verifyCollectDiag.html
-                """)
-            } catch(error) { currentBuild.result = 'FAILURE' }
-        }
-    }
-    stage('Sanity Test') {
-        timeout(10) {
-            try {
-                runHeadNodeCmd("""
-                export SERVER_IP=localhost
-                export SERVER_PORT=9101
-                export XOS_USER=xosadmin@opencord.org
-                export XOS_PASSWD=\\\$(cat /opt/credentials/xosadmin@opencord.org)
-                cd /opt/cord/test/cord-tester/src/test/robot/
-                rm -r Log/ || true
-                rm -r TestDoc/ || true
-                mkdir TestDoc || true
-                """)
-                if (deployment_config.fabric_switches != null) {
-                    runHeadNodeCmd("""
-                    export SERVER_IP=localhost
-                    export SERVER_PORT=9101
-                    export XOS_USER=xosadmin@opencord.org
-                    export XOS_PASSWD=\\\$(cat /opt/credentials/xosadmin@opencord.org)
-                    cd /opt/cord/test/cord-tester/src/test/robot/
-                    pybot --exclude notready -v FABRIC:on -v PUBLIC_IFACE:${pod_config.external_iface} -v CORD_PROFILE:${pod_config.cord_profile} -d Log -T SanityPhyPOD.robot
-                    python -m robot.testdoc SanityPhyPOD.robot TestDoc/SanityPhyPOD.html
-                    """)
-                }
-                else {
-                    // Exclude fabric related tests
-                    runHeadNodeCmd("""
-                    export SERVER_IP=localhost
-                    export SERVER_PORT=9101
-                    export XOS_USER=xosadmin@opencord.org
-                    export XOS_PASSWD=\\\$(cat /opt/credentials/xosadmin@opencord.org)
-                    cd /opt/cord/test/cord-tester/src/test/robot/
-                    pybot --exclude notready --exclude fabric -v FABRIC:off -v PUBLIC_IFACE:${pod_config.external_iface} -v CORD_PROFILE:${pod_config.cord_profile} -d Log -T SanityPhyPOD.robot
-                    python -m robot.testdoc SanityPhyPOD.robot TestDoc/SanityPhyPOD.html
-                    """)
-                }
-            } catch(error) { currentBuild.result = 'FAILURE' }
-        }
-    }
-    stage('XOS API Tests') {
-        timeout(10) {
-            try {
-                runHeadNodeCmd("""
-                export SERVER_IP=localhost
-                export SERVER_PORT=9101
-                export XOS_USER=xosadmin@opencord.org
-                export XOS_PASSWD=\\\$(cat /opt/credentials/xosadmin@opencord.org)
-                """)
-            } catch(error) { currentBuild.result = 'FAILURE' }
-        }
-    }
-    stage('Publish') {
-        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/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/TestDoc/*.html',
-                outputFileName: 'RobotLogs/output*.xml',
-                outputPath: '.',
-                passThreshold: 100,
-                reportFileName: 'RobotLogs/report*.html',
-                unstableThreshold: 0])
-        } catch(error) {}
-    }
-    step([$class: 'Mailer', notifyEveryUnstableBuild: true, recipients: "${notificationEmail}", sendToIndividuals: false])
-}
-
-/**
- * Runs a command on the head node.
- *
- * @param command the command to run
- * @param sshArgs arguments for the ssh command
- * @return the output of the command
- */
-def runHeadNodeCmd(command, sshArgs="") {
-    return sh(returnStdout: true, script: "sshpass -p ${deployment_config.head.pass} ssh ${sshArgs} -oStrictHostKeyChecking=no -l ${deployment_config.head.user} ${deployment_config.head.ip} \"${command}\"")
-}
diff --git a/Jenkinsfile-rcord b/Jenkinsfile-rcord
deleted file mode 100644
index b776daf..0000000
--- a/Jenkinsfile-rcord
+++ /dev/null
@@ -1,249 +0,0 @@
-// Copyright 2017-present Open Networking Foundation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-pod_config = null
-deployment_config = null
-
-node ("${devNodeName}") {
-
-    stage ("Parse deployment configuration file") {
-        sh returnStdout: true, script: 'rm -rf ${configRepoBaseDir}'
-        sh returnStdout: true, script: 'git clone -b ${branch} ${configRepoUrl}'
-        deployment_config = readYaml file: "${configRepoBaseDir}${configRepoFile}"
-        pod_config = readYaml file: "${configRepoBaseDir}${deployment_config.pod_config.file_name}"
-    }
-    stage('Prerequisites') {
-        runHeadNodeCmd("""
-        cd /opt/cord/test/cord-tester/src/test/setup
-        sudo ./prerequisites.sh --cord
-        """)
-    }
-    stage('Bring up Cord-Test Container') {
-        runHeadNodeCmd("""
-        cd /opt/cord/test/cord-tester/src/test/setup
-        sudo ./cord-test.py setup -m manifest-onf-cord.json
-        """)
-    }
-    stage('Configure Fabric for E2E testing') {
-        //FIXME: this only works for PODs with 2 leaf switches
-        fabricIpPrefix = pod_config.fabric_ip.split(/\.\d+\.\d+\/24/)[0]
-        runHeadNodeCmd("sudo ip route add ${fabricIpPrefix}.2.0/24 via ${fabricIpPrefix}.1.254 || echo route already exists")
-        runHeadNodeCmd("sudo route add -net 10.7.1.0/24 gw 10.6.1.254 || echo route already exists")
-        runHeadNodeCmd("sudo route add -net 10.8.1.0/24 gw 10.6.1.254 || echo route already exists")
-        runHeadNodeCmd("ping -c 1 ${fabricIpPrefix}.1.254", "-qftn")
-        runOnosCliCmd("onos-fabric", "8101", "onos", "rocks", "route-add 0.0.0.0/0 ${fabricIpPrefix}.1.1")
-        // Verify ONOS has recognized the hosts
-        timeout(time: 5) {
-            waitUntil {
-                try {
-                    num = runHeadNodeCmd("\"sshpass -p rocks ssh -q -oStrictHostKeyChecking=no -l onos -p 8101 onos-fabric hosts | grep id= | wc -l\"").trim()
-                    return num.toInteger() == deployment_config.compute_nodes.size() + 1
-                } catch (exception) {
-                    return false
-                }
-            }
-        }
-        // Generate network configuration
-        runHeadNodeCmd("""
-                       cd /opt/cord_profile/
-                       cp fabric-network-cfg.json fabric-network-cfg.json.\$(date +%Y%m%d-%H%M%S)
-                       cord generate > fabric-network-cfg.json
-                       """)
-        // Install httpie on the head-node
-        runHeadNodeCmd("sudo pip install httpie")
-        // Delete old ONOS netcfg
-        runHeadNodeCmd("http -a onos:rocks DELETE http://onos-fabric:8181/onos/v1/network/configuration/")
-        // Load new configuration
-        runHeadNodeCmd("http -a onos:rocks POST http://onos-fabric:8181/onos/v1/network/configuration/ < /opt/cord_profile/fabric-network-cfg.json")
-        // Restart ONOS apps
-        runHeadNodeCmd("""
-                       http -a onos:rocks DELETE http://onos-fabric:8181/onos/v1/applications/org.onosproject.segmentrouting/active; sleep 5
-                       http -a onos:rocks POST http://onos-fabric:8181/onos/v1/applications/org.onosproject.segmentrouting/active; sleep 5
-                       """)
-    }
-    stage('Verify Collect Diag') {
-        timeout(10) {
-            try {
-                runHeadNodeCmd("""
-                rm -rf ~/diag-*
-                cd /opt/cord/build; make collect-diag
-                cd /opt/cord/test/cord-tester/src/test/diag/
-                rm -r Log/ || true
-                rm -r TestDoc/ || true
-                mkdir TestDoc || true
-                export SERVER_IP=localhost
-                export SERVER_PORT=9101
-                export XOS_USER=xosadmin@opencord.org
-                export XOS_PASSWD=\\\$(cat /opt/credentials/xosadmin@opencord.org)
-                pybot -v CORD_PROFILE:${pod_config.cord_profile} -d Log -T verifyCollectDiag.robot
-                python -m robot.testdoc verifyCollectDiag.robot TestDoc/verifyCollectDiag.html
-                """)
-            } catch(error) { currentBuild.result = 'FAILURE' }
-        }
-    }
-    stage('Sanity Test') {
-        timeout(10) {
-            try {
-                runHeadNodeCmd("""
-                cd /opt/cord/test/cord-tester/src/test/robot/
-                rm -r Log/ || true
-                rm -r TestDoc/ || true
-                mkdir TestDoc
-                """)
-                if (deployment_config.fabric_switches != null) {
-                    runHeadNodeCmd("""
-                    export SERVER_IP=localhost
-                    export SERVER_PORT=9101
-                    export XOS_USER=xosadmin@opencord.org
-                    export XOS_PASSWD=\\\$(cat /opt/credentials/xosadmin@opencord.org)
-                    cd /opt/cord/test/cord-tester/src/test/robot/
-                    pybot --exclude notready -v FABRIC:on -v PUBLIC_IFACE:${pod_config.external_iface} -v CORD_PROFILE:${pod_config.cord_profile} -d Log -T SanityPhyPOD.robot
-                    python -m robot.testdoc SanityPhyPOD.robot TestDoc/SanityPhyPOD.html
-                    """)
-                }
-                else {
-                    // Exclude fabric related tests
-                    runHeadNodeCmd("""
-                    export SERVER_IP=localhost
-                    export SERVER_PORT=9101
-                    export XOS_USER=xosadmin@opencord.org
-                    export XOS_PASSWD=\\\$(cat /opt/credentials/xosadmin@opencord.org)
-                    cd /opt/cord/test/cord-tester/src/test/robot/
-                    pybot --exclude notready --exclude fabric -v FABRIC:off -v PUBLIC_IFACE:${pod_config.external_iface} -v CORD_PROFILE:${pod_config.cord_profile} -d Log -T SanityPhyPOD.robot
-                    python -m robot.testdoc SanityPhyPOD.robot TestDoc/SanityPhyPOD.html
-                    """)
-                }
-            } catch(error) { currentBuild.result = 'FAILURE' }
-        }
-    }
-    stage('XOS API Tests') {
-        timeout(10) {
-            try {
-                runHeadNodeCmd("""
-                export SERVER_IP=localhost
-                export SERVER_PORT=9101
-                export XOS_USER=xosadmin@opencord.org
-                export XOS_PASSWD=\\\$(cat /opt/credentials/xosadmin@opencord.org)
-                all_passed=true
-                cd /opt/cord/test/cord-tester/src/test/cord-api/
-                rm -r Log/ || true
-                rm -r TestDoc/ || true
-                mkdir TestDoc || true
-                pybot -d Log -T Tests/Ch_defaultImagesCheck.txt || all_passed=false
-                pybot -d Log -T -v PROFILE:${pod_config.cord_profile} Tests/Ch_DefaultServiceCheck.txt || all_passed=false
-                pybot -d Log -T Tests/Ch_SubscriberTest.txt || all_passed=false
-                pybot -d Log -T Tests/Ch_ServiceTest.txt || all_passed=false
-                pybot -d Log -T Tests/Ch_UsersTest.txt || all_passed=false
-                pybot -d Log -T Tests/Ch_DeploymentTest.txt || all_passed=false
-                pybot -d Log -T Tests/Ch_NodeTest.txt || all_passed=false
-                pybot -d Log -T Tests/Ch_SliceTest.txt || all_passed=false
-                pybot -d Log -T Tests/Ch_SanityInstance.txt || all_passed=false
-                pybot -d Log -T Tests/Ch_SanityFlavors.txt || all_passed=false
-                pybot -d Log -T Tests/Ch_SiteTest.txt || all_passed=false
-                python -m robot.testdoc Tests/Ch_*.txt TestDoc/XOSApiTests.html
-                if [ "\\\$all_passed" = true ]; then exit 0; else exit 1; fi
-                """)
-            } catch(error) { currentBuild.result = 'FAILURE' }
-        }
-    }
-    stage('Dataplane Test') {
-        timeout(30) {
-            try {
-                runHeadNodeCmd("""
-                export SERVER_IP=localhost
-                export SERVER_PORT=9101
-                export XOS_USER=xosadmin@opencord.org
-                export XOS_PASSWD=\$(cat /opt/credentials/xosadmin@opencord.org)
-                cd /opt/cord/test/cord-tester/src/test/vsg/
-                rm -r Log/ || true
-                rm -r TestDoc/ || true
-                mkdir TestDoc
-                """)
-                if (deployment_config.pod_config.file_name != 'calix-pod1.yml') {
-                    runHeadNodeCmd("""
-                    export SERVER_IP=localhost
-                    export SERVER_PORT=9101
-                    export XOS_USER=xosadmin@opencord.org
-                    export XOS_PASSWD=\\\$(cat /opt/credentials/xosadmin@opencord.org)
-                    cd /opt/cord/test/cord-tester/src/test/vsg/
-                    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
-                    """)
-                }
-                else {
-                    runHeadNodeCmd("""
-                    export SERVER_IP=localhost
-                    export SERVER_PORT=9101
-                    export XOS_USER=xosadmin@opencord.org
-                    export XOS_PASSWD=\\\$(cat /opt/credentials/xosadmin@opencord.org)
-                    cd /opt/cord/test/cord-tester/src/test/vsg/
-                    pybot -L TRACE -v pod:${deployment_config.pod_config.file_name} -e dataplane -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' }
-         }
-    }
-    stage('Publish') {
-        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/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/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/TestDoc/*.html',
-                outputFileName: 'RobotLogs/output*.xml',
-                outputPath: '.',
-                passThreshold: 100,
-                reportFileName: 'RobotLogs/report*.html',
-                unstableThreshold: 0])
-        } catch(error) {}
-    }
-    step([$class: 'Mailer', notifyEveryUnstableBuild: true, recipients: "${notificationEmail}", sendToIndividuals: false])
-}
-
-/**
- * Runs a command on the head node.
- *
- * @param command the command to run
- * @param sshArgs arguments for the ssh command
- * @return the output of the command
- */
-def runHeadNodeCmd(command, sshArgs="") {
-    return sh(returnStdout: true, script: "sshpass -p ${deployment_config.head.pass} ssh ${sshArgs} -oStrictHostKeyChecking=no -l ${deployment_config.head.user} ${deployment_config.head.ip} \"${command}\"")
-}
-
-/**
- * Runs an ONOS CLI command
- *
- * @param name    the onos node name, reachable from the head node
- * @param port    the port used to login to ONOS CLI
- * @param user    the user name to login to ONOS CLI
- * @param pass    the password to login to ONOS CLI
- * @param command the command to run in ONOS CLI
- * @return the output of the command
- */
-def runOnosCliCmd(name, port, user, pass, command) {
-    return sh(returnStdout: true, script: "sshpass -p ${deployment_config.head.pass} ssh -oStrictHostKeyChecking=no -l ${deployment_config.head.user} ${deployment_config.head.ip} \"sshpass -p ${pass} ssh -oStrictHostKeyChecking=no -l ${user} -p ${port} ${name} ${command}\"")
-}
