Added debugging for v-s-t sanity-test failure.
vars/waitForAdapters.groovy
---------------------------
* From log output, script seemed to terminate early.
* Rename call() to process() and wrap in a try/catch/finally block.
* Added method getIam() for methods to self-identify.
* Display ENTER/LEAVE when methods are called for logging.
* Moved getAdapter logic into a named method to shorten a large while block.
Change-Id: Iba402ab7e5c44b35c464ee806ab1e3f85770b71b
diff --git a/vars/waitForAdapters.groovy b/vars/waitForAdapters.groovy
index 08a14c9..80ce89b 100644
--- a/vars/waitForAdapters.groovy
+++ b/vars/waitForAdapters.groovy
@@ -1,8 +1,50 @@
#!/usr/bin/env groovy
+// -----------------------------------------------------------------------
+// -----------------------------------------------------------------------
-def call(Map config) {
+// -----------------------------------------------------------------------
+// -----------------------------------------------------------------------
+def getIam(String func)
+{
+ String src = 'vars/waitForAdapters.groovy'
+ String iam = [src, func].join('::')
+ return
+}
- String iam = 'vars/waitForAdapters.groovy'
+// -----------------------------------------------------------------------
+// -----------------------------------------------------------------------
+def getAdapters()
+{
+ String iam = getIam('getAdapters')
+
+ def adapters = ""
+ try
+ {
+ adapters = sh (
+ script: 'voltctl adapter list --format "{{gosince .LastCommunication}}"',
+ returnStdout: true,
+ ).trim()
+ }
+ catch (err)
+ {
+ // in some older versions of voltctl the command results in
+ // ERROR: Unexpected error while attempting to format results
+ // as table : template: output:1: function "gosince" not defined
+ // if that's the case we won't be able to check the timestamp so
+ // it's useless to wait
+ println("voltctl can't parse LastCommunication, skip waiting")
+ adapters = 'SKIP'
+ }
+
+ print("** ${iam}: returned $adapters")
+ return adapters
+}
+
+// -----------------------------------------------------------------------
+// -----------------------------------------------------------------------
+def process(Map config)
+{
+ String iam = getIam('process')
println("** ${iam}: ENTER")
def defaultConfig = [
@@ -11,10 +53,6 @@
adaptersToWait: 2,
]
- if (!config) {
- config = [:]
- }
-
def cfg = defaultConfig + config
if (cfg.adaptersToWait == 0){
@@ -23,7 +61,7 @@
return
}
- println "Wait for adapters to be registered"
+ println("** ${iam}: Wait for adapters to be registered")
// guarantee that at least the specified number of adapters are registered with VOLTHA before proceeding
sh """
@@ -43,46 +81,72 @@
// NOTE that we need to wait for LastCommunication to be equal or shorter that 5s
// as that means the core can talk to the adapters
// if voltctl can't read LastCommunication we skip this check
+
+ println("** ${iam}: Wait for adapter LastCommunication")
def done = false;
+ while (!done)
+ {
+ sleep 1
+ def adapters = getAdapters()
+ if (adapters == 'SKIP') { break }
- while (!done) {
- sleep 1
- def adapters = ""
- try {
- adapters = sh (
- script: 'voltctl adapter list --format "{{gosince .LastCommunication}}"',
- returnStdout: true,
- ).trim()
- } catch (err) {
- // in some older versions of voltctl the command results in
- // ERROR: Unexpected error while attempting to format results as table : template: output:1: function "gosince" not defined
- // if that's the case we won't be able to check the timestamp so it's useless to wait
- println("voltctl can't parse LastCommunication, skip waiting")
- done = true
- break
- }
+ def waitingOn = adapters.split( '\n' ).find{since ->
+ since = since.replaceAll('s','') //remove seconds from the string
- def waitingOn = adapters.split( '\n' ).find{since ->
- since = since.replaceAll('s','') //remove seconds from the string
+ // it has to be a single digit
+ if (since.length() > 1) {
+ return true
+ }
+ if ((since as Integer) > 5) {
+ return true
+ }
+ return false
+ }
- // it has to be a single digit
- if (since.length() > 1) {
- return true
- }
- if ((since as Integer) > 5) {
- return true
- }
- return false
- }
- done = (waitingOn == null || waitingOn.length() == 0)
+ done = (waitingOn == null || waitingOn.length() == 0)
}
- sh """
+ println("** ${iam}: Wait for adapter LastCommunication")
+ sh("""
set +x
pgrep --list-full port-forw
- ps aux | grep port-forw | grep -v grep | awk '{print \$2}' | xargs --no-run-if-empty kill -9 || true
- """
+ ps aux \
+ | grep port-forw \
+ | grep -v grep \
+ | awk '{print \$2}' \
+ | xargs --no-run-if-empty kill -9 || true
+ """)
println("** ${iam}: LEAVE")
+ return
}
+
+// -----------------------------------------------------------------------
+// -----------------------------------------------------------------------
+def call(Map config)
+{
+ String iam = getIam('process')
+ println("** ${iam}: ENTER")
+
+ if (!config) {
+ config = [:]
+ }
+
+ try
+ {
+ process(config)
+ }
+ catch (Exception err)
+ {
+ println("** ${iam}: EXCEPTION ${err}")
+ throw err
+ }
+ finally
+ {
+ println("** ${iam}: LEAVE")
+ }
+ return
+}
+
+// EOF