Merge "supporting custom images on voltha-scale-measurements-pipeline"
diff --git a/jjb/cord-test/att-workflow.yaml b/jjb/cord-test/att-workflow.yaml
index cca01c2..f4d304c 100644
--- a/jjb/cord-test/att-workflow.yaml
+++ b/jjb/cord-test/att-workflow.yaml
@@ -11,7 +11,7 @@
     jobs:
       # onlab pod1 build
       - 'build_pod_manual':
-          testvm: 'onf-build'
+          build-node: 'onf-build'
           config-pod: 'onlab-pod1'
           profile: 'att-workflow'
           branch: 'master'
@@ -22,7 +22,7 @@
 
       # onlab pod1 build - cord6.1(voltha 1.6) - seba1.0
       - 'build_pod_manual':
-          testvm: 'onf-build'
+          build-node: 'onf-build'
           config-pod: 'onlab-pod1-voltha16'
           profile: 'att-workflow'
           branch: 'cord-6.1'
@@ -33,7 +33,7 @@
 
       # flex pod1 test job - using voltha-master branch
       - 'build_pod_test':
-          testvm: 'onf-build'
+          build-node: 'onf-build'
           config-pod: 'onlab-pod1-qa'
           profile: 'att-workflow'
           branch: 'master'
@@ -42,7 +42,7 @@
 
       # onlab pod2 build
       - 'build_pod_manual':
-          testvm: 'onf-build'
+          build-node: 'onf-build'
           config-pod: 'onlab-pod2'
           profile: 'att-workflow'
           branch: 'master'
@@ -53,7 +53,7 @@
 
       # flex OCP pod with olt/onu : using voltha latest(master)
       # - 'build_pod_timer':
-      #   testvm: 'qa-testvm-pod'
+      #   build-node: 'qa-testvm-pod'
       #   config-pod: 'flex-ocp-cord-voltha-master'
       #   profile: 'att-workflow'
       #   branch: 'master'
@@ -65,7 +65,7 @@
 
       # flex OCP pod with olt/onu - seba-1.0/cord-6.1 release
       # - 'build_pod_timer':
-      #   testvm: 'qa-testvm-pod'
+      #   build-node: 'qa-testvm-pod'
       #   config-pod: 'flex-ocp-cord-voltha16'
       #   profile: 'att-workflow'
       #   branch: 'cord-6.1'
@@ -77,7 +77,7 @@
 
       # flex OCP test job - using voltha-master branch
       - 'build_pod_test':
-          testvm: 'qa-testvm-pod'
+          build-node: 'qa-testvm-pod'
           config-pod: 'flex-ocp-cord-voltha-master'
           profile: 'att-workflow'
           branch: 'master'
@@ -86,7 +86,7 @@
 
       # flex ocp pod test job - seba-1.0/cord-6.1 release
       - 'build_pod_test':
-          testvm: 'qa-testvm-pod'
+          build-node: 'qa-testvm-pod'
           config-pod: 'flex-ocp-cord-voltha16'
           profile: 'att-workflow'
           branch: 'cord-6.1'
diff --git a/jjb/cord-test/mcord.yaml b/jjb/cord-test/mcord.yaml
index 917d927..6e9fdd1 100644
--- a/jjb/cord-test/mcord.yaml
+++ b/jjb/cord-test/mcord.yaml
@@ -11,14 +11,14 @@
     jobs:
       # onlab mcord-pod1 build
       - 'build_mcord_pod_manual':
-          testvm: 'onf-build'
+          build-node: 'onf-build'
           config-pod: 'onf-mcord-pod1'
           profile: 'mcord'
           branch: 'master'
           Jenkinsfile: 'Jenkinsfile-mcord-local-build'
 
       - 'build_mcord_pod_manual':
-          testvm: 'onf-build'
+          build-node: 'onf-build'
           config-pod: 'onf-mcord-pod2'
           profile: 'mcord'
           branch: 'master'
@@ -26,7 +26,7 @@
           Jenkinsfile: 'Jenkinsfile-mcord-remote-build'
 
       - 'build_mcord_pod_manual':
-          testvm: 'mcord-dt'
+          build-node: 'mcord-dt'
           config-pod: 'mcord-barcellona-remote-dt'
           profile: 'mcord'
           branch: 'master'
diff --git a/jjb/cord-test/nightly-build-pipeline.yaml b/jjb/cord-test/nightly-build-pipeline.yaml
index b8cff5d..c0f957c 100644
--- a/jjb/cord-test/nightly-build-pipeline.yaml
+++ b/jjb/cord-test/nightly-build-pipeline.yaml
@@ -28,9 +28,14 @@
 
     parameters:
       - string:
+          name: buildNode
+          default: '{build-node}'
+          description: 'Name of the Jenkins executor node to run the job on'
+
+      - string:
           name: TestNodeName
-          default: '{testvm}'
-          description: 'Jenkins node name of TestVM Node'
+          default: '{build-node}'
+          description: 'DEPRECATED - use buildNode instead'
 
       - string:
           name: cordRepoUrl
@@ -136,9 +141,14 @@
 
     parameters:
       - string:
+          name: buildNode
+          default: '{build-node}'
+          description: 'Name of the Jenkins executor node to run the job on'
+
+      - string:
           name: TestNodeName
-          default: '{testvm}'
-          description: 'Jenkins node name of TestVM Node'
+          default: '{build-node}'
+          description: 'DEPRECATED - use buildNode instead'
 
       - string:
           name: cordRepoUrl
@@ -243,9 +253,14 @@
 
     parameters:
       - string:
+          name: buildNode
+          default: '{build-node}'
+          description: 'Name of the Jenkins executor node to run the job on'
+
+      - string:
           name: TestNodeName
-          default: '{testvm}'
-          description: 'Jenkins node name of TestVM Node'
+          default: '{build-node}'
+          description: 'DEPRECATED - use buildNode instead'
 
       - string:
           name: cordRepoUrl
@@ -315,9 +330,14 @@
 
     parameters:
       - string:
+          name: buildNode
+          default: '{build-node}'
+          description: 'Name of the Jenkins executor node to run the job on'
+
+      - string:
           name: TestNodeName
-          default: '{testvm}'
-          description: 'Jenkins node name of TestVM Node'
+          default: '{build-node}'
+          description: 'DEPRECATED - use buildNode instead'
 
       - string:
           name: cordRepoUrl
@@ -382,9 +402,14 @@
 
     parameters:
       - string:
+          name: buildNode
+          default: '{build-node}'
+          description: 'Name of the Jenkins executor node to run the job on'
+
+      - string:
           name: TestNodeName
-          default: '{testvm}'
-          description: 'Jenkins node name of TestVM Node'
+          default: '{build-node}'
+          description: 'DEPRECATED - use buildNode instead'
 
       - string:
           name: cordRepoUrl
@@ -474,9 +499,14 @@
 
     parameters:
       - string:
+          name: buildNode
+          default: '{build-node}'
+          description: 'Name of the Jenkins executor node to run the job on'
+
+      - string:
           name: TestNodeName
-          default: '{testvm}'
-          description: 'Jenkins node name of TestVM Node'
+          default: '{build-node}'
+          description: 'DEPRECATED - use buildNode instead'
 
       - string:
           name: cordRepoUrl
@@ -576,9 +606,14 @@
 
     parameters:
       - string:
+          name: buildNode
+          default: '{build-node}'
+          description: 'Name of the Jenkins executor node to run the job on'
+
+      - string:
           name: TestNodeName
-          default: '{testvm}'
-          description: 'Jenkins node name of TestVM Node'
+          default: '{build-node}'
+          description: 'DEPRECATED - use buildNode instead'
 
       - string:
           name: cordRepoUrl
@@ -649,9 +684,14 @@
 
     parameters:
       - string:
+          name: buildNode
+          default: '{build-node}'
+          description: 'Name of the Jenkins executor node to run the job on'
+
+      - string:
           name: TestNodeName
-          default: '{testvm}'
-          description: 'Jenkins node name of TestVM Node'
+          default: '{build-node}'
+          description: 'DEPRECATED - use buildNode instead'
 
       - string:
           name: cordRepoUrl
@@ -722,9 +762,14 @@
 
     parameters:
       - string:
+          name: buildNode
+          default: '{build-node}'
+          description: 'Name of the Jenkins executor node to run the job on'
+
+      - string:
           name: TestNodeName
-          default: '{testvm}'
-          description: 'Jenkins node name of TestVM Node'
+          default: '{build-node}'
+          description: 'DEPRECATED - use buildNode instead'
 
       - string:
           name: cordRepoUrl
@@ -804,9 +849,14 @@
 
     parameters:
       - string:
+          name: buildNode
+          default: '{build-node}'
+          description: 'Name of the Jenkins executor node to run the job on'
+
+      - string:
           name: TestNodeName
-          default: '{testvm}'
-          description: 'Jenkins node name of TestVM Node'
+          default: '{build-node}'
+          description: 'DEPRECATED - use buildNode instead'
 
       - string:
           name: cordRepoUrl
@@ -921,8 +971,13 @@
     parameters:
       - string:
           name: buildNode
-          default: '{testvm}'
-          description: 'Jenkins node name of TestVM Node'
+          default: '{build-node}'
+          description: 'Name of the Jenkins executor node to run the job on'
+
+      - string:
+          name: TestNodeName
+          default: '{build-node}'
+          description: 'DEPRECATED - use buildNode instead'
 
       - string:
           name: cordRepoUrl
diff --git a/jjb/cord-test/seba-release.yaml b/jjb/cord-test/seba-release.yaml
index b572d6b..a5f6021 100644
--- a/jjb/cord-test/seba-release.yaml
+++ b/jjb/cord-test/seba-release.yaml
@@ -11,7 +11,7 @@
     jobs:
       # onlab pod1 build 1.0
       - 'build_pod_manual_release':
-          testvm: 'onf-build'
+          build-node: 'onf-build'
           config-pod: 'onlab-pod1-voltha16'
           release: '1.0'
           branch: 'cord-6.1'
@@ -20,7 +20,7 @@
 
       # onlab pod1 build 2.0
       - 'build_pod_manual_release':
-          testvm: 'onf-build'
+          build-node: 'onf-build'
           config-pod: 'onlab-pod1'
           release: '2.0'
           branch: 'master'
@@ -29,7 +29,7 @@
 
       # onlab pod1 test job - release 2.0 test job
       - 'build_pod_release_test':
-          testvm: 'onf-build'
+          build-node: 'onf-build'
           config-pod: 'onlab-pod1'
           release: '2.0'
           branch: 'master'
@@ -37,7 +37,7 @@
 
       # onlab pod2 build
       - 'build_pod_manual_release':
-          testvm: 'onf-build'
+          build-node: 'onf-build'
           config-pod: 'onlab-pod2'
           release: '1.0'
           branch: 'cord-6.1'
@@ -46,7 +46,7 @@
 
       # onlab pod2 build 2.0
       - 'build_pod_manual_release':
-          testvm: 'onf-build'
+          build-node: 'onf-build'
           config-pod: 'onlab-pod2'
           release: '2.0'
           branch: 'master'
@@ -55,7 +55,7 @@
 
      # Flex POD build 2.0
       - 'build_pod_manual_release':
-          testvm: 'qa-testvm-pod'
+          build-node: 'qa-testvm-pod'
           config-pod: 'flex-ocp-cord'
           release: '2.0'
           branch: 'master'
@@ -64,7 +64,7 @@
 
           # # flex OCP pod with olt/onu - release 2.0 build job
           # - 'build_pod_release':
-          #     testvm: 'qa-testvm-pod'
+          #     build-node: 'qa-testvm-pod'
           #     config-pod: 'flex-ocp-cord'
           #     release: '1.0'
           #     branch: 'cord-6.1'
@@ -74,7 +74,7 @@
 
           # # flex OCP pod with olt/onu - release 2.0 build job
           # - 'build_pod_release':
-          #     testvm: 'qa-testvm-pod'
+          #     build-node: 'qa-testvm-pod'
           #     config-pod: 'flex-ocp-cord'
           #     release: '2.0'
           #     branch: 'master'
@@ -84,7 +84,7 @@
           #
           # # flex OCP POD with olt/onu - release 1.0 test job
           # - 'build_pod_release_test':
-          #     testvm: 'qa-testvm-pod'
+          #     build-node: 'qa-testvm-pod'
           #     config-pod: 'flex-ocp-cord'
           #     release: '1.0'
           #     branch: 'cord-6.1'
@@ -92,7 +92,7 @@
           #
           # # flex OCP POD with olt/onu - release 2.0 test job
           # - 'build_pod_release_test':
-          #     testvm: 'qa-testvm-pod'
+          #     build-node: 'qa-testvm-pod'
           #     config-pod: 'flex-ocp-cord'
           #     release: '2.0'
           #     branch: 'master'
@@ -100,7 +100,7 @@
           #
           # # flex OCP pod with olt/onu : using voltha latest(master)
           # - 'build_pod_release':
-          #     testvm: 'qa-testvm-pod'
+          #     build-node: 'qa-testvm-pod'
           #     config-pod: 'flex-ocp-cord'
           #     release: '2.0-microcharts'
           #     branch: 'master'
@@ -110,7 +110,7 @@
           #
           # # flex OCP test job - release 2.0 test job
           # - 'build_pod_release_test':
-          #     testvm: 'qa-testvm-pod'
+          #     build-node: 'qa-testvm-pod'
           #     config-pod: 'flex-ocp-cord'
           #     release: '2.0-microcharts'
           #     branch: 'master'
diff --git a/jjb/cord-test/voltha.yaml b/jjb/cord-test/voltha.yaml
index d85577d..e94c8a0 100644
--- a/jjb/cord-test/voltha.yaml
+++ b/jjb/cord-test/voltha.yaml
@@ -15,7 +15,7 @@
     jobs:
       # flex OCP pod with olt/onu - manual test job, voltha master build job
       - 'build_pod_manual':
-          testvm: 'qa-testvm-pod'
+          build-node: 'qa-testvm-pod'
           config-pod: 'flex-ocp-cord'
           release: 'master'
           branch: 'master'
@@ -26,7 +26,7 @@
 
       # flex pod1 test job - using voltha branch
       - 'build_pod_test':
-          testvm: 'qa-testvm-pod'
+          build-node: 'qa-testvm-pod'
           config-pod: 'flex-ocp-cord'
           profile: '1T4GEM-bal31'
           branch: 'master'
@@ -35,7 +35,7 @@
 
       # onlab pod1 OCP pod with olt/onu - Manual testing BAL3.1 release voltha master build job
       - 'build_pod_manual':
-          testvm: 'onf-build'
+          build-node: 'onf-build'
           config-pod: 'onlab-pod1'
           release: 'master'
           branch: 'master'
@@ -46,7 +46,7 @@
 
       # onlab pod1 test job - BAL3.1 tests using voltha branch
       - 'build_pod_test':
-          testvm: 'onf-build'
+          build-node: 'onf-build'
           config-pod: 'onlab-pod1'
           profile: '1T4GEM'
           branch: 'master'
@@ -55,7 +55,7 @@
 
       # flex OCP pod with olt/onu - Default tech profile and timer based job
       - 'build_voltha_pod_release':
-          testvm: 'qa-testvm-pod'
+          build-node: 'qa-testvm-pod'
           config-pod: 'flex-ocp-cord'
           release: 'master'
           branch: 'master'
@@ -69,7 +69,7 @@
 
       # flex pod1 test job - uses tech profile on voltha branch
       - 'build_voltha_pod_test':
-          testvm: 'qa-testvm-pod'
+          build-node: 'qa-testvm-pod'
           config-pod: 'flex-ocp-cord'
           release: 'master'
           branch: 'master'
@@ -80,7 +80,7 @@
 
       # flex OCP pod with olt/onu - uses 1TCONT/4GEMs tech profile on voltha - timer based job
       - 'build_voltha_pod_release':
-          testvm: 'qa-testvm-pod'
+          build-node: 'qa-testvm-pod'
           config-pod: 'flex-ocp-cord'
           release: 'master'
           branch: 'master'
@@ -94,7 +94,7 @@
 
       # flex pod1 test job - test job uses 1TCONT/4GEMs tech profile - using voltha branch
       - 'build_voltha_pod_test':
-          testvm: 'qa-testvm-pod'
+          build-node: 'qa-testvm-pod'
           config-pod: 'flex-ocp-cord'
           release: 'master'
           branch: 'master'
@@ -105,7 +105,7 @@
 
       # flex OCP pod with olt/onu - Released versions Default tech profile and timer based job
       - 'build_voltha_pod_release':
-          testvm: 'qa-testvm-pod'
+          build-node: 'qa-testvm-pod'
           config-pod: 'flex-ocp-cord'
           release: 'release'
           branch: 'master'
@@ -119,7 +119,7 @@
 
       # flex pod1 test job - released versions: uses tech profile on voltha branch
       - 'build_voltha_pod_test':
-          testvm: 'qa-testvm-pod'
+          build-node: 'qa-testvm-pod'
           config-pod: 'flex-ocp-cord'
           release: 'release'
           branch: 'master'
@@ -129,7 +129,7 @@
 
       # Menlo pod with olt/onu - Default tech profile and timer based job
       - 'build_voltha_pod_release':
-          testvm: 'menlo-demo-pod'
+          build-node: 'menlo-demo-pod'
           config-pod: 'onf-demo-pod'
           release: 'master'
           branch: 'master'
@@ -143,7 +143,7 @@
 
       # Menlo pod test job - uses tech profile on voltha branch
       - 'build_voltha_pod_test':
-          testvm: 'menlo-demo-pod'
+          build-node: 'menlo-demo-pod'
           config-pod: 'onf-demo-pod'
           release: 'master'
           branch: 'master'
@@ -153,7 +153,7 @@
 
       # Menlo pod with olt/onu - Default tech profile and timer based job
       - 'build_voltha_pod_release':
-          testvm: 'menlo-demo-pod'
+          build-node: 'menlo-demo-pod'
           config-pod: 'onf-demo-pod'
           release: 'release'
           branch: 'master'
@@ -167,7 +167,7 @@
 
       # Menlo pod test job - uses tech profile on voltha branch
       - 'build_voltha_pod_test':
-          testvm: 'menlo-demo-pod'
+          build-node: 'menlo-demo-pod'
           config-pod: 'onf-demo-pod'
           release: 'release'
           branch: 'master'
@@ -177,7 +177,7 @@
 
       # Menlo pod with olt/onu - 1T4GEM tech profile and timer based job
       - 'build_voltha_pod_release':
-          testvm: 'menlo-demo-pod'
+          build-node: 'menlo-demo-pod'
           config-pod: 'onf-demo-pod'
           release: 'master'
           branch: 'master'
@@ -191,7 +191,7 @@
 
       # Menlo pod test job - uses tech profile on voltha branch
       - 'build_voltha_pod_test':
-          testvm: 'menlo-demo-pod'
+          build-node: 'menlo-demo-pod'
           config-pod: 'onf-demo-pod'
           release: 'master'
           branch: 'master'
@@ -201,7 +201,7 @@
 
       # Menlo DEMO-POD - 1 1TCONT 4 4GEMs TechProfile - Manual build and test job
       - 'build_pod_manual':
-          testvm: 'menlo-demo-pod'
+          build-node: 'menlo-demo-pod'
           config-pod: 'onf-demo-pod'
           release: 'master'
           branch: 'master'
@@ -211,7 +211,7 @@
           configurePod: true
           profile: '1T4GEM-bal31'
       - 'build_pod_test':
-          testvm: 'menlo-demo-pod'
+          build-node: 'menlo-demo-pod'
           config-pod: 'onf-demo-pod'
           branch: 'master'
           test-repo: 'voltha-system-tests'
@@ -220,7 +220,7 @@
 
       # Menlo DEMO-POD - Default TechProfile - manual build job
       - 'build_pod_manual':
-          testvm: 'menlo-demo-pod'
+          build-node: 'menlo-demo-pod'
           config-pod: 'onf-demo-pod'
           release: 'master'
           branch: 'master'
@@ -232,7 +232,7 @@
 
       # ONF DEMO OCP test job - voltha-master branch
       - 'build_pod_test':
-          testvm: 'menlo-demo-pod'
+          build-node: 'menlo-demo-pod'
           config-pod: 'onf-demo-pod'
           profile: 'Default'
           branch: 'master'
@@ -241,7 +241,7 @@
 
       # Infosys pod with olt/onu - Default tech profile and timer based job
       - 'build_voltha_pod_release':
-          testvm: 'infosys-test-pod'
+          build-node: 'infosys-test-pod'
           config-pod: 'infosys-pod'
           release: 'master'
           branch: 'master'
@@ -255,7 +255,7 @@
 
       # infosys test job - uses Default tech profile on voltha branch
       - 'build_voltha_pod_test':
-          testvm: 'infosys-test-pod'
+          build-node: 'infosys-test-pod'
           config-pod: 'infosys-pod'
           release: 'master'
           branch: 'master'
@@ -266,7 +266,7 @@
 
       # Berlin pod with olt/onu - Released versions Default tech profile and timer based job
       - 'build_voltha_pod_release':
-          testvm: 'dt-berlin-community-pod'
+          build-node: 'dt-berlin-community-pod'
           config-pod: 'dt-berlin-pod'
           release: 'release'
           branch: 'master'
@@ -283,7 +283,7 @@
 
       # Berlin POD test job - released versions: uses tech profile on voltha branch
       - 'build_voltha_pod_test':
-          testvm: 'dt-berlin-community-pod'
+          build-node: 'dt-berlin-community-pod'
           config-pod: 'dt-berlin-pod'
           release: 'release'
           branch: 'master'
diff --git a/jjb/pipeline/siab-test.groovy b/jjb/pipeline/siab-test.groovy
index b13ca11..1ab109e 100644
--- a/jjb/pipeline/siab-test.groovy
+++ b/jjb/pipeline/siab-test.groovy
@@ -47,18 +47,6 @@
       }
     }
 
-    // FIXME: remove once Zack completes cord-tester refactoring, as master is
-    //  currently broken for siab tests.
-    stage('Cord-tester fix') {
-      steps {
-        sh """
-           pushd $WORKSPACE/cord/test/cord-tester
-           git checkout -b foo 7b3f901659a22c09e4759e343ad693b80125e06b
-           popd
-           """
-      }
-    }
-
     stage ('Reset Kubeadm') {
       steps {
         sh """
diff --git a/jjb/pipeline/voltha-go-tests.groovy b/jjb/pipeline/voltha-go-tests.groovy
index 33da214..5e519c2 100644
--- a/jjb/pipeline/voltha-go-tests.groovy
+++ b/jjb/pipeline/voltha-go-tests.groovy
@@ -108,6 +108,27 @@
 
          sleep 60 # Wait for log-collector and log-combine to complete
 
+         ## Pull out errors from log files
+         extract_errors_go() {
+           echo
+           echo "Error summary for $1:"
+           grep '"level":"error"' $WORKSPACE/kind-voltha/scripts/logger/combined/$1*
+           echo
+         }
+
+         extract_errors_python() {
+           echo
+           echo "Error summary for $1:"
+           grep 'ERROR' $WORKSPACE/kind-voltha/scripts/logger/combined/$1*
+           echo
+         }
+
+         extract_errors_go voltha-rw-core > $WORKSPACE/error-report.log
+         extract_errors_go adapter-open-olt >> $WORKSPACE/error-report.log
+         extract_errors_python adapter-open-onu >> $WORKSPACE/error-report.log
+         extract_errors_go voltha-ofagent >> $WORKSPACE/error-report.log
+         extract_errors_python onos >> $WORKSPACE/error-report.log
+
          cd $WORKSPACE/kind-voltha/scripts/logger/combined/
          tar czf $WORKSPACE/container-logs.tgz *
 
diff --git a/jjb/pipeline/voltha-physical-functional-tests.groovy b/jjb/pipeline/voltha-physical-functional-tests.groovy
index 51eb413..23b01c9 100644
--- a/jjb/pipeline/voltha-physical-functional-tests.groovy
+++ b/jjb/pipeline/voltha-physical-functional-tests.groovy
@@ -137,6 +137,30 @@
 
       sleep 60 # Wait for log-collector and log-combine to complete
 
+      # Clean up "announcer" pod used by the tests if present
+      kubectl delete pod announcer || true
+
+      ## Pull out errors from log files
+      extract_errors_go() {
+        echo
+        echo "Error summary for $1:"
+        grep '"level":"error"' $WORKSPACE/kind-voltha/scripts/logger/combined/$1*
+        echo
+      }
+
+      extract_errors_python() {
+        echo
+        echo "Error summary for $1:"
+        grep 'ERROR' $WORKSPACE/kind-voltha/scripts/logger/combined/$1*
+        echo
+      }
+
+      extract_errors_go voltha-rw-core > $WORKSPACE/error-report.log
+      extract_errors_go adapter-open-olt >> $WORKSPACE/error-report.log
+      extract_errors_python adapter-open-onu >> $WORKSPACE/error-report.log
+      extract_errors_python voltha-ofagent >> $WORKSPACE/error-report.log
+      extract_errors_python onos >> $WORKSPACE/error-report.log
+
       cd $WORKSPACE/kind-voltha/scripts/logger/combined/
       tar czf $WORKSPACE/container-logs.tgz *
 
diff --git a/jjb/pipeline/voltha-scale-measurements.groovy b/jjb/pipeline/voltha-scale-measurements.groovy
index 4db505b..cc7c160 100644
--- a/jjb/pipeline/voltha-scale-measurements.groovy
+++ b/jjb/pipeline/voltha-scale-measurements.groovy
@@ -32,6 +32,7 @@
     stage('cleanup') {
       steps {
         sh '''
+          rm -rf voltha-devices.txt onos-ports.txt total-time.txt onu-activation.txt
           for hchart in \$(helm list -q | grep -E -v 'docker-registry|cord-kafka|etcd-operator');
           do
               echo "Purging chart: \${hchart}"
@@ -148,7 +149,7 @@
                 i=$(voltctl device list | grep -v OLT | grep ACTIVE | wc -l)
               done
               echo "${expectedOnus} ONUs Activated in $SECONDS seconds (time: $SECONDS)"
-              echo $SECONDS > activation-time.txt
+              echo $SECONDS > voltha-devices.txt
             '''
           }
         }
@@ -164,11 +165,11 @@
                 z=$(sshpass -e ssh -q -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -p 30115 karaf@localhost ports -e | grep BBSM | wc -l)
               done
               echo "${expectedOnus} ports enabled in $SECONDS seconds (time: $SECONDS)"
-              echo $SECONDS > port-recognition.txt
+              echo $SECONDS > onos-ports.txt
               echo "ONOS-Duration(s)" > total-time.txt
               echo "VOLTHA-Duration(s)" > onu-activation.txt
-              cat activation-time.txt >> onu-activation.txt
-              paste activation-time.txt port-recognition.txt | awk '{print ($1 + $2)}' >> total-time.txt
+              cat voltha-devices.txt >> onu-activation.txt
+              paste voltha-devices.txt onos-ports.txt | awk '{print ($1 + $2)}' >> total-time.txt
             '''
           }
         }
@@ -180,23 +181,23 @@
       plot([
         csvFileName: 'plot-onu-activation.csv',
         csvSeries: [[displayTableFlag: false, exclusionValues: '', file: 'onu-activation.txt', inclusionFlag: 'OFF', url: ''], [displayTableFlag: false, exclusionValues: '', file: 'total-time.txt', inclusionFlag: 'OFF', url: '']],
-        group: 'Voltha-Scale-Numbers', numBuilds: '100', style: 'line', title: 'Time (200ms Delay)', useDescr: true, yaxis: 'Time (s)'
+        group: 'Voltha-Scale-Numbers', numBuilds: '100', style: 'line', title: 'Time (${BBSIMdelay} Delay)', yaxis: 'Time (s)'
       ])
-      archiveArtifacts artifacts: '*.log,*.txt'
       script {
         sh '''
           kubectl get pods --all-namespaces -o jsonpath="{range .items[*].status.containerStatuses[*]}{.image}{'\\t'}{.imageID}{'\\n'}" | sort | uniq -c
+          voltctl device list -o json > device-list.json
+          python -m json.tool device-list.json > volt-device-list.json
+          rm device-list.json
+          sshpass -e ssh -q -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -p 30115 karaf@localhost ports > onos-ports-list.txt
         '''
       }
+      archiveArtifacts artifacts: '*.log,*.json,*txt'
     }
     success {
       sh '''
         #!/usr/bin/env bash
         set +e
-        rm onu-activation.txt
-        rm total-time.txt
-        rm port-recognition.txt
-        rm activation-time.txt
       '''
     }
   }
diff --git a/jjb/siab.yaml b/jjb/siab.yaml
index 3d12c2c..0dc5d9d 100644
--- a/jjb/siab.yaml
+++ b/jjb/siab.yaml
@@ -18,7 +18,7 @@
 
     description: |
       <!-- Managed by Jenkins Job Builder -->
-      Created by {id} job-template from ci-management/jjb/siba.yaml  <br /><br />
+      Created by {id} job-template from ci-management/jjb/siab.yaml  <br /><br />
       E2E Validation for Seba-in-a-Box
 
     properties:
@@ -68,7 +68,7 @@
 
     description: |
       <!-- Managed by Jenkins Job Builder -->
-      Created by {id} job-template from ci-management/jjb/siba.yaml  <br /><br />
+      Created by {id} job-template from ci-management/jjb/siab.yaml, with pipleine: siab.groovy <br /><br />
       E2E Validation for Seba-in-a-Box
 
     properties:
@@ -118,7 +118,7 @@
 
     description: |
       <!-- Managed by Jenkins Job Builder -->
-      Created by {id} job-template from ci-management/jjb/siba.yaml  <br /><br />
+      Created by {id} job-template from ci-management/jjb/siab.yaml, with pipleine: siab.groovy <br /><br />
       E2E Validation for Seba-in-a-Box
 
     properties:
@@ -169,7 +169,7 @@
 
     description: |
       <!-- Managed by Jenkins Job Builder -->
-      Created by {id} job-template from ci-management/jjb/siba.yaml  <br /><br />
+      Created by {id} job-template from ci-management/jjb/siab.yaml, with pipleine: siab-test.groovy <br /><br />
       E2E Validation for Seba-in-a-Box
 
     properties:
diff --git a/jjb/verify/voltha-docs.yaml b/jjb/verify/voltha-docs.yaml
index b1ab32c..c10d081 100644
--- a/jjb/verify/voltha-docs.yaml
+++ b/jjb/verify/voltha-docs.yaml
@@ -24,7 +24,10 @@
     name: 'post-submit-voltha-docs-jobs'
     jobs:
       - 'sync-dir':
-          build-command: 'make versioned'
-          build-output-path: '_build/'
+          build-command: 'make html'
+          build-output-path: '_build/html/'
+          # When versioning is working properly, use:
+          # build-command: 'make versioned'
+          # build-output-path: '_build/html/'
           sync-target-server: 'guide.opencord.org'
           sync-target-path: '/var/www/voltha-docs/'
diff --git a/jjb/voltha-e2e.yaml b/jjb/voltha-e2e.yaml
index f898a90..df7e573 100644
--- a/jjb/voltha-e2e.yaml
+++ b/jjb/voltha-e2e.yaml
@@ -60,10 +60,20 @@
           pons: 8
           time-trigger: "H H/3 * * *"
 
+      - 'voltha-periodic-test':
+          name: 'periodic-voltha-alarm-test'
+          build-node: 'qct-pod4-node2'
+          default-image-tag: 'master'
+          code-branch: 'master'
+          make-target: bbsim-alarms-kind
+          onus: 1
+          pons: 1
+          time-trigger: "H H/3 * * *"
+
       # Per-patchset Pod builds on Tucson pod
       - 'verify_physical_voltha_patchset_auto':
           name: 'verify_physical_voltha_patchset_auto'
-          testvm: 'tucson-pod'
+          build-node: 'tucson-pod'
           config-pod: 'tucson-pod'
           branch: 'master'
           oltDebVersion: 'openolt_asfvolt16.deb'
@@ -73,7 +83,7 @@
       # Per-patchset Pod builds on Tucson pod
       - 'verify_physical_voltha_patchset_manual':
           name: 'verify_physical_voltha_patchset_manual'
-          testvm: 'tucson-pod'
+          build-node: 'tucson-pod'
           config-pod: 'tucson-pod'
           branch: 'master'
           oltDebVersion: 'openolt_asfvolt16.deb'
@@ -84,7 +94,7 @@
       # Allow local testing without disrupting above job
       - 'build_physical_voltha_manual':
           name: 'build_tucson-pod_manual'
-          testvm: 'tucson-pod'
+          build-node: 'tucson-pod'
           config-pod: 'tucson-pod'
           branch: 'master'
           oltDebVersion: 'openolt_asfvolt16.deb'
@@ -272,7 +282,7 @@
     parameters:
       - string:
           name: buildNode
-          default: '{testvm}'
+          default: '{build-node}'
           description: 'Pod management node'
 
       - string:
@@ -413,7 +423,7 @@
     parameters:
       - string:
           name: buildNode
-          default: '{testvm}'
+          default: '{build-node}'
           description: 'Pod management node'
 
       - string:
@@ -555,7 +565,7 @@
     parameters:
       - string:
           name: buildNode
-          default: '{testvm}'
+          default: '{build-node}'
           description: 'Pod management node'
 
       - string:
diff --git a/jjb/voltha-scale.yaml b/jjb/voltha-scale.yaml
index 888290f..9309bbe 100644
--- a/jjb/voltha-scale.yaml
+++ b/jjb/voltha-scale.yaml
@@ -8,36 +8,116 @@
 
     jobs:
       - 'voltha-scale-measurements-periodic':
-          name: 'voltha-scale-measurements-periodic-256-200ms'
+          name: 'voltha-scale-measurements-periodic-8-32-200ms'
           build-node: 'onf-pod1-head-node'
-          time-trigger: "0 * * * *"
+          time-trigger: "H H/3 * * *"
           onuPerPon: 32
           ponPorts: 8
           expectedOnus: 256
           BBSIMdelay: 200
       - 'voltha-scale-measurements-periodic':
-          name: 'voltha-scale-measurements-periodic-128-200ms'
+          name: 'voltha-scale-measurements-periodic-8-32-1000ms'
           build-node: 'onf-pod1-head-node'
-          time-trigger: "15 * * * *"
-          onuPerPon: 32
-          ponPorts: 4
-          expectedOnus: 128
-          BBSIMdelay: 200
-      - 'voltha-scale-measurements-periodic':
-          name: 'voltha-scale-measurements-periodic-256-1000ms'
-          build-node: 'onf-pod1-head-node'
-          time-trigger: "30 * * * *"
+          time-trigger: "H H/3 * * *"
           onuPerPon: 32
           ponPorts: 8
           expectedOnus: 256
           BBSIMdelay: 1000
       - 'voltha-scale-measurements-periodic':
-          name: 'voltha-scale-measurements-periodic-128-1000ms'
+          name: 'voltha-scale-measurements-periodic-4-32-200ms'
           build-node: 'onf-pod1-head-node'
-          time-trigger: "45 * * * *"
+          time-trigger: "H H/3 * * *"
           onuPerPon: 32
           ponPorts: 4
           expectedOnus: 128
+          BBSIMdelay: 200
+      - 'voltha-scale-measurements-periodic':
+          name: 'voltha-scale-measurements-periodic-4-32-1000ms'
+          build-node: 'onf-pod1-head-node'
+          time-trigger: "H H/3 * * *"
+          onuPerPon: 32
+          ponPorts: 4
+          expectedOnus: 128
+          BBSIMdelay: 1000
+      - 'voltha-scale-measurements-periodic':
+          name: 'voltha-scale-measurements-periodic-16-32-200ms'
+          build-node: 'onf-pod1-head-node'
+          time-trigger: "H H/3 * * *"
+          onuPerPon: 32
+          ponPorts: 16
+          expectedOnus: 512
+          BBSIMdelay: 200
+      - 'voltha-scale-measurements-periodic':
+          name: 'voltha-scale-measurements-periodic-16-32-1000ms'
+          build-node: 'onf-pod1-head-node'
+          time-trigger: "H H/3 * * *"
+          onuPerPon: 32
+          ponPorts: 16
+          expectedOnus: 512
+          BBSIMdelay: 1000
+      - 'voltha-scale-measurements-periodic':
+          name: 'voltha-scale-measurements-periodic-4-64-200ms'
+          build-node: 'onf-pod1-head-node'
+          time-trigger: "H H/3 * * *"
+          onuPerPon: 64
+          ponPorts: 4
+          expectedOnus: 256
+          BBSIMdelay: 200
+      - 'voltha-scale-measurements-periodic':
+          name: 'voltha-scale-measurements-periodic-4-64-1000ms'
+          build-node: 'onf-pod1-head-node'
+          time-trigger: "H H/3 * * *"
+          onuPerPon: 64
+          ponPorts: 4
+          expectedOnus: 256
+          BBSIMdelay: 1000
+      - 'voltha-scale-measurements-periodic':
+          name: 'voltha-scale-measurements-periodic-4-128-200ms'
+          build-node: 'onf-pod1-head-node'
+          time-trigger: "H H/3 * * *"
+          onuPerPon: 128
+          ponPorts: 4
+          expectedOnus: 512
+          BBSIMdelay: 200
+      - 'voltha-scale-measurements-periodic':
+          name: 'voltha-scale-measurements-periodic-4-128-1000ms'
+          build-node: 'onf-pod1-head-node'
+          time-trigger: "H H/3 * * *"
+          onuPerPon: 128
+          ponPorts: 4
+          expectedOnus: 512
+          BBSIMdelay: 1000
+      - 'voltha-scale-measurements-periodic':
+          name: 'voltha-scale-measurements-periodic-1-128-200ms'
+          build-node: 'onf-pod1-head-node'
+          time-trigger: "H H/3 * * *"
+          onuPerPon: 128
+          ponPorts: 1
+          expectedOnus: 128
+          BBSIMdelay: 200
+      - 'voltha-scale-measurements-periodic':
+          name: 'voltha-scale-measurements-periodic-1-128-1000ms'
+          build-node: 'onf-pod1-head-node'
+          time-trigger: "H H/3 * * *"
+          onuPerPon: 128
+          ponPorts: 1
+          expectedOnus: 128
+          BBSIMdelay: 1000
+      - 'voltha-scale-measurements-periodic':
+          name: 'voltha-scale-measurements-periodic-1-64-200ms'
+          build-node: 'onf-pod1-head-node'
+          time-trigger: "H H/3 * * *"
+          onuPerPon: 64
+          ponPorts: 1
+          expectedOnus: 64
+          BBSIMdelay: 200
+      - 'voltha-scale-measurements-periodic':
+          name: 'voltha-scale-measurements-periodic-1-64-1000ms'
+          build-node: 'onf-pod1-head-node'
+          time-trigger: "H H/3 * * *"
+          onuPerPon: 64
+          ponPorts: 1
+          expectedOnus: 64
           BBSIMdelay: 1000
       - 'voltha-scale-measurements':
           name: 'voltha-scale-measurements-dev'