[VOL-4939] Add new TT_TP job on branch=voltha-2.11

jjb/voltha-test/voltha.yaml
---------------------------
  o Copy new TT_TP pod-1 job from master into branch=voltha-2.11
  o Change power-cycle-olt: true => false.

jjb/pipeline/voltha/playground/dmi-build-and-test.groovy
jjb/pipeline/voltha/playground/physical-build.groovy
--------------------------------------------------------
  o Remove execute perms.

jjb/pipeline/voltha/playground/physical-build.groovy
----------------------------------------------------
  o Initial pass at script cleanup and debugging.
  o Changes only used by 'playground' jobs, master and voltha-2.11 unaffected.

Change-Id: I7bfdb47fbed01b1d328f3623ae4a50f696af2627
diff --git a/jjb/pipeline/voltha/playground/dmi-build-and-test.groovy b/jjb/pipeline/voltha/playground/dmi-build-and-test.groovy
old mode 100755
new mode 100644
diff --git a/jjb/pipeline/voltha/playground/physical-build.groovy b/jjb/pipeline/voltha/playground/physical-build.groovy
old mode 100755
new mode 100644
index 7501144..44a17ac
--- a/jjb/pipeline/voltha/playground/physical-build.groovy
+++ b/jjb/pipeline/voltha/playground/physical-build.groovy
@@ -1,3 +1,4 @@
+// -*- groovy -*-
 // Copyright 2017-2023 Open Networking Foundation (ONF) and the ONF Contributors
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
@@ -11,8 +12,9 @@
 // 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.
-
-// used to deploy VOLTHA and configure ONOS physical PODs
+// -----------------------------------------------------------------------
+// Intent: used to deploy VOLTHA and configure ONOS physical PODs
+// -----------------------------------------------------------------------
 
 // NOTE we are importing the library even if it's global so that it's
 // easier to change the keywords during a replay
@@ -25,43 +27,88 @@
 def infraNamespace = "infra"
 def volthaNamespace = "voltha"
 
+// -----------------------------------------------------------------------
+// -----------------------------------------------------------------------
+def getIam(String func)
+{
+    // Cannot rely on a stack trace due to jenkins manipulation
+    String src = [
+	'jjb',
+	'pipeline',
+	'voltha',
+	'playground',
+	'voltha-tt-physical-functional-tests.groovy'
+    ].join('/')
+    String iam = [src, func].join('::')
+    return iam
+}
+
+// -----------------------------------------------------------------------
+// -----------------------------------------------------------------------
 def deploy_custom_oltAdapterChart(namespace, name, chart, extraHelmFlags) {
   sh """
     helm install --create-namespace --set defaults.image_pullPolicy=Always --namespace ${namespace} ${extraHelmFlags} ${name} ${chart}
    """
 }
 
-pipeline {
-
-  /* no label, executor is determined by JJB */
-  agent {
-    label "${params.buildNode}"
-  }
-  options {
-    timeout(time: 35, unit: 'MINUTES')
-  }
-  environment {
-    PATH="$PATH:$WORKSPACE/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
-    KUBECONFIG="$WORKSPACE/${configBaseDir}/${configKubernetesDir}/${configFileName}.conf"
-  }
-
-  stages{
-    stage('Download Code') {
-      steps {
-        getVolthaCode([
-          branch: "${branch}",
-          volthaSystemTestsChange: "${volthaSystemTestsChange}",
-          volthaHelmChartsChange: "${volthaHelmChartsChange}",
-        ])
-      }
+pipeline
+{
+    /* no label, executor is determined by JJB */
+    agent
+    {
+	label "${params.buildNode}"
     }
-    stage ("Parse deployment configuration file") {
-      steps {
-        sh returnStdout: true, script: "rm -rf ${configBaseDir}"
-        sh returnStdout: true, script: "git clone -b ${branch} ${cordRepoUrl}/${configBaseDir}"
-        script {
-          if ( params.workFlow == "DT" ) {
-            deployment_config = readYaml file: "${configBaseDir}/${configDeploymentDir}/${configFileName}-DT.yaml"
+
+    options
+    {
+	timeout(time: 35, unit: 'MINUTES')
+    }
+
+    environment
+    {
+	PATH="$PATH:$WORKSPACE/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
+	KUBECONFIG="$WORKSPACE/${configBaseDir}/${configKubernetesDir}/${configFileName}.conf"
+    }
+
+    stages
+    {
+	stage('IAM')
+	{
+	    String iam = get_iam('main')
+            println("** ${iam}: ENTER")
+            println("** ${iam}: LEAVE")
+	}
+
+	stage('Download Code')
+	{
+	    steps {
+		getVolthaCode([
+		    branch: "${branch}",
+		    volthaSystemTestsChange: "${volthaSystemTestsChange}",
+		    volthaHelmChartsChange: "${volthaHelmChartsChange}",
+		])
+	    }
+	}
+
+	stage ("Parse deployment configuration file") {
+	    steps {
+		sh returnStdout: true, script: "rm -rf ${configBaseDir}"
+		sh returnStdout: true, script: "git clone -b ${branch} ${cordRepoUrl}/${configBaseDir}"
+		script {
+		    String conf = "${configBaseDir}/${configDeploymentDir}/${configFileName}"
+		    String flow = params.workFlow
+
+		    conf += (flow == 'DT') ? '-DT.yaml'
+		        : (flow == 'TT') ? '-TT.yaml'
+		        : '.yaml'
+
+		    deployment_config = readYaml file: conf
+		    
+		    /*
+		    if ( params.workFlow == "DT" )
+		    {
+			conf += '-DT.yaml'
+//            deployment_config = readYaml file: "${configBaseDir}/${configDeploymentDir}/${configFileName}-DT.yaml"
           }
           else if ( params.workFlow == "TT" )
           {
@@ -71,9 +118,11 @@
           {
             deployment_config = readYaml file: "${configBaseDir}/${configDeploymentDir}/${configFileName}.yaml"
           }
+		     */
         }
       }
     }
+
     stage('Clean up') {
       steps {
         timeout(15) {
diff --git a/jjb/pipeline/voltha/playground/software-upgrades.groovy b/jjb/pipeline/voltha/playground/software-upgrades.groovy
old mode 100755
new mode 100644
diff --git a/jjb/pipeline/voltha/playground/voltha-tt-physical-functional-tests.groovy b/jjb/pipeline/voltha/playground/voltha-tt-physical-functional-tests.groovy
index 1eacba9..6dd6cbe 100644
--- a/jjb/pipeline/voltha/playground/voltha-tt-physical-functional-tests.groovy
+++ b/jjb/pipeline/voltha/playground/voltha-tt-physical-functional-tests.groovy
@@ -26,89 +26,144 @@
   deployment_config = null
 }
 
+// -----------------------------------------------------------------------
+// -----------------------------------------------------------------------
+def getIam(String func)
+{
+    // Cannot rely on a stack trace due to jenkins manipulation
+    String src = [
+	'jjb',
+	'pipeline',
+	'voltha',
+	'playground',
+	'voltha-tt-physical-functional-tests.groovy'
+    ].join('/')
+    String iam = [src, func].join('::')
+    return iam
+}
+
 def infraNamespace = "infra"
 def volthaNamespace = "voltha"
 
-pipeline {
-  /* no label, executor is determined by JJB */
-  agent {
-    label "${params.buildNode}"
-  }
-  options {
-    timeout(time: "${timeout}", unit: 'MINUTES')
-  }
+pipeline
+{
+    /* no label, executor is determined by JJB */
+    agent
+    {
+	label "${params.buildNode}"
+    }
 
-  environment {
-    KUBECONFIG="$WORKSPACE/${configBaseDir}/${configKubernetesDir}/${configFileName}.conf"
-    VOLTCONFIG="$HOME/.volt/config-minimal"
-    PATH="$WORKSPACE/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
-  }
+    options
+    {
+	timeout(time: "${timeout}", unit: 'MINUTES')
+    }
 
-  stages {
-    stage('Clone voltha-system-tests') {
-      steps {
-        step([$class: 'WsCleanup'])
-        checkout([
-          $class: 'GitSCM',
-          userRemoteConfigs: [[
-            url: "https://gerrit.opencord.org/voltha-system-tests",
-            refspec: "${volthaSystemTestsChange}"
-          ]],
-          branches: [[ name: "${branch}", ]],
-          extensions: [
-            [$class: 'WipeWorkspace'],
-            [$class: 'RelativeTargetDirectory', relativeTargetDir: "voltha-system-tests"],
-            [$class: 'CloneOption', depth: 0, noTags: false, reference: '', shallow: false],
-          ],
-        ])
-        script {
-          sh(script:"""
+    environment
+    {
+	KUBECONFIG="$WORKSPACE/${configBaseDir}/${configKubernetesDir}/${configFileName}.conf"
+	VOLTCONFIG="$HOME/.volt/config-minimal"
+	PATH="$WORKSPACE/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
+    }
+
+    stages {
+
+	// -----------------------------------------------------------------------
+	// -----------------------------------------------------------------------
+	stage('IAM')
+	{
+	    String iam = get_iam('main')
+            println("** ${iam}: ENTER")
+            println("** ${iam}: LEAVE")
+	}
+
+	// -----------------------------------------------------------------------
+	// -----------------------------------------------------------------------
+	stage('Clone voltha-system-tests')
+	{
+	    steps
+	    {
+		step([$class: 'WsCleanup'])
+		checkout([
+		    $class: 'GitSCM',
+		    userRemoteConfigs: [[
+			url: "https://gerrit.opencord.org/voltha-system-tests",
+			refspec: "${volthaSystemTestsChange}"
+		    ]],
+		    branches: [[ name: "${branch}" ]],
+		    extensions: [
+			[$class: 'WipeWorkspace'],
+			[$class: 'RelativeTargetDirectory', relativeTargetDir: "voltha-system-tests"],
+			[$class: 'CloneOption', depth: 0, noTags: false, reference: '', shallow: false],
+		    ],
+		]) // checkout
+
+		script
+		{
+		    sh(
+			returnStatus: true,
+			// returnStdout: true,
+			script: """
             if [ '${volthaSystemTestsChange}' != '' ] ; then
-              cd $WORKSPACE/voltha-system-tests;
-              git fetch https://gerrit.opencord.org/voltha-system-tests ${volthaSystemTestsChange} && git checkout FETCH_HEAD
+              cd "$WORKSPACE/voltha-system-tests"
+              git fetch https://gerrit.opencord.org/voltha-system-tests ${volthaSystemTestsChange}
+              git checkout FETCH_HEAD
+              exit 1  # verify fail
             fi
             """)
-        }
-      }
-    }
-    // This checkout allows us to show changes in Jenkins
-    // we only do this on master as we don't branch all the repos for all the releases
-    // (we should compute the difference by tracking the container version, not the code)
-    stage('Download All the VOLTHA repos') {
-      when {
-        expression {
-          return "${branch}" == 'master';
-        }
-      }
-      steps {
-       checkout(changelog: true,
-         poll: false,
-         scm: [$class: 'RepoScm',
-           manifestRepositoryUrl: "${params.manifestUrl}",
-           manifestBranch: "${params.branch}",
-           currentBranch: true,
-           destinationDir: 'voltha',
-           forceSync: true,
-           resetFirst: true,
-           quiet: true,
-           jobs: 4,
-           showAllChanges: true]
-         )
-      }
-    }
-    stage ('Initialize')
-    {
-        steps
-	{
-	    sh returnStdout: false, script: "git clone -b ${branch} ${cordRepoUrl}/${configBaseDir}"
-	    script
-	    {
-		deployment_config = readYaml file: "${configBaseDir}/${configDeploymentDir}/${configFileName}-TT.yaml"
-	    }
-		
-        installVoltctl("${branch}")
+		} // step
+	    } // steps
+	} // stage
 
-        sh returnStdout: false, script: """
+	// -----------------------------------------------------------------------
+	// This checkout allows us to show changes in Jenkins
+	// we only do this on master as we don't branch all the repos for all the releases
+	// (we should compute the difference by tracking the container version, not the code)
+	// -----------------------------------------------------------------------
+	stage('Download All the VOLTHA repos')
+	{
+	    when {
+		expression { return "${branch}" == 'master'; }
+            }
+
+	    steps {
+		checkout(changelog: true,
+			 poll: false,
+			 scm: [$class: 'RepoScm',
+			       manifestRepositoryUrl: "${params.manifestUrl}",
+			       manifestBranch: "${params.branch}",
+			       currentBranch: true,
+			       destinationDir: 'voltha',
+			       forceSync: true,
+			       resetFirst: true,
+			       quiet: true,
+			       jobs: 4,
+			       showAllChanges: true]
+		)
+	    }
+	}
+
+	// -----------------------------------------------------------------------
+	// -----------------------------------------------------------------------
+	stage ('Initialize')
+	{
+            steps
+	    {
+		sh(
+		    returnStatus: true,
+		    returnStdout: false,
+		    script: "git clone -b ${branch} ${cordRepoUrl}/${configBaseDir}"
+		)
+		script
+		{
+		    deployment_config = readYaml file: "${configBaseDir}/${configDeploymentDir}/${configFileName}-TT.yaml"
+		}
+
+		installVoltctl("${branch}")
+
+		sh(
+		    returnStatus: true,
+		    returnStdout: false,
+		    script: """
         mkdir -p "$WORKSPACE/bin"
 
         # install kail
@@ -120,7 +175,6 @@
         if [ "${params.branch}" == "master" ]; then
            set +e
 
-
         # Remove noise from voltha-core logs
            voltctl log level set WARN read-write-core#github.com/opencord/voltha-go/db/model
            voltctl log level set WARN read-write-core#github.com/opencord/voltha-lib-go/v3/pkg/kafka
@@ -129,18 +183,23 @@
            voltctl log level set WARN adapter-open-olt#github.com/opencord/voltha-lib-go/v3/pkg/probe
            voltctl log level set WARN adapter-open-olt#github.com/opencord/voltha-lib-go/v3/pkg/kafka
         fi
-        """
-      }
-    }
+        """)
+	    } // step
+	} // stage
 
-    stage('Functional Tests') {
-      environment {
-        ROBOT_CONFIG_FILE="$WORKSPACE/${configBaseDir}/${configDeploymentDir}/${configFileName}-TT.yaml"
-        ROBOT_FILE="Voltha_TT_PODTests.robot"
-        ROBOT_LOGS_DIR="$WORKSPACE/RobotLogs/tt-workflow/FunctionalTests"
-      }
-      steps {
-        sh """
+	// -----------------------------------------------------------------------
+	// -----------------------------------------------------------------------
+	stage('Functional Tests')
+	{
+	    environment
+	    {
+		ROBOT_CONFIG_FILE="$WORKSPACE/${configBaseDir}/${configDeploymentDir}/${configFileName}-TT.yaml"
+		ROBOT_FILE="Voltha_TT_PODTests.robot"
+		ROBOT_LOGS_DIR="$WORKSPACE/RobotLogs/tt-workflow/FunctionalTests"
+	    }
+
+	    steps {
+		sh("""
         mkdir -p $ROBOT_LOGS_DIR
         if ( ${powerSwitch} ); then
              export ROBOT_MISC_ARGS="--removekeywords wuks -i functionalTT -i PowerSwitch -i sanityTT -i sanityTT-MCAST -e bbsim -e notready -d $ROBOT_LOGS_DIR -v POD_NAME:${configFileName} -v KUBERNETES_CONFIGS_DIR:$WORKSPACE/${configBaseDir}/${configKubernetesDir} -v container_log_dir:$WORKSPACE -v OLT_ADAPTER_APP_LABEL:${oltAdapterAppLabel}"
@@ -151,19 +210,25 @@
              export ROBOT_MISC_ARGS="--removekeywords wuks -i functionalTT -e PowerSwitch -i sanityTT -i sanityTT-MCAST -e bbsim -e notready -d $ROBOT_LOGS_DIR -v POD_NAME:${configFileName} -v KUBERNETES_CONFIGS_DIR:$WORKSPACE/${configBaseDir}/${configKubernetesDir} -v container_log_dir:$WORKSPACE -v OLT_ADAPTER_APP_LABEL:${oltAdapterAppLabel}"
         fi
         ROBOT_MISC_ARGS+=" -v NAMESPACE:${volthaNamespace} -v INFRA_NAMESPACE:${infraNamespace}"
-        make -C $WORKSPACE/voltha-system-tests voltha-tt-test || true
-        """
+        make -C $WORKSPACE/voltha-system-tests voltha-tt-test
+        """)
       }
-    }
+	} // stage
 
-    stage('Failure/Recovery Tests') {
-      environment {
-        ROBOT_CONFIG_FILE="$WORKSPACE/${configBaseDir}/${configDeploymentDir}/${configFileName}-TT.yaml"
-        ROBOT_FILE="Voltha_TT_FailureScenarios.robot"
-        ROBOT_LOGS_DIR="$WORKSPACE/RobotLogs/tt-workflow/FailureScenarios"
-      }
-      steps {
-        sh """
+	// -----------------------------------------------------------------------
+	// -----------------------------------------------------------------------
+	stage('Failure/Recovery Tests')
+	{
+	    environment
+	    {
+		ROBOT_CONFIG_FILE="$WORKSPACE/${configBaseDir}/${configDeploymentDir}/${configFileName}-TT.yaml"
+		ROBOT_FILE="Voltha_TT_FailureScenarios.robot"
+		ROBOT_LOGS_DIR="$WORKSPACE/RobotLogs/tt-workflow/FailureScenarios"
+	    }
+
+	    steps
+	    {
+		sh("""
         mkdir -p $ROBOT_LOGS_DIR
         if [ ${params.enableMultiUni} = false ]; then
           if ( ${powerSwitch} ); then
@@ -174,19 +239,25 @@
           ROBOT_MISC_ARGS+=" -v NAMESPACE:${volthaNamespace} -v INFRA_NAMESPACE:${infraNamespace}"
           make -C $WORKSPACE/voltha-system-tests voltha-tt-test || true
         fi
-        """
-      }
-    }
+        """)
+	    }
+	} // stage
 
-    stage('Multi-Tcont Tests') {
-      environment {
-        ROBOT_CONFIG_FILE="$WORKSPACE/${configBaseDir}/${configDeploymentDir}/${configFileName}-TT.yaml"
-        ROBOT_FILE="Voltha_TT_MultiTcontTests.robot"
-        ROBOT_LOGS_DIR="$WORKSPACE/RobotLogs/tt-workflow/MultiTcontScenarios"
-        ROBOT_TEST_INPUT_FILE="$WORKSPACE/voltha-system-tests/tests/data/${configFileName}-TT-multi-tcont-tests-input.yaml"
-      }
-      steps {
-        sh """
+	// -----------------------------------------------------------------------
+	// -----------------------------------------------------------------------
+	stage('Multi-Tcont Tests')
+	{
+	    environment
+	    {
+		ROBOT_CONFIG_FILE="$WORKSPACE/${configBaseDir}/${configDeploymentDir}/${configFileName}-TT.yaml"
+		ROBOT_FILE="Voltha_TT_MultiTcontTests.robot"
+		ROBOT_LOGS_DIR="$WORKSPACE/RobotLogs/tt-workflow/MultiTcontScenarios"
+		ROBOT_TEST_INPUT_FILE="$WORKSPACE/voltha-system-tests/tests/data/${configFileName}-TT-multi-tcont-tests-input.yaml"
+	    }
+
+	    steps
+	    {
+		sh("""
         mkdir -p $ROBOT_LOGS_DIR
         if [ ${params.enableMultiUni} = false ]; then
           if ( ${powerSwitch} ); then
@@ -197,19 +268,25 @@
           ROBOT_MISC_ARGS+=" -v NAMESPACE:${volthaNamespace} -v INFRA_NAMESPACE:${infraNamespace}"
           make -C $WORKSPACE/voltha-system-tests voltha-tt-test || true
         fi
-        """
-      }
-    }
+        """)
+	    }
+	}
+	
+	// -----------------------------------------------------------------------
+	// -----------------------------------------------------------------------
+	stage('Multicast Tests')
+	{
+	    environment
+	    {
+		ROBOT_CONFIG_FILE="$WORKSPACE/${configBaseDir}/${configDeploymentDir}/${configFileName}-TT.yaml"
+		ROBOT_FILE="Voltha_TT_MulticastTests.robot"
+		ROBOT_LOGS_DIR="$WORKSPACE/RobotLogs/tt-workflow/MulticastTests"
+		ROBOT_TEST_INPUT_FILE="$WORKSPACE/voltha-system-tests/tests/data/${configFileName}-TT-multicast-tests-input.yaml"
+	    }
 
-    stage('Multicast Tests') {
-      environment {
-        ROBOT_CONFIG_FILE="$WORKSPACE/${configBaseDir}/${configDeploymentDir}/${configFileName}-TT.yaml"
-        ROBOT_FILE="Voltha_TT_MulticastTests.robot"
-        ROBOT_LOGS_DIR="$WORKSPACE/RobotLogs/tt-workflow/MulticastTests"
-        ROBOT_TEST_INPUT_FILE="$WORKSPACE/voltha-system-tests/tests/data/${configFileName}-TT-multicast-tests-input.yaml"
-      }
-      steps {
-        sh """
+	    steps
+	    {
+		sh("""
         mkdir -p $ROBOT_LOGS_DIR
         if [ ${params.enableMultiUni} = true ]; then
           if ( ${powerSwitch} ); then
@@ -220,46 +297,53 @@
           ROBOT_MISC_ARGS+=" -v NAMESPACE:${volthaNamespace} -v INFRA_NAMESPACE:${infraNamespace}"
           make -C $WORKSPACE/voltha-system-tests voltha-tt-test || true
         fi
-        """
-      }
+        """)
+	    }
+	}
     }
 
-  }
-  post {
-    always {
-      getPodsInfo("$WORKSPACE/pods")
-      sh returnStdout: false, script: '''
+    post
+    {
+	always
+	{
+	    getPodsInfo("$WORKSPACE/pods")
+	    sh(returnStdout: false, script: '''
       set +e
 
       # collect logs collected in the Robot Framework StartLogging keyword
       cd $WORKSPACE
       gzip *-combined.log || true
       rm *-combined.log || true
-      '''
-      script {
+      ''')
+
+	    script {
         deployment_config.olts.each { olt ->
-          if (olt.type == null || olt.type == "" || olt.type == "openolt") {
-             sh returnStdout: false, script: """
+	if (olt.type == null || olt.type == "" || olt.type == "openolt")
+	{
+		sh(returnStdout: false, script: """
              sshpass -p ${olt.pass} scp ${olt.user}@${olt.sship}:/var/log/openolt.log $WORKSPACE/openolt-${olt.sship}.log || true
              sshpass -p ${olt.pass} scp ${olt.user}@${olt.sship}:/var/log/dev_mgmt_daemon.log $WORKSPACE/dev_mgmt_daemon-${olt.sship}.log || true
              sed -i 's/\\x1b\\[[0-9;]*[a-zA-Z]//g' $WORKSPACE/openolt-${olt.sship}.log  # Remove escape sequences
              sed -i 's/\\x1b\\[[0-9;]*[a-zA-Z]//g' $WORKSPACE/dev_mgmt_daemon-${olt.sship}.log  # Remove escape sequences
-             """
-          }
-        }
-      }
-      step([$class: 'RobotPublisher',
-        disableArchiveOutput: false,
-        logFileName: '**/log*.html',
-        otherFiles: '',
-        outputFileName: '**/output*.xml',
-        outputPath: 'RobotLogs',
-        passThreshold: 100,
-        reportFileName: '**/report*.html',
-        unstableThreshold: 0,
-        onlyCritical: true
-        ]);
-      archiveArtifacts artifacts: '**/*.log,**/*.gz,**/*.tgz,*.txt,pods/*.txt'
-    }
-  }
-}
+             """)
+		    }
+		}
+	    }
+
+	    step([$class: 'RobotPublisher',
+		  disableArchiveOutput: false,
+		  logFileName: '**/log*.html',
+		  otherFiles: '',
+		  outputFileName: '**/output*.xml',
+		  outputPath: 'RobotLogs',
+		  passThreshold: 100,
+		  reportFileName: '**/report*.html',
+		  unstableThreshold: 0,
+		  onlyCritical: true
+            ]);
+	    archiveArtifacts artifacts: '**/*.log,**/*.gz,**/*.tgz,*.txt,pods/*.txt'
+	} // always
+    } // post
+} // pipeline
+
+// [EOF]
diff --git a/jjb/voltha-test/voltha.yaml b/jjb/voltha-test/voltha.yaml
index fe9f6da..da107b2 100644
--- a/jjb/voltha-test/voltha.yaml
+++ b/jjb/voltha-test/voltha.yaml
@@ -911,18 +911,49 @@
           name-extension: '_TT'
           work-flow: 'TT'
           power-switch: true
-          power-cycle-olt: true
+          power-cycle-olt: false
           pipeline-script: 'voltha/master/voltha-tt-physical-functional-tests.groovy'
           test-repo: 'voltha-system-tests'
           profile: 'TP'
           timeout: 360
 
+      # [CORD-3256] TT workflow on XGSPON OLT at Berlin pod - build job
+      - 'build_voltha_pod_release_timer':
+          disable-job: false
+          build-node: 'berlin-community-pod-1'
+          config-pod: 'berlin-community-pod-1-gpon'
+          release: 'voltha-2.11'
+          branch: 'voltha-2.11'
+          name-extension: '_TT'
+          work-flow: 'TT'
+          profile: 'TP'
+          time: '10'
+          VolthaEtcdPort: 9999
+          num-of-onos: '3'
+          num-of-atomix: '3'
+
+      # [CORD-3256] TT workflow on GPON OLT at Berlin pod - test job
+      - 'build_voltha_pod_test':
+          disable-job: false
+          build-node: 'berlin-community-pod-1'
+          config-pod: 'berlin-community-pod-1-gpon'
+          release: 'voltha-2.11'
+          branch: 'voltha-2.11'
+          name-extension: '_TT'
+          work-flow: 'TT'
+          power-switch: true
+          power-cycle-olt: false
+          pipeline-script: 'voltha/voltha-2.11/voltha-tt-physical-functional-tests.groovy'
+          test-repo: 'voltha-system-tests'
+          profile: 'TP'
+          timeout: 360
+
       # TT workflow on Zyxel GPON OLT at Berlin pod - build job (playground)
       - 'build_voltha_pod_release_timer_playground':
           disable-job: false
           build-node: 'berlin-community-pod-1'
           config-pod: 'berlin-community-pod-1-gpon'
-          release: 'master3'
+          release: 'master'
           branch: 'master'
           name-extension: '_TT'
           work-flow: 'TT'
@@ -942,7 +973,7 @@
           name-extension: '_TT'
           work-flow: 'TT'
           power-switch: true
-          power-cycle-olt: true
+          power-cycle-olt: false
           pipeline-script: 'voltha/playground/voltha-tt-physical-functional-tests.groovy'
           test-repo: 'voltha-system-tests'
           profile: 'TP'