blob: 797e17869d43d97232c14af65d5fe23296308d9e [file] [log] [blame]
Joey Armstrong56fdfec2024-03-01 13:43:36 -05001// -----------------------------------------------------------------------
2// Copyright 2021-2024 Open Networking Foundation Contributors
Matteo Scandolo42f6e572021-01-25 15:11:34 -08003//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
Joey Armstrong56fdfec2024-03-01 13:43:36 -050015// -----------------------------------------------------------------------
16// SPDX-FileCopyrightText: 2021-2024 Open Networking Foundation Contributors
17// SPDX-License-Identifier: Apache-2.0
18// -----------------------------------------------------------------------
Hardik Windlassec9341b2021-06-07 11:58:29 +000019// voltha-2.x e2e tests for openonu-go
Matteo Scandolo42f6e572021-01-25 15:11:34 -080020// uses bbsim to simulate OLT/ONUs
Joey Armstrong56fdfec2024-03-01 13:43:36 -050021// -----------------------------------------------------------------------
Matteo Scandolo42f6e572021-01-25 15:11:34 -080022
Joey Armstrongbccfa4b2023-09-27 17:34:22 -040023// [TODO] Update library() to the latest DSL syntax supported by jenkins
Matteo Scandoloa156b572021-02-04 11:52:18 -080024library identifier: 'cord-jenkins-libraries@master',
25 retriever: modernSCM([
Joey Armstrong9f66e3f2023-09-20 16:29:29 -040026 $class: 'GitSCMSource',
27 remote: 'https://gerrit.opencord.org/ci-management.git'
Matteo Scandoloa156b572021-02-04 11:52:18 -080028])
29
Joey Armstronge5aae1c2023-07-24 14:11:20 -040030//------------------//
31//---] GLOBAL [---//
32//------------------//
Joey Armstronge9725b12023-08-28 18:15:12 -040033String clusterName = 'kind-ci'
Joey Armstrongf076c312023-08-01 17:17:10 -040034
35// -----------------------------------------------------------------------
Joey Armstrong9f66e3f2023-09-20 16:29:29 -040036// Intent: Return branch name for the script. A hardcoded value is used
37// as a guarantee release jobs are running in an expected sandbox.
Joey Armstrongf076c312023-08-01 17:17:10 -040038// -----------------------------------------------------------------------
Joey Armstrongb65ada32023-08-03 12:50:20 -040039String branchName() {
Joey Armstrong9f66e3f2023-09-20 16:29:29 -040040 String br = 'master'
Joey Armstrong0e0a42b2023-08-02 21:04:21 -040041
Joey Armstrong9f66e3f2023-09-20 16:29:29 -040042 // "${branch}" is assigned by jenkins
43 if (br != branch) {
44 String err = [
45 'ERROR: Detected invalid branch',
Roger Luethi92354bf2023-10-05 09:22:19 +020046 "(expected=[${br}] != found=[${branch}])"
Joey Armstrong9f66e3f2023-09-20 16:29:29 -040047 ].join(' ')
48 throw new Exception(err) // groovylint-disable-line ThrowException
49 }
50
51 return (br)
Joey Armstrongf076c312023-08-01 17:17:10 -040052}
Hardik Windlassec9341b2021-06-07 11:58:29 +000053
Joey Armstronge5aae1c2023-07-24 14:11:20 -040054// -----------------------------------------------------------------------
Joey Armstrong06a68372023-07-24 16:37:16 -040055// Intent: Due to lack of a reliable stack trace, construct a literal.
Joey Armstrong0251e962023-08-25 20:51:31 -040056// Jenkins will re-write the call stack for serialization.S
57// -----------------------------------------------------------------------
58// Note: Hardcoded version string used to visualize changes in jenkins UI
Joey Armstrong06a68372023-07-24 16:37:16 -040059// -----------------------------------------------------------------------
Joey Armstrong97a8b882023-08-02 16:08:52 -040060String getIam(String func) {
Joey Armstrongb65ada32023-08-03 12:50:20 -040061 String branchName = branchName()
Joey Armstrong06a68372023-07-24 16:37:16 -040062 String src = [
63 'ci-management',
64 'jjb',
65 'pipeline',
66 'voltha',
Joey Armstrongb65ada32023-08-03 12:50:20 -040067 branchName,
Joey Armstrong06a68372023-07-24 16:37:16 -040068 'bbsim-tests.groovy'
69 ].join('/')
70
Joey Armstrongbccfa4b2023-09-27 17:34:22 -040071 String name = [src, func].join('::')
Joey Armstrong0e0a42b2023-08-02 21:04:21 -040072 return(name)
Joey Armstrong06a68372023-07-24 16:37:16 -040073}
74
75// -----------------------------------------------------------------------
Joey Armstrong0251e962023-08-25 20:51:31 -040076// Intent: Log progress message
77// -----------------------------------------------------------------------
78void enter(String name) {
79 // Announce ourselves for log usability
80 String iam = getIam(name)
81 println("${iam}: ENTER")
82 return
83}
84
85// -----------------------------------------------------------------------
86// Intent: Log progress message
87// -----------------------------------------------------------------------
88void leave(String name) {
89 // Announce ourselves for log usability
90 String iam = getIam(name)
91 println("${iam}: LEAVE")
92 return
93}
94
95// -----------------------------------------------------------------------
Joey Armstrongf0232762024-02-11 17:23:04 -050096// Intent: Display a message with visibility for logging
97// -----------------------------------------------------------------------
98String banner(String message) {
99 String iam = getIam('banner')
100
101 println("""
102
103** -----------------------------------------------------------------------
104** IAM: $iam
105** ${message}
106** -----------------------------------------------------------------------
107""")
108 return
109}
110
111// -----------------------------------------------------------------------
Joey Armstronge5aae1c2023-07-24 14:11:20 -0400112// Intent: Determine if working on a release branch.
113// Note: Conditional is legacy, should also check for *-dev or *-pre
114// -----------------------------------------------------------------------
Joey Armstrong0251e962023-08-25 20:51:31 -0400115Boolean isReleaseBranch(String name) {
Joey Armstronge5aae1c2023-07-24 14:11:20 -0400116 // List modifiers = ['-dev', '-pre', 'voltha-x.y.z-pre']
Joey Armstrongb65ada32023-08-03 12:50:20 -0400117 // if branchName in modifiers
118 return(name != 'master') // OR branchName.contains('-')
Joey Armstronge5aae1c2023-07-24 14:11:20 -0400119}
120
121// -----------------------------------------------------------------------
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400122// Intent: Terminate orphaned port-forward from different namespaces
123// -----------------------------------------------------------------------
124void cleanupPortForward() {
125 enter('cleanupPortForward')
126
127 Map pkpfArgs =\
128 [
129 'banner' : true, // display banner for logging
130 'show_procs' : true, // display procs under consideration
131 'filler' : true // fix conditional trailing comma
132 ]
133
134 // 'kubectl.*port-forward'
135 pkill_port_forward('port-forward', pkpfArgs)
136 leave('cleanupPortForward')
137 return
138}
139
Joey Armstrongbccfa4b2023-09-27 17:34:22 -0400140// find . \( -name 'log*.html' -o -name 'output*.xml' -o -name 'report*.html' \) -p
141// -----------------------------------------------------------------------
142// Intent: Display contents of the logs directory
143// -----------------------------------------------------------------------
144// [TODO]
145// o where-4-art-thou logs directory ?
146// o Replace find {logfile} command with /bin/ls {logdir} when found.
147// Individual logs may be missing due to failure, show what is available.
148// -----------------------------------------------------------------------
149void findPublishedLogs() {
150 String iam = 'findPublishedLogs'
151
152 enter(iam)
153 sh(label : iam,
154 script : """
155find . -name 'output.xml' -print
156""")
157 leave(iam)
158 return
159}
160
161// -----------------------------------------------------------------------
162// Intent: Terminate kail-startup process launched earlier
163// -----------------------------------------------------------------------
164// :param caller: Name of parent calling function (debug context)
165// :type caller: String, optional
166// :returns: none
167// :rtype: void
168// -----------------------------------------------------------------------
169void killKailStartup(String caller='') {
170 String iam = "killKailStartup (caller=$caller)"
171
172 enter(iam)
173 sh(label : 'Terminate kail-startup',
174 script : """
175if [[ \$(pgrep --count '_TAG=kail-startup') -gt 0 ]]; then
176 pkill --uid \$(id -u) --echo --list-full --full '_TAG=kail-startup'
177fi
178""")
179 leave(iam)
180 return
181}
182
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400183// -----------------------------------------------------------------------
Joey Armstrong0251e962023-08-25 20:51:31 -0400184// Intent: Iterate over a list of test suites and invoke.
Joey Armstronge5aae1c2023-07-24 14:11:20 -0400185// -----------------------------------------------------------------------
Joey Armstrong0251e962023-08-25 20:51:31 -0400186void execute_test\
187(
188 String testTarget, // functional-single-kind-dt
189 String workflow, // dt
190 String testLogging, // 'True'
191 Boolean teardown, // true
Guru4dc382f2025-01-10 18:14:58 +0530192 String testSpecificHelmFlags='',
193 String vgcEnabled
Joey Armstrong0251e962023-08-25 20:51:31 -0400194) {
Joey Armstrongb65ada32023-08-03 12:50:20 -0400195 String infraNamespace = 'default'
196 String volthaNamespace = 'voltha'
197 String logsDir = "$WORKSPACE/${testTarget}"
Joey Armstrong293e16b2022-11-26 20:16:33 -0500198
Joey Armstrong0e0a42b2023-08-02 21:04:21 -0400199 // -----------------------------------------------------------------------
Joey Armstrong268442d2023-08-22 17:16:10 -0400200 // Intent: Cleanup stale port-forwarding
Joey Armstrong0e0a42b2023-08-02 21:04:21 -0400201 // -----------------------------------------------------------------------
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400202 stage('Cleanup') {
203 if (teardown) {
Joey Armstrong84adc542023-04-11 14:47:34 -0400204 timeout(15) {
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400205 script {
Joey Armstrongb65ada32023-08-03 12:50:20 -0400206 helmTeardown(['default', infraNamespace, volthaNamespace])
Joey Armstrong84adc542023-04-11 14:47:34 -0400207 }
Joey Armstrong0251e962023-08-25 20:51:31 -0400208 } // timeout
209
210 timeout(5) {
211 script {
212 enter('Cleanup')
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400213 cleanupPortForward()
Joey Armstrong6146f7e2023-08-28 09:05:38 -0400214 leave('Cleanup')
Joey Armstrong0251e962023-08-25 20:51:31 -0400215 } // script
216 } // timeout
217 } // teardown
218 } // stage('Cleanup')
Joey Armstrong8c6f6482023-01-12 12:31:44 -0500219
Joey Armstrong0e0a42b2023-08-02 21:04:21 -0400220 // -----------------------------------------------------------------------
221 // -----------------------------------------------------------------------
Joey Armstrong0251e962023-08-25 20:51:31 -0400222 stage('Deploy common infrastructure') {
223 script {
224 local dashargs = [
225 'kpi_exporter.enabled=false',
226 'dashboards.xos=false',
227 'dashboards.onos=false',
228 'dashboards.aaa=false',
229 'dashboards.voltha=false',
230 ].join(',')
231
232 local promargs = [
233 'prometheus.alertmanager.enabled=false',
234 'prometheus.pushgateway.enabled=false',
235 ].join(',')
236
Joey Armstrong6146f7e2023-08-28 09:05:38 -0400237 sh(label : 'Deploy common infrastructure',
238 script : """
Hardik Windlasse1660492022-03-14 15:12:46 +0000239 helm repo add onf https://charts.opencord.org
240 helm repo update
Joey Armstrong0251e962023-08-25 20:51:31 -0400241
242 echo -e "\nwithMonitoring=[$withMonitoring]"
Hardik Windlasse1660492022-03-14 15:12:46 +0000243 if [ ${withMonitoring} = true ] ; then
244 helm install nem-monitoring onf/nem-monitoring \
Joey Armstrong0251e962023-08-25 20:51:31 -0400245 --set ${promargs} \
246 --set ${dashargs}
Hardik Windlasse1660492022-03-14 15:12:46 +0000247 fi
Joey Armstrong0251e962023-08-25 20:51:31 -0400248 """)
249 } // script
250 } // stage('Deploy Common Infra')
Joey Armstrong8c6f6482023-01-12 12:31:44 -0500251
Joey Armstrong0251e962023-08-25 20:51:31 -0400252 // -----------------------------------------------------------------------
253 // [TODO] Check onos_log output
254 // -----------------------------------------------------------------------
255 stage('Deploy Voltha') {
256 if (teardown) {
257 timeout(10) {
258 script {
259 String iam = getIam('Deploy Voltha')
260 String onosLog = "${logsDir}/onos-voltha-startup-combined.log"
Hardik Windlassec9341b2021-06-07 11:58:29 +0000261
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400262 sh(label : 'Launch kail-startup',
263 script : """
264mkdir -p "$logsDir"
265touch "$onosLog"
Joey Armstrongf404b642023-08-04 14:39:13 -0400266
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400267_TAG=kail-startup kail -n ${infraNamespace} -n ${volthaNamespace} > "$onosLog" &
268""")
269
270 // if we're downloading a voltha-helm-charts patch,
271 // install from a local copy of the charts
Joey Armstrong0251e962023-08-25 20:51:31 -0400272 Boolean localCharts = false
Joey Armstrongf404b642023-08-04 14:39:13 -0400273
Joey Armstrong0251e962023-08-25 20:51:31 -0400274 if (volthaHelmChartsChange != ''
275 || gerritProject == 'voltha-helm-charts'
276 || isReleaseBranch(branch) // branch != 'master'
277 ) {
278 localCharts = true
279 }
Hardik Windlassec9341b2021-06-07 11:58:29 +0000280
Joey Armstrong0251e962023-08-25 20:51:31 -0400281 String branchName = branchName()
282 Boolean isRelease = isReleaseBranch(branch)
283 println([
284 " ** localCharts=${localCharts}",
285 "branchName=${branchName}",
286 "branch=${branch}",
287 "branch=isReleaseBranch=${isRelease}",
288 ].join(', '))
Matteo Scandolo42f6e572021-01-25 15:11:34 -0800289
Joey Armstrong0251e962023-08-25 20:51:31 -0400290 // -----------------------------------------------------------------------
291 // Rewrite localHelmFlags using array join, moving code around and
292 // refactoring into standalone functions
293 // -----------------------------------------------------------------------
294 // NOTE temporary workaround expose ONOS node ports
295 // -----------------------------------------------------------------------
296 String localHelmFlags = [
297 extraHelmFlags.trim(),
298 "--set global.log_level=${logLevel.toUpperCase()}",
299 '--set onos-classic.onosSshPort=30115',
300 '--set onos-classic.onosApiPort=30120',
301 '--set onos-classic.onosOfPort=31653',
302 '--set onos-classic.individualOpenFlowNodePorts=true',
303 testSpecificHelmFlags
304 ].join(' ')
Joey Armstrong28e86ee2023-08-03 15:22:29 -0400305
Joey Armstrong0251e962023-08-25 20:51:31 -0400306 println("** ${iam} localHelmFlags = ${localHelmFlags}")
Hardik Windlassec9341b2021-06-07 11:58:29 +0000307
Joey Armstrong0251e962023-08-25 20:51:31 -0400308 if (gerritProject != '') {
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400309 localHelmFlags += getVolthaImageFlags(gerritProject)
Joey Armstrong0251e962023-08-25 20:51:31 -0400310 }
Matteo Scandolofcfc60d2021-02-24 09:06:48 -0800311
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400312 enter('volthaDeploy')
Joey Armstrong0251e962023-08-25 20:51:31 -0400313 volthaDeploy([
314 infraNamespace: infraNamespace,
315 volthaNamespace: volthaNamespace,
316 workflow: workflow.toLowerCase(),
317 withMacLearning: enableMacLearning.toBoolean(),
318 extraHelmFlags: localHelmFlags,
319 localCharts: localCharts,
320 bbsimReplica: olts.toInteger(),
321 dockerRegistry: registry,
Guru4dc382f2025-01-10 18:14:58 +0530322 vgcEnabled: vgcEnabled.toLowerCase(),
Joey Armstrong0251e962023-08-25 20:51:31 -0400323 ])
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400324 leave('volthaDeploy')
Joey Armstrong0251e962023-08-25 20:51:31 -0400325 } // script
Joey Armstronge5aae1c2023-07-24 14:11:20 -0400326
Joey Armstrong1b7cc792023-09-26 14:19:21 -0400327 // Display spawned procs
328 script {
329 enter('bbsim-tests::pgrep_port_forward::0')
330 pgrep_port_forward('port-forw')
331 leave('bbsim-tests::pgrep_port_forward::0')
Joey Armstrongbccfa4b2023-09-27 17:34:22 -0400332
333 killKailStartup('Deploy Voltha')
Joey Armstrong1b7cc792023-09-26 14:19:21 -0400334 }
Joey Armstrong0251e962023-08-25 20:51:31 -0400335
Joey Armstrong0251e962023-08-25 20:51:31 -0400336 // -----------------------------------------------------------------------
337 // Bundle onos-voltha / kail logs
338 // -----------------------------------------------------------------------
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400339 sh(
340 label : 'Bundle logs: onos-voltha-startup-combined',
341 script : """
Joey Armstrong0251e962023-08-25 20:51:31 -0400342cat <<EOM
343
344** -----------------------------------------------------------------------
Joey Armstrong7ba23ac2023-08-29 15:21:53 -0400345** Combine and compress voltha startup log(s)
Joey Armstrong0251e962023-08-25 20:51:31 -0400346** -----------------------------------------------------------------------
347EOM
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400348
349pushd "${logsDir}" || { echo "ERROR: pushd $logsDir failed"; exit 1; }
350gzip -k onos-voltha-startup-combined.log
351rm onos-voltha-startup-combined.log
352popd || { echo "ERROR: popd $logsDir failed"; exit 1; }
Joey Armstrong0251e962023-08-25 20:51:31 -0400353 """)
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400354 } // timeout(10)
Joey Armstrong2d5a7c12023-04-13 09:37:42 -0400355
Joey Armstrong0251e962023-08-25 20:51:31 -0400356 // -----------------------------------------------------------------------
357 // -----------------------------------------------------------------------
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400358 sh(label : 'while-true-port-forward',
Roger Luethicebf79a2023-09-28 09:41:45 +0200359 script : """
Hardik Windlassec9341b2021-06-07 11:58:29 +0000360 JENKINS_NODE_COOKIE="dontKillMe" _TAG="voltha-infra-kafka" bash -c "while true; do kubectl port-forward --address 0.0.0.0 -n ${infraNamespace} svc/voltha-infra-kafka 9092:9092; done"&
361 bbsimDmiPortFwd=50075
362 for i in {0..${olts.toInteger() - 1}}; do
363 JENKINS_NODE_COOKIE="dontKillMe" _TAG="bbsim\${i}" bash -c "while true; do kubectl port-forward --address 0.0.0.0 -n ${volthaNamespace} svc/bbsim\${i} \${bbsimDmiPortFwd}:50075; done"&
364 ((bbsimDmiPortFwd++))
365 done
Hardik Windlass3bb089a2022-03-22 17:56:03 +0000366 if [ ${withMonitoring} = true ] ; then
367 JENKINS_NODE_COOKIE="dontKillMe" _TAG="nem-monitoring-prometheus-server" bash -c "while true; do kubectl port-forward --address 0.0.0.0 -n default svc/nem-monitoring-prometheus-server 31301:80; done"&
368 fi
Joey Armstrong7ba23ac2023-08-29 15:21:53 -0400369# ps aux | grep port-forward
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400370""")
Joey Armstrong0251e962023-08-25 20:51:31 -0400371 // ---------------------------------
372 // Sanity check port-forward spawned
373 // ---------------------------------
Joey Armstrong1b7cc792023-09-26 14:19:21 -0400374 script {
375 enter('bbsim-tests::pgrep_port_forward::1')
376 pgrep_port_forward('port-forw')
377 leave('bbsim-tests::pgrep_port_forward::1')
378 }
Joey Armstrong8c6f6482023-01-12 12:31:44 -0500379
Joey Armstrong2d5a7c12023-04-13 09:37:42 -0400380 // setting ONOS log level
Joey Armstrong0251e962023-08-25 20:51:31 -0400381 script {
382 enter('setOnosLogLevels')
383 setOnosLogLevels([
Joey Armstrong2d5a7c12023-04-13 09:37:42 -0400384 onosNamespace: infraNamespace,
385 apps: [
386 'org.opencord.dhcpl2relay',
387 'org.opencord.olt',
388 'org.opencord.aaa',
389 'org.opencord.maclearner',
390 'org.onosproject.net.flowobjective.impl.FlowObjectiveManager',
391 'org.onosproject.net.flowobjective.impl.InOrderFlowObjectiveManager'
392 ],
393 logLevel: logLevel
394 ])
Joey Armstrong6146f7e2023-08-28 09:05:38 -0400395 leave('setOnosLogLevels')
Joey Armstrong2d5a7c12023-04-13 09:37:42 -0400396 } // script
397 } // if (teardown)
398 } // stage('Deploy Voltha')
399
Joey Armstrong66fcb4e2023-08-11 12:09:24 -0400400 // -----------------------------------------------------------------------
401 // -----------------------------------------------------------------------
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400402 stage("Run test ${testTarget} on workflow ${workflow}") {
Joey Armstrong6146f7e2023-08-28 09:05:38 -0400403 sh(
404 label : 'Monitor using mem_consumption.py',
405 script : """
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400406echo -e "\n** Monitor using mem_consumption.py ?"
Joey Armstrong66fcb4e2023-08-11 12:09:24 -0400407
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400408if [ ${withMonitoring} = true ] ; then
409 cat <<EOM
Joey Armstrong66fcb4e2023-08-11 12:09:24 -0400410
411** -----------------------------------------------------------------------
412** Monitoring memory usage with mem_consumption.py
413** -----------------------------------------------------------------------
414EOM
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400415 mkdir -p "$WORKSPACE/voltha-pods-mem-consumption-${workflow}"
416 cd "$WORKSPACE/voltha-system-tests"
Joey Armstrong66fcb4e2023-08-11 12:09:24 -0400417
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400418 echo '** Installing python virtualenv'
419 make venv-activate-patched
Joey Armstrong66fcb4e2023-08-11 12:09:24 -0400420
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400421 # Collect initial memory consumption
422 set +u && source .venv/bin/activate && set -u
423 python scripts/mem_consumption.py -o $WORKSPACE/voltha-pods-mem-consumption-${workflow} -a 0.0.0.0:31301 -n ${volthaNamespace}
424fi
Joey Armstrong66fcb4e2023-08-11 12:09:24 -0400425
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400426echo -e '** Monitor memory consumption: LEAVE\n'
427""")
Joey Armstrong2d5a7c12023-04-13 09:37:42 -0400428
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400429 sh(
430 label : "make testTarget=[${testTarget}]",
431 script : """
432echo -e "\n** make testTarget=[${testTarget}]"
433mkdir -p ${logsDir}
434export ROBOT_MISC_ARGS="-d ${logsDir} ${params.extraRobotArgs} "
435ROBOT_MISC_ARGS+="-v ONOS_SSH_PORT:30115 -v ONOS_REST_PORT:30120 -v NAMESPACE:${volthaNamespace} -v INFRA_NAMESPACE:${infraNamespace} -v container_log_dir:${logsDir} -v logging:${testLogging}"
436export KVSTOREPREFIX=voltha/voltha_voltha
Matteo Scandolo42f6e572021-01-25 15:11:34 -0800437
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400438make -C "$WORKSPACE/voltha-system-tests" ${testTarget}
439""")
Joey Armstrong2d5a7c12023-04-13 09:37:42 -0400440
441 getPodsInfo("${logsDir}")
442
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400443 // [TODO] make conditional, bundle when logs are available
Joey Armstrong6146f7e2023-08-28 09:05:38 -0400444 sh(
445 label : 'Gather robot Framework logs',
446 script : """
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400447echo -e '\n** Gather robot Framework logs: ENTER'
Joey Armstrong7ba23ac2023-08-29 15:21:53 -0400448
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400449# set +e
450# collect logs collected in the Robot Framework StartLogging keyword
451cd "${logsDir}"
Joey Armstrong7ba23ac2023-08-29 15:21:53 -0400452
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400453echo "** Available logs:"
454/bin/ls -l "$logsDir"
455echo
Joey Armstrong7ba23ac2023-08-29 15:21:53 -0400456
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400457echo '** Bundle combined log'
458gzip *-combined.log || true
459rm -f *-combined.log || true
Joey Armstrong54dec092023-08-03 18:21:38 -0400460
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400461echo -e '** Gather robot Framework logs: LEAVE\n'
462""")
Joey Armstrong2d5a7c12023-04-13 09:37:42 -0400463
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400464 // -----------------------------------------------------------------------
465 // -----------------------------------------------------------------------
Joey Armstrong6146f7e2023-08-28 09:05:38 -0400466 sh(
467 label : 'Monitor pod-mem-consumption',
468 script : """
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400469echo -e '** Monitor pod-mem-consumption: ENTER'
470if [ ${withMonitoring} = true ] ; then
Joey Armstrong66fcb4e2023-08-11 12:09:24 -0400471 cat <<EOM
472
473** -----------------------------------------------------------------------
474** Monitoring pod-memory-consumption using mem_consumption.py
475** -----------------------------------------------------------------------
476EOM
Joey Armstrong66fcb4e2023-08-11 12:09:24 -0400477
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400478cd "$WORKSPACE/voltha-system-tests"
Joey Armstrong66fcb4e2023-08-11 12:09:24 -0400479
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400480echo '** Installing python virtualenv'
481make venv-activate-patched
482
483# Collect memory consumption of voltha pods once all the tests are complete
484set +u && source .venv/bin/activate && set -u
485python scripts/mem_consumption.py -o $WORKSPACE/voltha-pods-mem-consumption-${workflow} -a 0.0.0.0:31301 -n ${volthaNamespace}
486fi
487echo -e '** Monitor pod-mem-consumption: LEAVE\n'
488""")
Joey Armstrong2d5a7c12023-04-13 09:37:42 -0400489 } // stage
Joey Armstrongb65ada32023-08-03 12:50:20 -0400490
491 return
Joey Armstrong2d5a7c12023-04-13 09:37:42 -0400492} // execute_test()
Matteo Scandolo42f6e572021-01-25 15:11:34 -0800493
Joey Armstrong2d5a7c12023-04-13 09:37:42 -0400494// -----------------------------------------------------------------------
495// -----------------------------------------------------------------------
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400496void collectArtifacts(exitStatus) {
Joey Armstrong0251e962023-08-25 20:51:31 -0400497 script {
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400498 enter("exitStatus=${exitStatus}")
Joey Armstrongf0232762024-02-11 17:23:04 -0500499 banner('collectArtifacts')
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400500 }
Joey Armstrongdaa1f0a2024-04-03 18:07:59 -0400501
Joey Armstrongcd419122023-08-07 14:56:39 -0400502 getPodsInfo("$WORKSPACE/${exitStatus}")
Joey Armstrong66fcb4e2023-08-11 12:09:24 -0400503
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400504 sh(label : 'kubectl logs > voltha.log',
505 script : """
506kubectl logs -n voltha -l app.kubernetes.io/part-of=voltha \
507 > $WORKSPACE/${exitStatus}/voltha.log
508""")
Joey Armstrong66fcb4e2023-08-11 12:09:24 -0400509
Joey Armstrongcd419122023-08-07 14:56:39 -0400510 archiveArtifacts artifacts: '**/*.log,**/*.gz,**/*.txt,**/*.html,**/voltha-pods-mem-consumption-att/*,**/voltha-pods-mem-consumption-dt/*,**/voltha-pods-mem-consumption-tt/*'
Joey Armstrong66fcb4e2023-08-11 12:09:24 -0400511
Joey Armstrongbccfa4b2023-09-27 17:34:22 -0400512 script { killKailStartup('collectArtifacts') }
513 script { findPublishedLogs() }
Joey Armstrong97a8b882023-08-02 16:08:52 -0400514
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400515 enter('RobotPublisher')
Joey Armstrongcd419122023-08-07 14:56:39 -0400516 step([$class: 'RobotPublisher',
Joey Armstrong0251e962023-08-25 20:51:31 -0400517 disableArchiveOutput: false,
518 logFileName: '**/*/log*.html',
519 otherFiles: '',
520 outputFileName: '**/*/output*.xml',
521 outputPath: '.',
522 passThreshold: 100,
523 reportFileName: '**/*/report*.html',
524 unstableThreshold: 0,
525 onlyCritical: true])
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400526 leave('RobotPublisher')
Joey Armstrongcd419122023-08-07 14:56:39 -0400527
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400528 leave("exitStatus=${exitStatus}")
Joey Armstrongcd419122023-08-07 14:56:39 -0400529 return
Hardik Windlassec9341b2021-06-07 11:58:29 +0000530}
531
Joey Armstrongb65ada32023-08-03 12:50:20 -0400532// -----------------------------------------------------------------------
533// Intent: main
534// -----------------------------------------------------------------------
Matteo Scandolo42f6e572021-01-25 15:11:34 -0800535pipeline {
Joey Armstrong0251e962023-08-25 20:51:31 -0400536 /* no label, executor is determined by JJB */
537 agent {
538 label "${params.buildNode}"
Matteo Scandolo42f6e572021-01-25 15:11:34 -0800539 }
Joey Armstrong84adc542023-04-11 14:47:34 -0400540
Joey Armstrong0251e962023-08-25 20:51:31 -0400541 options {
542 timeout(time: "${timeout}", unit: 'MINUTES')
Matteo Scandolo42f6e572021-01-25 15:11:34 -0800543 }
Joey Armstronged161f72023-04-11 13:16:59 -0400544
Joey Armstrong0251e962023-08-25 20:51:31 -0400545 environment {
546 KUBECONFIG = "$HOME/.kube/kind-${clusterName}"
547 VOLTCONFIG = "$HOME/.volt/config"
548 PATH = "$PATH:$WORKSPACE/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
549 DIAGS_PROFILE = 'VOLTHA_PROFILE'
550 SSHPASS = 'karaf'
551 }
Joey Armstrong0e0a42b2023-08-02 21:04:21 -0400552
Joey Armstrong0251e962023-08-25 20:51:31 -0400553 stages {
Joey Armstrongf3922212024-07-22 17:11:02 -0400554
Joey Armstrong0251e962023-08-25 20:51:31 -0400555 stage('Download Code') {
Joey Armstrongf404b642023-08-04 14:39:13 -0400556 steps {
Joey Armstrongdef9c402024-01-30 18:05:29 -0500557 enter('getVolthaCode')
Joey Armstrong0251e962023-08-25 20:51:31 -0400558 getVolthaCode([
559 branch: "${branch}",
560 gerritProject: "${gerritProject}",
561 gerritRefspec: "${gerritRefspec}",
562 volthaSystemTestsChange: "${volthaSystemTestsChange}",
563 volthaHelmChartsChange: "${volthaHelmChartsChange}",
564 ])
Joey Armstrongdef9c402024-01-30 18:05:29 -0500565 leave('getVolthaCode')
Joey Armstrong0251e962023-08-25 20:51:31 -0400566 }
567 }
Joey Armstrong2d5a7c12023-04-13 09:37:42 -0400568
Joey Armstrong0251e962023-08-25 20:51:31 -0400569 stage('Build patch v1.1') {
570 // build the patch only if gerritProject is specified
571 when {
572 expression { return !gerritProject.isEmpty() }
573 }
574
575 steps {
Joey Armstrongdef9c402024-01-30 18:05:29 -0500576 enter('buildVolthaComponent')
Joey Armstrong0251e962023-08-25 20:51:31 -0400577 // NOTE that the correct patch has already been checked out
578 // during the getVolthaCode step
579 buildVolthaComponent("${gerritProject}")
Joey Armstrongdef9c402024-01-30 18:05:29 -0500580 leave('buildVolthaComponent')
Joey Armstrong0251e962023-08-25 20:51:31 -0400581 }
582 }
583
584 // -----------------------------------------------------------------------
585 // -----------------------------------------------------------------------
586 stage('Install Kail')
587 {
588 steps
589 {
590 script
591 {
592 String cmd = [
593 'make',
594 '--no-print-directory',
595 '-C', "$WORKSPACE/voltha-system-tests",
596 "KAIL_PATH=\"$WORKSPACE/bin\"",
597 'kail',
598 ].join(' ')
599
600 println(" ** Running: ${cmd}")
601 sh("${cmd}")
602 } // script
603 } // steps
604 } // stage
605
606 // -----------------------------------------------------------------------
607 // -----------------------------------------------------------------------
Joey Armstrongf3922212024-07-22 17:11:02 -0400608 stage('Install kubectl')
609 {
610 steps
611 {
612 script
613 {
614 String cmd = [
615 'make',
616 '--no-print-directory',
617 '-C', "$WORKSPACE",
618 "KUBECTL_PATH=\"$WORKSPACE/bin\"",
619 'kubectl',
620 ].join(' ')
621
622 println(" ** Running: ${cmd}")
623 sh("${cmd}")
624 } // script
625 } // steps
626 } // stage
627
628 // -----------------------------------------------------------------------
629 // -----------------------------------------------------------------------
Joey Armstrong0251e962023-08-25 20:51:31 -0400630 stage('Install Tools') {
631 steps {
632 script {
633 String branchName = branchName()
634 String iam = getIam('Install Tools')
635
636 println("${iam}: ENTER (branch=$branch)")
637 installKind(branch) // needed early by stage(Cleanup)
638 println("${iam}: LEAVE (branch=$branch)")
639 } // script
640 } // steps
641 } // stage
642
643 // -----------------------------------------------------------------------
644 // -----------------------------------------------------------------------
645 stage('Create K8s Cluster') {
646 steps {
647 script {
648 def clusterExists = sh(
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400649 label : 'Create K8s Cluster',
Joey Armstrong0251e962023-08-25 20:51:31 -0400650 returnStdout: true,
651 script: """kind get clusters | grep "${clusterName}" | wc -l""")
652
653 if (clusterExists.trim() == '0') {
654 createKubernetesCluster([nodes: 3, name: clusterName])
655 }
656 } // script
657 } // steps
658 } // stage('Create K8s Cluster')
659
660 // -----------------------------------------------------------------------
661 // -----------------------------------------------------------------------
662 stage('Replace voltctl') {
663 // if the project is voltctl, override the downloaded one with the built one
664 when {
665 expression { return gerritProject == 'voltctl' }
666 }
667
668 // Hmmmm(?) where did the voltctl download happen ?
669 // Likely Makefile but would be helpful to document here.
670 steps {
671 script {
672 String iam = getIam('Replace voltctl')
673
674 println("${iam} Running: installVoltctl($branch)")
675 println("${iam}: ENTER")
676 installVoltctl("$branch")
677 println("${iam}: LEAVE")
678 } // script
679 } // step
680 } // stage
681
682 // -----------------------------------------------------------------------
683 // -----------------------------------------------------------------------
684 stage('Load image in kind nodes')
685 {
686 when {
687 expression { return !gerritProject.isEmpty() }
688 }
689 steps {
690 loadToKind()
691 } // steps
692 } // stage
693
694 // -----------------------------------------------------------------------
695 // [TODO] verify testing output
696 // -----------------------------------------------------------------------
697 stage('Parse and execute tests')
698 {
699 steps {
700 script {
701 // Announce ourselves for log usability
702 enter('Parse and execute tests')
703
Joey Armstrong6146f7e2023-08-28 09:05:38 -0400704 def tests = readYaml text: testTargets // typeof == Map (?)
Joey Armstrong0251e962023-08-25 20:51:31 -0400705 println("** [DEBUG]: tests=$tests")
706
707 // Display expected tests for times when output goes dark
708 tests.eachWithIndex { test, idx ->
709 String target = test['target']
710 println("** test[${idx}]: ${target}\n")
711 }
712
713 println('''
714** -----------------------------------------------------------------------
715** NOTE: For odd/silent job failures verify a few details
716** - All tests mentioned in the tests-to-run index were logged.
717** - Test suites display ENTER/LEAVE mesasge pairs.
718** - Processing terminated prematurely when LEAVE strings are missing.
719** -----------------------------------------------------------------------
720''')
721 tests.eachWithIndex { test, idx ->
722 println "** readYaml test suite[$idx]) test=[${test}]"
723
Joey Armstrongf404b642023-08-04 14:39:13 -0400724 String target = test['target']
725 String workflow = test['workflow']
726 String flags = test['flags']
727 Boolean teardown = test['teardown'].toBoolean()
728 Boolean logging = test['logging'].toBoolean()
729 String testLogging = (logging) ? 'True' : 'False'
730
Joey Armstrong0251e962023-08-25 20:51:31 -0400731 print("""
Joey Armstrong268442d2023-08-22 17:16:10 -0400732** -----------------------------------------------------------------------
Joey Armstrong0251e962023-08-25 20:51:31 -0400733** Executing test ${target} on workflow ${workflow} with logging ${testLogging} and extra flags ${flags}
Joey Armstrong268442d2023-08-22 17:16:10 -0400734** -----------------------------------------------------------------------
Joey Armstrong268442d2023-08-22 17:16:10 -0400735""")
736
Joey Armstrong0251e962023-08-25 20:51:31 -0400737 try {
Joey Armstrong6146f7e2023-08-28 09:05:38 -0400738 enter("execute_test (target=$target)")
Guru4dc382f2025-01-10 18:14:58 +0530739 execute_test(target, workflow, testLogging, teardown, flags, vgcEnabled)
Joey Armstrong0251e962023-08-25 20:51:31 -0400740 }
Joey Armstrong9341c9a2023-08-28 12:09:19 -0400741 // groovylint-disable-next-line CatchException
Joey Armstrong0251e962023-08-25 20:51:31 -0400742 catch (Exception err) {
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400743 String iamexc = getIam(test)
Joey Armstrong9341c9a2023-08-28 12:09:19 -0400744 println("** ${iamexc}: EXCEPTION ${err}")
Joey Armstrong0251e962023-08-25 20:51:31 -0400745 }
746 finally {
747 leave("execute_test (target=$target)")
748 }
Joey Armstrongb65ada32023-08-03 12:50:20 -0400749 } // for
Joey Armstrong0251e962023-08-25 20:51:31 -0400750 // Premature exit if this message is not logged
751 leave('Parse and execute tests')
Joey Armstrongb65ada32023-08-03 12:50:20 -0400752 } // script
753 } // steps
Joey Armstrong2d5a7c12023-04-13 09:37:42 -0400754 } // stage
755 } // stages
Joey Armstrong84adc542023-04-11 14:47:34 -0400756
757 post
Joey Armstrongbccfa4b2023-09-27 17:34:22 -0400758 { // https://www.jenkins.io/doc/book/pipeline/syntax/#post
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400759 aborted {
760 collectArtifacts('aborted')
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400761 }
762 failure {
763 collectArtifacts('failed')
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400764 }
765 always {
766 collectArtifacts('always')
Joey Armstrongbccfa4b2023-09-27 17:34:22 -0400767 }
768 cleanup {
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400769 script { cleanupPortForward() }
770 }
Matteo Scandolo42f6e572021-01-25 15:11:34 -0800771 }
Joey Armstrong2d5a7c12023-04-13 09:37:42 -0400772} // pipeline
Joey Armstronged161f72023-04-11 13:16:59 -0400773
Joey Armstrong664c55a2023-08-28 14:22:33 -0400774// [EOF]