blob: c0682fb51917a6d9b4fe2e2784c13f742c1e842b [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='',
Gurub7a354a2025-01-10 19:05:06 +0530193 Boolean 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 // -----------------------------------------------------------------------
gstc79131a2025-01-13 11:19:12 +0530296 String localHelmFlags = ""
297 if (!vgcEnabled) {
298 localHelmFlags = [
299 extraHelmFlags.trim(),
300 "--set global.log_level=${logLevel.toUpperCase()}",
301 '--set onos-classic.onosSshPort=30115',
302 '--set onos-classic.onosApiPort=30120',
303 '--set onos-classic.onosOfPort=31653',
304 '--set onos-classic.individualOpenFlowNodePorts=true',
305 testSpecificHelmFlags
306 ].join(' ')
307 } else {
308 localHelmFlags = [
309 extraHelmFlags.trim(),
310 testSpecificHelmFlags
311 ].join(' ')
312 }
Joey Armstrong28e86ee2023-08-03 15:22:29 -0400313
Joey Armstrong0251e962023-08-25 20:51:31 -0400314 println("** ${iam} localHelmFlags = ${localHelmFlags}")
Hardik Windlassec9341b2021-06-07 11:58:29 +0000315
Joey Armstrong0251e962023-08-25 20:51:31 -0400316 if (gerritProject != '') {
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400317 localHelmFlags += getVolthaImageFlags(gerritProject)
Joey Armstrong0251e962023-08-25 20:51:31 -0400318 }
Matteo Scandolofcfc60d2021-02-24 09:06:48 -0800319
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400320 enter('volthaDeploy')
Joey Armstrong0251e962023-08-25 20:51:31 -0400321 volthaDeploy([
322 infraNamespace: infraNamespace,
323 volthaNamespace: volthaNamespace,
324 workflow: workflow.toLowerCase(),
325 withMacLearning: enableMacLearning.toBoolean(),
326 extraHelmFlags: localHelmFlags,
327 localCharts: localCharts,
328 bbsimReplica: olts.toInteger(),
329 dockerRegistry: registry,
Gurub7a354a2025-01-10 19:05:06 +0530330 vgcEnabled: vgcEnabled,
Joey Armstrong0251e962023-08-25 20:51:31 -0400331 ])
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400332 leave('volthaDeploy')
Joey Armstrong0251e962023-08-25 20:51:31 -0400333 } // script
Joey Armstronge5aae1c2023-07-24 14:11:20 -0400334
Joey Armstrong1b7cc792023-09-26 14:19:21 -0400335 // Display spawned procs
336 script {
337 enter('bbsim-tests::pgrep_port_forward::0')
338 pgrep_port_forward('port-forw')
339 leave('bbsim-tests::pgrep_port_forward::0')
Joey Armstrongbccfa4b2023-09-27 17:34:22 -0400340
341 killKailStartup('Deploy Voltha')
Joey Armstrong1b7cc792023-09-26 14:19:21 -0400342 }
Joey Armstrong0251e962023-08-25 20:51:31 -0400343
Joey Armstrong0251e962023-08-25 20:51:31 -0400344 // -----------------------------------------------------------------------
345 // Bundle onos-voltha / kail logs
346 // -----------------------------------------------------------------------
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400347 sh(
348 label : 'Bundle logs: onos-voltha-startup-combined',
349 script : """
Joey Armstrong0251e962023-08-25 20:51:31 -0400350cat <<EOM
351
352** -----------------------------------------------------------------------
Joey Armstrong7ba23ac2023-08-29 15:21:53 -0400353** Combine and compress voltha startup log(s)
Joey Armstrong0251e962023-08-25 20:51:31 -0400354** -----------------------------------------------------------------------
355EOM
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400356
357pushd "${logsDir}" || { echo "ERROR: pushd $logsDir failed"; exit 1; }
358gzip -k onos-voltha-startup-combined.log
359rm onos-voltha-startup-combined.log
360popd || { echo "ERROR: popd $logsDir failed"; exit 1; }
Joey Armstrong0251e962023-08-25 20:51:31 -0400361 """)
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400362 } // timeout(10)
Joey Armstrong2d5a7c12023-04-13 09:37:42 -0400363
Joey Armstrong0251e962023-08-25 20:51:31 -0400364 // -----------------------------------------------------------------------
365 // -----------------------------------------------------------------------
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400366 sh(label : 'while-true-port-forward',
Roger Luethicebf79a2023-09-28 09:41:45 +0200367 script : """
Hardik Windlassec9341b2021-06-07 11:58:29 +0000368 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"&
369 bbsimDmiPortFwd=50075
370 for i in {0..${olts.toInteger() - 1}}; do
371 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"&
372 ((bbsimDmiPortFwd++))
373 done
Hardik Windlass3bb089a2022-03-22 17:56:03 +0000374 if [ ${withMonitoring} = true ] ; then
375 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"&
376 fi
gstc79131a2025-01-13 11:19:12 +0530377 if (vgcEnabled) {
378 JENKINS_NODE_COOKIE="dontKillMe" _TAG="vgc-Port-Forward-Enable" bash -c "while true; do kubectl port-forward --address 0.0.0.0 -n voltha svc/voltha-voltha-go-controller 8181:8181; done"&
379 fi
380 }
381
Joey Armstrong7ba23ac2023-08-29 15:21:53 -0400382# ps aux | grep port-forward
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400383""")
Joey Armstrong0251e962023-08-25 20:51:31 -0400384 // ---------------------------------
385 // Sanity check port-forward spawned
386 // ---------------------------------
Joey Armstrong1b7cc792023-09-26 14:19:21 -0400387 script {
388 enter('bbsim-tests::pgrep_port_forward::1')
389 pgrep_port_forward('port-forw')
390 leave('bbsim-tests::pgrep_port_forward::1')
391 }
Joey Armstrong8c6f6482023-01-12 12:31:44 -0500392
Joey Armstrong2d5a7c12023-04-13 09:37:42 -0400393 // setting ONOS log level
Joey Armstrong0251e962023-08-25 20:51:31 -0400394 script {
395 enter('setOnosLogLevels')
396 setOnosLogLevels([
Joey Armstrong2d5a7c12023-04-13 09:37:42 -0400397 onosNamespace: infraNamespace,
398 apps: [
399 'org.opencord.dhcpl2relay',
400 'org.opencord.olt',
401 'org.opencord.aaa',
402 'org.opencord.maclearner',
403 'org.onosproject.net.flowobjective.impl.FlowObjectiveManager',
404 'org.onosproject.net.flowobjective.impl.InOrderFlowObjectiveManager'
405 ],
406 logLevel: logLevel
407 ])
Joey Armstrong6146f7e2023-08-28 09:05:38 -0400408 leave('setOnosLogLevels')
Joey Armstrong2d5a7c12023-04-13 09:37:42 -0400409 } // script
410 } // if (teardown)
411 } // stage('Deploy Voltha')
412
Joey Armstrong66fcb4e2023-08-11 12:09:24 -0400413 // -----------------------------------------------------------------------
414 // -----------------------------------------------------------------------
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400415 stage("Run test ${testTarget} on workflow ${workflow}") {
Joey Armstrong6146f7e2023-08-28 09:05:38 -0400416 sh(
417 label : 'Monitor using mem_consumption.py',
418 script : """
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400419echo -e "\n** Monitor using mem_consumption.py ?"
Joey Armstrong66fcb4e2023-08-11 12:09:24 -0400420
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400421if [ ${withMonitoring} = true ] ; then
422 cat <<EOM
Joey Armstrong66fcb4e2023-08-11 12:09:24 -0400423
424** -----------------------------------------------------------------------
425** Monitoring memory usage with mem_consumption.py
426** -----------------------------------------------------------------------
427EOM
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400428 mkdir -p "$WORKSPACE/voltha-pods-mem-consumption-${workflow}"
429 cd "$WORKSPACE/voltha-system-tests"
Joey Armstrong66fcb4e2023-08-11 12:09:24 -0400430
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400431 echo '** Installing python virtualenv'
432 make venv-activate-patched
Joey Armstrong66fcb4e2023-08-11 12:09:24 -0400433
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400434 # Collect initial memory consumption
435 set +u && source .venv/bin/activate && set -u
436 python scripts/mem_consumption.py -o $WORKSPACE/voltha-pods-mem-consumption-${workflow} -a 0.0.0.0:31301 -n ${volthaNamespace}
437fi
Joey Armstrong66fcb4e2023-08-11 12:09:24 -0400438
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400439echo -e '** Monitor memory consumption: LEAVE\n'
440""")
Joey Armstrong2d5a7c12023-04-13 09:37:42 -0400441
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400442 sh(
443 label : "make testTarget=[${testTarget}]",
444 script : """
445echo -e "\n** make testTarget=[${testTarget}]"
446mkdir -p ${logsDir}
447export ROBOT_MISC_ARGS="-d ${logsDir} ${params.extraRobotArgs} "
448ROBOT_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}"
449export KVSTOREPREFIX=voltha/voltha_voltha
Matteo Scandolo42f6e572021-01-25 15:11:34 -0800450
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400451make -C "$WORKSPACE/voltha-system-tests" ${testTarget}
452""")
Joey Armstrong2d5a7c12023-04-13 09:37:42 -0400453
454 getPodsInfo("${logsDir}")
455
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400456 // [TODO] make conditional, bundle when logs are available
Joey Armstrong6146f7e2023-08-28 09:05:38 -0400457 sh(
458 label : 'Gather robot Framework logs',
459 script : """
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400460echo -e '\n** Gather robot Framework logs: ENTER'
Joey Armstrong7ba23ac2023-08-29 15:21:53 -0400461
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400462# set +e
463# collect logs collected in the Robot Framework StartLogging keyword
464cd "${logsDir}"
Joey Armstrong7ba23ac2023-08-29 15:21:53 -0400465
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400466echo "** Available logs:"
467/bin/ls -l "$logsDir"
468echo
Joey Armstrong7ba23ac2023-08-29 15:21:53 -0400469
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400470echo '** Bundle combined log'
471gzip *-combined.log || true
472rm -f *-combined.log || true
Joey Armstrong54dec092023-08-03 18:21:38 -0400473
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400474echo -e '** Gather robot Framework logs: LEAVE\n'
475""")
Joey Armstrong2d5a7c12023-04-13 09:37:42 -0400476
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400477 // -----------------------------------------------------------------------
478 // -----------------------------------------------------------------------
Joey Armstrong6146f7e2023-08-28 09:05:38 -0400479 sh(
480 label : 'Monitor pod-mem-consumption',
481 script : """
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400482echo -e '** Monitor pod-mem-consumption: ENTER'
483if [ ${withMonitoring} = true ] ; then
Joey Armstrong66fcb4e2023-08-11 12:09:24 -0400484 cat <<EOM
485
486** -----------------------------------------------------------------------
487** Monitoring pod-memory-consumption using mem_consumption.py
488** -----------------------------------------------------------------------
489EOM
Joey Armstrong66fcb4e2023-08-11 12:09:24 -0400490
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400491cd "$WORKSPACE/voltha-system-tests"
Joey Armstrong66fcb4e2023-08-11 12:09:24 -0400492
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400493echo '** Installing python virtualenv'
494make venv-activate-patched
495
496# Collect memory consumption of voltha pods once all the tests are complete
497set +u && source .venv/bin/activate && set -u
498python scripts/mem_consumption.py -o $WORKSPACE/voltha-pods-mem-consumption-${workflow} -a 0.0.0.0:31301 -n ${volthaNamespace}
499fi
500echo -e '** Monitor pod-mem-consumption: LEAVE\n'
501""")
Joey Armstrong2d5a7c12023-04-13 09:37:42 -0400502 } // stage
Joey Armstrongb65ada32023-08-03 12:50:20 -0400503
504 return
Joey Armstrong2d5a7c12023-04-13 09:37:42 -0400505} // execute_test()
Matteo Scandolo42f6e572021-01-25 15:11:34 -0800506
Joey Armstrong2d5a7c12023-04-13 09:37:42 -0400507// -----------------------------------------------------------------------
508// -----------------------------------------------------------------------
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400509void collectArtifacts(exitStatus) {
Joey Armstrong0251e962023-08-25 20:51:31 -0400510 script {
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400511 enter("exitStatus=${exitStatus}")
Joey Armstrongf0232762024-02-11 17:23:04 -0500512 banner('collectArtifacts')
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400513 }
Joey Armstrongdaa1f0a2024-04-03 18:07:59 -0400514
Joey Armstrongcd419122023-08-07 14:56:39 -0400515 getPodsInfo("$WORKSPACE/${exitStatus}")
Joey Armstrong66fcb4e2023-08-11 12:09:24 -0400516
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400517 sh(label : 'kubectl logs > voltha.log',
518 script : """
519kubectl logs -n voltha -l app.kubernetes.io/part-of=voltha \
520 > $WORKSPACE/${exitStatus}/voltha.log
521""")
Joey Armstrong66fcb4e2023-08-11 12:09:24 -0400522
Joey Armstrongcd419122023-08-07 14:56:39 -0400523 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 -0400524
Joey Armstrongbccfa4b2023-09-27 17:34:22 -0400525 script { killKailStartup('collectArtifacts') }
526 script { findPublishedLogs() }
Joey Armstrong97a8b882023-08-02 16:08:52 -0400527
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400528 enter('RobotPublisher')
Joey Armstrongcd419122023-08-07 14:56:39 -0400529 step([$class: 'RobotPublisher',
Joey Armstrong0251e962023-08-25 20:51:31 -0400530 disableArchiveOutput: false,
531 logFileName: '**/*/log*.html',
532 otherFiles: '',
533 outputFileName: '**/*/output*.xml',
534 outputPath: '.',
535 passThreshold: 100,
536 reportFileName: '**/*/report*.html',
537 unstableThreshold: 0,
538 onlyCritical: true])
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400539 leave('RobotPublisher')
Joey Armstrongcd419122023-08-07 14:56:39 -0400540
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400541 leave("exitStatus=${exitStatus}")
Joey Armstrongcd419122023-08-07 14:56:39 -0400542 return
Hardik Windlassec9341b2021-06-07 11:58:29 +0000543}
544
Joey Armstrongb65ada32023-08-03 12:50:20 -0400545// -----------------------------------------------------------------------
546// Intent: main
547// -----------------------------------------------------------------------
Matteo Scandolo42f6e572021-01-25 15:11:34 -0800548pipeline {
Joey Armstrong0251e962023-08-25 20:51:31 -0400549 /* no label, executor is determined by JJB */
550 agent {
551 label "${params.buildNode}"
Matteo Scandolo42f6e572021-01-25 15:11:34 -0800552 }
Joey Armstrong84adc542023-04-11 14:47:34 -0400553
Joey Armstrong0251e962023-08-25 20:51:31 -0400554 options {
555 timeout(time: "${timeout}", unit: 'MINUTES')
Matteo Scandolo42f6e572021-01-25 15:11:34 -0800556 }
Joey Armstronged161f72023-04-11 13:16:59 -0400557
Joey Armstrong0251e962023-08-25 20:51:31 -0400558 environment {
559 KUBECONFIG = "$HOME/.kube/kind-${clusterName}"
560 VOLTCONFIG = "$HOME/.volt/config"
561 PATH = "$PATH:$WORKSPACE/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
562 DIAGS_PROFILE = 'VOLTHA_PROFILE'
563 SSHPASS = 'karaf'
564 }
Joey Armstrong0e0a42b2023-08-02 21:04:21 -0400565
Joey Armstrong0251e962023-08-25 20:51:31 -0400566 stages {
Joey Armstrongf3922212024-07-22 17:11:02 -0400567
Joey Armstrong0251e962023-08-25 20:51:31 -0400568 stage('Download Code') {
Joey Armstrongf404b642023-08-04 14:39:13 -0400569 steps {
Joey Armstrongdef9c402024-01-30 18:05:29 -0500570 enter('getVolthaCode')
Joey Armstrong0251e962023-08-25 20:51:31 -0400571 getVolthaCode([
572 branch: "${branch}",
573 gerritProject: "${gerritProject}",
574 gerritRefspec: "${gerritRefspec}",
575 volthaSystemTestsChange: "${volthaSystemTestsChange}",
576 volthaHelmChartsChange: "${volthaHelmChartsChange}",
577 ])
Joey Armstrongdef9c402024-01-30 18:05:29 -0500578 leave('getVolthaCode')
Joey Armstrong0251e962023-08-25 20:51:31 -0400579 }
580 }
Joey Armstrong2d5a7c12023-04-13 09:37:42 -0400581
Joey Armstrong0251e962023-08-25 20:51:31 -0400582 stage('Build patch v1.1') {
583 // build the patch only if gerritProject is specified
584 when {
585 expression { return !gerritProject.isEmpty() }
586 }
587
588 steps {
Joey Armstrongdef9c402024-01-30 18:05:29 -0500589 enter('buildVolthaComponent')
Joey Armstrong0251e962023-08-25 20:51:31 -0400590 // NOTE that the correct patch has already been checked out
591 // during the getVolthaCode step
592 buildVolthaComponent("${gerritProject}")
Joey Armstrongdef9c402024-01-30 18:05:29 -0500593 leave('buildVolthaComponent')
Joey Armstrong0251e962023-08-25 20:51:31 -0400594 }
595 }
596
597 // -----------------------------------------------------------------------
598 // -----------------------------------------------------------------------
599 stage('Install Kail')
600 {
601 steps
602 {
603 script
604 {
605 String cmd = [
606 'make',
607 '--no-print-directory',
608 '-C', "$WORKSPACE/voltha-system-tests",
609 "KAIL_PATH=\"$WORKSPACE/bin\"",
610 'kail',
611 ].join(' ')
612
613 println(" ** Running: ${cmd}")
614 sh("${cmd}")
615 } // script
616 } // steps
617 } // stage
618
619 // -----------------------------------------------------------------------
620 // -----------------------------------------------------------------------
Joey Armstrongf3922212024-07-22 17:11:02 -0400621 stage('Install kubectl')
622 {
623 steps
624 {
625 script
626 {
627 String cmd = [
628 'make',
629 '--no-print-directory',
630 '-C', "$WORKSPACE",
631 "KUBECTL_PATH=\"$WORKSPACE/bin\"",
632 'kubectl',
633 ].join(' ')
634
635 println(" ** Running: ${cmd}")
636 sh("${cmd}")
637 } // script
638 } // steps
639 } // stage
640
641 // -----------------------------------------------------------------------
642 // -----------------------------------------------------------------------
Joey Armstrong0251e962023-08-25 20:51:31 -0400643 stage('Install Tools') {
644 steps {
645 script {
646 String branchName = branchName()
647 String iam = getIam('Install Tools')
648
649 println("${iam}: ENTER (branch=$branch)")
650 installKind(branch) // needed early by stage(Cleanup)
651 println("${iam}: LEAVE (branch=$branch)")
652 } // script
653 } // steps
654 } // stage
655
656 // -----------------------------------------------------------------------
657 // -----------------------------------------------------------------------
658 stage('Create K8s Cluster') {
659 steps {
660 script {
661 def clusterExists = sh(
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400662 label : 'Create K8s Cluster',
Joey Armstrong0251e962023-08-25 20:51:31 -0400663 returnStdout: true,
664 script: """kind get clusters | grep "${clusterName}" | wc -l""")
665
666 if (clusterExists.trim() == '0') {
667 createKubernetesCluster([nodes: 3, name: clusterName])
668 }
669 } // script
670 } // steps
671 } // stage('Create K8s Cluster')
672
673 // -----------------------------------------------------------------------
674 // -----------------------------------------------------------------------
675 stage('Replace voltctl') {
676 // if the project is voltctl, override the downloaded one with the built one
677 when {
678 expression { return gerritProject == 'voltctl' }
679 }
680
681 // Hmmmm(?) where did the voltctl download happen ?
682 // Likely Makefile but would be helpful to document here.
683 steps {
684 script {
685 String iam = getIam('Replace voltctl')
686
687 println("${iam} Running: installVoltctl($branch)")
688 println("${iam}: ENTER")
689 installVoltctl("$branch")
690 println("${iam}: LEAVE")
691 } // script
692 } // step
693 } // stage
694
695 // -----------------------------------------------------------------------
696 // -----------------------------------------------------------------------
697 stage('Load image in kind nodes')
698 {
699 when {
700 expression { return !gerritProject.isEmpty() }
701 }
702 steps {
703 loadToKind()
704 } // steps
705 } // stage
706
707 // -----------------------------------------------------------------------
708 // [TODO] verify testing output
709 // -----------------------------------------------------------------------
710 stage('Parse and execute tests')
711 {
712 steps {
713 script {
714 // Announce ourselves for log usability
715 enter('Parse and execute tests')
716
Joey Armstrong6146f7e2023-08-28 09:05:38 -0400717 def tests = readYaml text: testTargets // typeof == Map (?)
Joey Armstrong0251e962023-08-25 20:51:31 -0400718 println("** [DEBUG]: tests=$tests")
719
720 // Display expected tests for times when output goes dark
721 tests.eachWithIndex { test, idx ->
722 String target = test['target']
723 println("** test[${idx}]: ${target}\n")
724 }
725
726 println('''
727** -----------------------------------------------------------------------
728** NOTE: For odd/silent job failures verify a few details
729** - All tests mentioned in the tests-to-run index were logged.
730** - Test suites display ENTER/LEAVE mesasge pairs.
731** - Processing terminated prematurely when LEAVE strings are missing.
732** -----------------------------------------------------------------------
733''')
734 tests.eachWithIndex { test, idx ->
735 println "** readYaml test suite[$idx]) test=[${test}]"
736
Joey Armstrongf404b642023-08-04 14:39:13 -0400737 String target = test['target']
738 String workflow = test['workflow']
739 String flags = test['flags']
740 Boolean teardown = test['teardown'].toBoolean()
741 Boolean logging = test['logging'].toBoolean()
742 String testLogging = (logging) ? 'True' : 'False'
Guru876a28c2025-01-10 22:59:56 +0530743 Boolean vgcEnabled = test['vgcEnabled'] != null ? test['vgcEnabled'].toBoolean() : false
Joey Armstrongf404b642023-08-04 14:39:13 -0400744
Joey Armstrong0251e962023-08-25 20:51:31 -0400745 print("""
Joey Armstrong268442d2023-08-22 17:16:10 -0400746** -----------------------------------------------------------------------
Joey Armstrong0251e962023-08-25 20:51:31 -0400747** Executing test ${target} on workflow ${workflow} with logging ${testLogging} and extra flags ${flags}
Joey Armstrong268442d2023-08-22 17:16:10 -0400748** -----------------------------------------------------------------------
Joey Armstrong268442d2023-08-22 17:16:10 -0400749""")
750
Joey Armstrong0251e962023-08-25 20:51:31 -0400751 try {
Joey Armstrong6146f7e2023-08-28 09:05:38 -0400752 enter("execute_test (target=$target)")
Guru4dc382f2025-01-10 18:14:58 +0530753 execute_test(target, workflow, testLogging, teardown, flags, vgcEnabled)
Joey Armstrong0251e962023-08-25 20:51:31 -0400754 }
Joey Armstrong9341c9a2023-08-28 12:09:19 -0400755 // groovylint-disable-next-line CatchException
Joey Armstrong0251e962023-08-25 20:51:31 -0400756 catch (Exception err) {
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400757 String iamexc = getIam(test)
Joey Armstrong9341c9a2023-08-28 12:09:19 -0400758 println("** ${iamexc}: EXCEPTION ${err}")
Joey Armstrong0251e962023-08-25 20:51:31 -0400759 }
760 finally {
761 leave("execute_test (target=$target)")
762 }
Joey Armstrongb65ada32023-08-03 12:50:20 -0400763 } // for
Joey Armstrong0251e962023-08-25 20:51:31 -0400764 // Premature exit if this message is not logged
765 leave('Parse and execute tests')
Joey Armstrongb65ada32023-08-03 12:50:20 -0400766 } // script
767 } // steps
Joey Armstrong2d5a7c12023-04-13 09:37:42 -0400768 } // stage
769 } // stages
Joey Armstrong84adc542023-04-11 14:47:34 -0400770
771 post
Joey Armstrongbccfa4b2023-09-27 17:34:22 -0400772 { // https://www.jenkins.io/doc/book/pipeline/syntax/#post
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400773 aborted {
774 collectArtifacts('aborted')
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400775 }
776 failure {
777 collectArtifacts('failed')
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400778 }
779 always {
780 collectArtifacts('always')
Joey Armstrongbccfa4b2023-09-27 17:34:22 -0400781 }
782 cleanup {
Joey Armstrong9f66e3f2023-09-20 16:29:29 -0400783 script { cleanupPortForward() }
784 }
Matteo Scandolo42f6e572021-01-25 15:11:34 -0800785 }
Joey Armstrong2d5a7c12023-04-13 09:37:42 -0400786} // pipeline
Joey Armstronged161f72023-04-11 13:16:59 -0400787
Joey Armstrong664c55a2023-08-28 14:22:33 -0400788// [EOF]