blob: bb33214495056a219df1536285c05a1c897269a0 [file] [log] [blame]
Joey Armstrongdb892b52023-03-03 10:44:06 -05001#!/usr/bin/env groovy
2// -----------------------------------------------------------------------
Joey Armstrongd5487722024-02-11 09:39:14 -05003// Copyright 2023-2024 Open Networking Foundation (ONF) and the ONF Contributors
Joey Armstrongdb892b52023-03-03 10:44:06 -05004//
5// Licensed under the Apache License, Version 2.0 (the "License");
6// you may not use this file except in compliance with the License.
7// You may obtain a copy of the License at
8//
9// http://www.apache.org/licenses/LICENSE-2.0
10//
11// Unless required by applicable law or agreed to in writing, software
12// distributed under the License is distributed on an "AS IS" BASIS,
13// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14// See the License for the specific language governing permissions and
15// limitations under the License.
16// -----------------------------------------------------------------------
17// % npm-groovy-lint vars/iam.groovy
18// -----------------------------------------------------------------------
19
20// -----------------------------------------------------------------------
21// -----------------------------------------------------------------------
Joey Armstrong1fa8cb82023-03-03 14:05:51 -050022String getIam(Map argv, String func)
Joey Armstrongdb892b52023-03-03 10:44:06 -050023{
Joey Armstrong1fa8cb82023-03-03 14:05:51 -050024 String src = argv.containsKey('label')
25 ? argv.label
26 : [ // Cannot lookup, jenkins alters stack for serialization
27 'repo:ci-management',
28 'vars',
29 'iam',
30 ].join('/')
Joey Armstrongdb892b52023-03-03 10:44:06 -050031
32 String iam = [src, func].join('::')
Joey Armstrong1fa8cb82023-03-03 14:05:51 -050033 if (argv.containsKey('version'))
34 {
Joey Armstrong41feb7c2023-04-14 11:28:04 -040035 iam += sprintf('[%s]', argv.version)
Joey Armstrong1fa8cb82023-03-03 14:05:51 -050036 }
Joey Armstrongdb892b52023-03-03 10:44:06 -050037 return(iam)
38}
39
40// -----------------------------------------------------------------------
41// Intent: Display future enhancement list.
42// -----------------------------------------------------------------------
Joey Armstrong1fa8cb82023-03-03 14:05:51 -050043void todo(Map argv)
Joey Armstrongdb892b52023-03-03 10:44:06 -050044{
Joey Armstrong1fa8cb82023-03-03 14:05:51 -050045 String iam = getIam(argv, 'todo')
Joey Armstrongdb892b52023-03-03 10:44:06 -050046
47 println("""
48[TODO: $iam]
49 o Pass jenkins parameters so todo() function can be conditionally called.
50 o Add call parameters to:
51 - Specify {ENTER,LEAVE} strings for logging.
52 - Set methods for caller to specify an alternate getIam() path.
53""")
54
55 return
56}
57
58// -----------------------------------------------------------------------
59// Intent: Placeholder in case future enhancements are needed
60// -----------------------------------------------------------------------
Joey Armstrong1fa8cb82023-03-03 14:05:51 -050061Boolean process(Map argv)
Joey Armstrongdb892b52023-03-03 10:44:06 -050062{
Joey Armstrong1fa8cb82023-03-03 14:05:51 -050063 String iam = getIam(argv, 'process')
Joey Armstrongd5487722024-02-11 09:39:14 -050064 Boolean debug ?: argv.debug
65 Boolean leave ?: argv.leave
Joey Armstrongdb892b52023-03-03 10:44:06 -050066
67 // Identify caller with a banner for logging
68 if (config.containsKey('enter')) {
69 println("** ${iam}: ENTER")
70 }
71 else if (config.containsKey('leave')) {
Joey Armstrong1fa8cb82023-03-03 14:05:51 -050072 leave = true
Joey Armstrongdb892b52023-03-03 10:44:06 -050073 }
Joey Armstrongd5487722024-02-11 09:39:14 -050074 else if (debug) {
75 println("** ${iam}: DEBUG=true")
76 }
77
78 // Invoke closure passed in
79 if (config.containsKey('invoke')) {
80 Closure invoke = argv.invoke
81 invoke()
Joey Armstrongdb892b52023-03-03 10:44:06 -050082 }
Joey Armstrong1fa8cb82023-03-03 14:05:51 -050083
Joey Armstrongdb892b52023-03-03 10:44:06 -050084 // Display future enhancement list
85 if (config.containsKey('todo')) {
86 todo()
87 }
88
89 // Maintain a sane logging enclosure block
90 if (leave)
91 {
92 println("** ${iam}: LEAVE")
93 }
Joey Armstrong1fa8cb82023-03-03 14:05:51 -050094
Joey Armstrongdb892b52023-03-03 10:44:06 -050095 return(true)
96}
97
98// -----------------------------------------------------------------------
Joey Armstrongd5487722024-02-11 09:39:14 -050099// Intent: Wrap functions/DSL tokens within a closure to improve logging
100// o Issue a startup banner
101// o Invoke task wrapped within the iam(){} closure
102// o Detect exception/early termination and hilight that detail.
103// o Issue a shutdown banner
Joey Armstrongdb892b52023-03-03 10:44:06 -0500104// -----------------------------------------------------------------------
105// Given:
106// self jenkins environment pointer 'this'
107// config groovy closure used to pass key/value pairs into argv
Joey Armstrongd5487722024-02-11 09:39:14 -0500108// invoke Groovy closure to invoke: (ENTER, closure, LEAVE)
Joey Armstrongdb892b52023-03-03 10:44:06 -0500109// enter Display "** {iam} ENTER"
110// leave Display "** {iam} LEAVE"
111// todo Display future enhancement list
Joey Armstrong1fa8cb82023-03-03 14:05:51 -0500112// label path/to/src[ver:1.0]
113// version specify version and label separately
Joey Armstrongdb892b52023-03-03 10:44:06 -0500114// -----------------------------------------------------------------------
115// Usage:
116// o called from a jenkins {pipeline,stage,script} block.
117// o iam(this)
118// {
Joey Armstrongd5487722024-02-11 09:39:14 -0500119// debug = false
120// enter = true
121// invoke = { println('hello from closure') }
122// leave = true
Joey Armstrongdb892b52023-03-03 10:44:06 -0500123// }
124// -----------------------------------------------------------------------
Joey Armstrong0c689df2023-03-03 16:03:50 -0500125Boolean call\
126 (
Joey Armstrong41feb7c2023-04-14 11:28:04 -0400127 Closure body // jenkins closure attached to the call iam() {closure}
Joey Armstrong9ed18e12023-03-07 10:40:14 -0500128 // def self, // jenkins env object for access to primitives like echo()
Joey Armstrong0c689df2023-03-03 16:03:50 -0500129 )
Joey Armstrongdb892b52023-03-03 10:44:06 -0500130{
Joey Armstrong0c689df2023-03-03 16:03:50 -0500131 // evaluate the body block and collect configuration into the object
132 Map argv = [:] // {ternary,elvis} operator
133 body.resolveStrategy = Closure.DELEGATE_FIRST
Joey Armstrong9ed18e12023-03-07 10:40:14 -0500134 body.delegate = argv
Joey Armstrong0c689df2023-03-03 16:03:50 -0500135 body()
136
Joey Armstrongd5487722024-02-11 09:39:14 -0500137 // Running within closure
Joey Armstrong1fa8cb82023-03-03 14:05:51 -0500138 String iam = getIam(argv, 'main')
Joey Armstrongd5487722024-02-11 09:39:14 -0500139 Booelan debug ?: argv.debug
Joey Armstrong1fa8cb82023-03-03 14:05:51 -0500140
Joey Armstrongdb892b52023-03-03 10:44:06 -0500141 println("** ${iam}: argv=${argv}")
142
143 Boolean ranToCompletion = false
144 try
145 {
146 // [WIP] type(self) needed to quiet lint complaint.
147 // npm-groovy-lint: def for method parameter type should not be used NoDef
148 print(" ** $iam: Type of self variable is =" + self.getClass())
Joey Armstrong0c689df2023-03-03 16:03:50 -0500149 print(" ** $iam: Type of body variable is =" + body.getClass())
Joey Armstrongdb892b52023-03-03 10:44:06 -0500150 // if (! self instanceof jenkins_object) { throw }
151
152 if (process(argv))
153 {
154 ranToCompletion = true
155 }
156 }
Joey Armstrongd5487722024-02-11 09:39:14 -0500157 catch (Exception err) // groovylint-disable-line CatchException
Joey Armstrongdb892b52023-03-03 10:44:06 -0500158 {
159 println("** ${iam}: EXCEPTION ${err}")
160 throw err
161 }
162 finally
163 {
164 println("** ${iam}: LEAVE")
165 }
166
167 if (!ranToCompletion)
168 {
169 throw new Exception("ERROR ${iam}: Detected incomplete script run")
170 }
171
172 return(true)
173}
174
Joey Armstrong0c689df2023-03-03 16:03:50 -0500175/*
176 * -----------------------------------------------------------------------
177[SEE ALSO]
178 o https://rtyler.github.io/jenkins.io/doc/book/pipeline/shared-libraries/#defining-a-more-structured-dsl
Joey Armstrongd5487722024-02-11 09:39:14 -0500179 o https://blog.mrhaki.com/2009/11/groovy-goodness-passing-closures-to.html
Joey Armstrong0c689df2023-03-03 16:03:50 -0500180 * -----------------------------------------------------------------------
181 */
Joey Armstrongdb892b52023-03-03 10:44:06 -0500182
Joey Armstrong0c689df2023-03-03 16:03:50 -0500183// [EOF]