blob: b8ba59653511dbf5261c18012607810d3b7c5769 [file] [log] [blame]
Joey Armstrong96158a92022-11-25 10:36:06 -05001#!/usr/bin/env groovy
Joey Armstrong3d444c62022-11-26 21:42:20 -05002// -----------------------------------------------------------------------
3// -----------------------------------------------------------------------
Joey Armstrong96158a92022-11-25 10:36:06 -05004
Joey Armstrong3d444c62022-11-26 21:42:20 -05005// -----------------------------------------------------------------------
6// -----------------------------------------------------------------------
7def getIam(String func)
8{
9 String src = 'vars/waitForAdapters.groovy'
10 String iam = [src, func].join('::')
11 return
12}
Andrea Campanella45b8eb72021-09-28 10:50:01 +020013
Joey Armstrong3d444c62022-11-26 21:42:20 -050014// -----------------------------------------------------------------------
15// -----------------------------------------------------------------------
16def getAdapters()
17{
18 String iam = getIam('getAdapters')
19
20 def adapters = ""
21 try
22 {
23 adapters = sh (
24 script: 'voltctl adapter list --format "{{gosince .LastCommunication}}"',
25 returnStdout: true,
26 ).trim()
27 }
28 catch (err)
29 {
30 // in some older versions of voltctl the command results in
31 // ERROR: Unexpected error while attempting to format results
32 // as table : template: output:1: function "gosince" not defined
33 // if that's the case we won't be able to check the timestamp so
34 // it's useless to wait
35 println("voltctl can't parse LastCommunication, skip waiting")
36 adapters = 'SKIP'
37 }
38
39 print("** ${iam}: returned $adapters")
40 return adapters
41}
42
43// -----------------------------------------------------------------------
44// -----------------------------------------------------------------------
45def process(Map config)
46{
47 String iam = getIam('process')
Joey Armstrong96158a92022-11-25 10:36:06 -050048 println("** ${iam}: ENTER")
49
Andrea Campanella45b8eb72021-09-28 10:50:01 +020050 def defaultConfig = [
51 volthaNamespace: "voltha",
Matteo Scandolo721d08b2021-09-30 17:42:40 -070052 stackName: "voltha",
Andrea Campanella45b8eb72021-09-28 10:50:01 +020053 adaptersToWait: 2,
54 ]
55
Andrea Campanella45b8eb72021-09-28 10:50:01 +020056 def cfg = defaultConfig + config
57
Andrea Campanella365ea1e2021-09-28 10:50:01 +020058 if (cfg.adaptersToWait == 0){
59 //no need to wait
60 println "No need to wait for adapters to be registered"
61 return
62 }
63
Joey Armstrong3d444c62022-11-26 21:42:20 -050064 println("** ${iam}: Wait for adapters to be registered")
Andrea Campanella45b8eb72021-09-28 10:50:01 +020065
66 // guarantee that at least the specified number of adapters are registered with VOLTHA before proceeding
67 sh """
68 set +x
Matteo Scandolo721d08b2021-09-30 17:42:40 -070069 _TAG="voltha-voltha-api" bash -c "while true; do kubectl port-forward --address 0.0.0.0 -n ${cfg.volthaNamespace} svc/${cfg.stackName}-voltha-api 55555:55555; done"&
Andrea Campanella45b8eb72021-09-28 10:50:01 +020070 """
71
72 sh """
73 set +x
74 adapters=\$(voltctl adapter list -q | wc -l)
75 while [[ \$adapters -lt ${cfg.adaptersToWait} ]]; do
76 sleep 5
77 adapters=\$(voltctl adapter list -q | wc -l)
78 done
Andrea Campanella45b8eb72021-09-28 10:50:01 +020079 """
80
Matteo Scandolo28722ea2021-10-01 15:48:42 -070081 // NOTE that we need to wait for LastCommunication to be equal or shorter that 5s
82 // as that means the core can talk to the adapters
83 // if voltctl can't read LastCommunication we skip this check
Joey Armstrong3d444c62022-11-26 21:42:20 -050084
85 println("** ${iam}: Wait for adapter LastCommunication")
Matteo Scandolo28722ea2021-10-01 15:48:42 -070086 def done = false;
Joey Armstrong3d444c62022-11-26 21:42:20 -050087 while (!done)
88 {
89 sleep 1
90 def adapters = getAdapters()
91 if (adapters == 'SKIP') { break }
Andrea Campanella45b8eb72021-09-28 10:50:01 +020092
Joey Armstrong5366c432022-11-27 10:04:18 -050093 def waitingOn = adapters.split( '\n' ).find{elapsed ->
94 elapsed = elapsed.replaceAll('s','') // remove seconds
95 print("** ${iam}: waitingOn elapsed=[${elapsed}]")
Andrea Campanella45b8eb72021-09-28 10:50:01 +020096
Joey Armstrong3d444c62022-11-26 21:42:20 -050097 // it has to be a single digit
Joey Armstrong5366c432022-11-27 10:04:18 -050098 if (elapsed.length() > 1) { // 463765h58m52s
Joey Armstrong3d444c62022-11-26 21:42:20 -050099 return true
100 }
Joey Armstrong5366c432022-11-27 10:04:18 -0500101
102 Boolean is_valid = (5 >= (elapsed as Integer))
103 print("** ${iam}: waitingOn: is_valid=[$is_valid]")
104 return is_valid
Joey Armstrong3d444c62022-11-26 21:42:20 -0500105 }
Andrea Campanella45b8eb72021-09-28 10:50:01 +0200106
Joey Armstrong3d444c62022-11-26 21:42:20 -0500107 done = (waitingOn == null || waitingOn.length() == 0)
Matteo Scandolo28722ea2021-10-01 15:48:42 -0700108 }
Andrea Campanella45b8eb72021-09-28 10:50:01 +0200109
Joey Armstrong3d444c62022-11-26 21:42:20 -0500110 println("** ${iam}: Wait for adapter LastCommunication")
111 sh("""
Matteo Scandolo28722ea2021-10-01 15:48:42 -0700112 set +x
Joey Armstronga1915cf2022-11-26 15:58:49 -0500113 pgrep --list-full port-forw
Joey Armstrong96158a92022-11-25 10:36:06 -0500114
Joey Armstrong3d444c62022-11-26 21:42:20 -0500115 ps aux \
116 | grep port-forw \
117 | grep -v grep \
118 | awk '{print \$2}' \
119 | xargs --no-run-if-empty kill -9 || true
120 """)
Joey Armstrong96158a92022-11-25 10:36:06 -0500121
122 println("** ${iam}: LEAVE")
Joey Armstrong3d444c62022-11-26 21:42:20 -0500123 return
Andrea Campanella45b8eb72021-09-28 10:50:01 +0200124}
Joey Armstrong3d444c62022-11-26 21:42:20 -0500125
126// -----------------------------------------------------------------------
127// -----------------------------------------------------------------------
128def call(Map config)
129{
130 String iam = getIam('process')
131 println("** ${iam}: ENTER")
132
133 if (!config) {
134 config = [:]
135 }
136
137 try
138 {
139 process(config)
140 }
141 catch (Exception err)
142 {
143 println("** ${iam}: EXCEPTION ${err}")
144 throw err
145 }
146 finally
147 {
148 println("** ${iam}: LEAVE")
149 }
150 return
151}
152
153// EOF