blob: a49cd35d5795e1c23d8876bbf79fd3e73bd71a41 [file] [log] [blame]
Matteo Scandolo42f6e572021-01-25 15:11:34 -08001
2def call(Map config) {
3 // note that I can't define this outside the function as there's no global scope in Groovy
4 def defaultConfig = [
Matteo Scandolo42f6e572021-01-25 15:11:34 -08005 bbsimReplica: 1,
6 infraNamespace: "infra",
7 volthaNamespace: "voltha",
8 stackName: "voltha",
Matteo Scandolo2bc660a2021-02-12 10:52:25 -08009 stackId: 1, // NOTE this is used to differentiate between BBSims across multiple stacks
Matteo Scandolo42f6e572021-01-25 15:11:34 -080010 workflow: "att",
11 extraHelmFlags: "",
Matteo Scandolofcfc60d2021-02-24 09:06:48 -080012 localCharts: false,
Matteo Scandolo529e8822021-07-21 10:20:18 -070013 onosReplica: 1,
Matteo Scandolo42f6e572021-01-25 15:11:34 -080014 ]
15
16 if (!config) {
17 config = [:]
18 }
19
20 def cfg = defaultConfig + config
21
Matteo Scandolofcfc60d2021-02-24 09:06:48 -080022 def volthaStackChart = "onf/voltha-stack"
Matteo Scandoloba4b6542021-06-24 12:06:07 +020023 def bbsimChart = "onf/bbsim"
Matteo Scandolofcfc60d2021-02-24 09:06:48 -080024
25 if (cfg.localCharts) {
26 volthaStackChart = "$WORKSPACE/voltha-helm-charts/voltha-stack"
Matteo Scandoloba4b6542021-06-24 12:06:07 +020027 bbsimChart = "$WORKSPACE/voltha-helm-charts/bbsim"
Matteo Scandolofcfc60d2021-02-24 09:06:48 -080028
29 sh """
30 pushd $WORKSPACE/voltha-helm-charts/voltha-stack
31 helm dep update
32 popd
33 """
34 }
35
Matteo Scandolo42f6e572021-01-25 15:11:34 -080036 println "Deploying VOLTHA Stack with the following parameters: ${cfg}."
37
38 sh """
Matteo Scandoloed1afdd2021-04-02 16:25:45 -070039 helm upgrade --install --create-namespace -n ${cfg.volthaNamespace} ${cfg.stackName} ${volthaStackChart} \
Matteo Scandolo42f6e572021-01-25 15:11:34 -080040 --set global.stack_name=${cfg.stackName} \
41 --set global.voltha_infra_name=voltha-infra \
Matteo Scandolo529e8822021-07-21 10:20:18 -070042 --set voltha.onos_classic.replicas=${cfg.onosReplica} \
Matteo Scandolo42f6e572021-01-25 15:11:34 -080043 --set global.voltha_infra_namespace=${cfg.infraNamespace} \
Matteo Scandoloed1afdd2021-04-02 16:25:45 -070044 ${cfg.extraHelmFlags}
Matteo Scandolo42f6e572021-01-25 15:11:34 -080045 """
46
47 for(int i = 0;i<cfg.bbsimReplica;i++) {
Matteo Scandolo0ce69f12021-05-04 08:44:53 -070048 // NOTE we don't need to update the tag for DT
49 script {
50 sh """
51 rm -f $WORKSPACE/bbsimCfg${cfg.stackId}${i}.yaml
52 """
53 if (cfg.workflow == "att" || cfg.workflow == "tt") {
54 def startingStag = 900
55 def bbsimCfg = readYaml file: "$WORKSPACE/voltha-helm-charts/examples/${cfg.workflow}-values.yaml"
56 // NOTE we assume that the only service that needs a different s_tag is the first one in the list
57 bbsimCfg["servicesConfig"]["services"][0]["s_tag"] = startingStag + i
Matteo Scandoloe765ee32021-07-20 16:47:19 -070058 println "Using BBSim Service config ${bbsimCfg['servicesConfig']}"
Matteo Scandolo0ce69f12021-05-04 08:44:53 -070059 writeYaml file: "$WORKSPACE/bbsimCfg${cfg.stackId}${i}.yaml", data: bbsimCfg
60 } else {
61 // NOTE if it's DT just copy the file over
62 sh """
63 cp $WORKSPACE/voltha-helm-charts/examples/${cfg.workflow}-values.yaml $WORKSPACE/bbsimCfg${cfg.stackId}${i}.yaml
64 """
65 }
66 }
67
68 sh """
Matteo Scandoloba4b6542021-06-24 12:06:07 +020069 helm upgrade --install --create-namespace -n ${cfg.volthaNamespace} bbsim${i} ${bbsimChart} \
Matteo Scandolo0ce69f12021-05-04 08:44:53 -070070 --set olt_id="${cfg.stackId}${i}" \
71 -f $WORKSPACE/bbsimCfg${cfg.stackId}${i}.yaml \
72 ${cfg.extraHelmFlags}
73 """
Matteo Scandolo42f6e572021-01-25 15:11:34 -080074 }
75
76 println "Wait for VOLTHA Stack ${cfg.stackName} to start"
77
78 sh """
79 set +x
80 voltha=\$(kubectl get pods -n ${cfg.volthaNamespace} -l app.kubernetes.io/part-of=voltha --no-headers | grep "0/" | wc -l)
81 while [[ \$voltha != 0 ]]; do
82 sleep 5
83 voltha=\$(kubectl get pods -n ${cfg.volthaNamespace} -l app.kubernetes.io/part-of=voltha --no-headers | grep "0/" | wc -l)
84 done
85 """
86
Matteo Scandolo937f4792021-09-24 11:05:52 -070087 println "Wait for adapters to be registered"
88
89 // guarantee that at least two adapters are registered with VOLTHA before proceeding
Matteo Scandolod9af8022021-09-28 16:21:01 -070090 // this is potentially prone to issues if we'll run test with multiple adapter pairs (eg: adtran + open)
91 // until then it is safe to assume we'll be ready once we have two adapters in the system
92 sh """
93 set +x
94 _TAG="voltha-voltha-api" bash -c "while true; do kubectl port-forward --address 0.0.0.0 -n ${cfg.volthaNamespace} svc/voltha-voltha-api 55555:55555; done"&
95 """
Matteo Scandolo937f4792021-09-24 11:05:52 -070096 sh """
97 set +x
Matteo Scandolo937f4792021-09-24 11:05:52 -070098 adapters=\$(voltctl adapter list -q | wc -l)
99 while [[ \$adapters -lt 2 ]]; do
100 sleep 5
101 adapters=\$(voltctl adapter list -q | wc -l)
102 done
Matteo Scandolod9af8022021-09-28 16:21:01 -0700103 """
104
105 // NOTE that we need to wait for LastCommunication to be equal or shorter that 5s
106 // as that means the core can talk to the adapters
107 // if voltctl can't read LastCommunication we skip this check
108 def done = false;
109
110 while (!done) {
111 sleep 1
112 def adapters = ""
113 try {
114 adapters = sh (
115 script: 'voltctl adapter list --format "{{gosince .LastCommunication}}"',
116 returnStdout: true,
117 ).trim()
118 } catch (err) {
119 // in some older versions of voltctl the command results in
120 // ERROR: Unexpected error while attempting to format results as table : template: output:1: function "gosince" not defined
121 // if that's the case we won't be able to check the timestamp so it's useless to wait
122 println("voltctl can't parse LastCommunication, skip waiting")
123 done = true
124 break
125 }
126
127 def waitingOn = adapters.split( '\n' ).find{since ->
128 since = since.replaceAll('s','') //remove seconds from the string
129
130 // it has to be a single digit
131 if (since.length() > 1) {
132 return true
133 }
134 if ((since as Integer) > 5) {
135 return true
136 }
137 return false
138 }
139 done = (waitingOn == null || waitingOn.length() == 0)
140 }
141
142 sh """
143 set +x
144 ps aux | grep port-forw | grep -v grep | awk '{print \$2}' | xargs --no-run-if-empty kill -9 || true
Matteo Scandolo937f4792021-09-24 11:05:52 -0700145 """
146
Matteo Scandolo42f6e572021-01-25 15:11:34 -0800147 // also make sure that the ONOS config is loaded
Andrea Campanella04b393a2021-07-22 10:48:33 +0200148 // NOTE that this is only required for VOLTHA-2.8
Matteo Scandolo42f6e572021-01-25 15:11:34 -0800149 println "Wait for ONOS Config loader to complete"
150
Andrea Campanella04b393a2021-07-22 10:48:33 +0200151 // NOTE that this is only required for VOLTHA-2.8,
Matteo Scandolo42f6e572021-01-25 15:11:34 -0800152 sh """
153 set +x
154 config=\$(kubectl get jobs.batch -n ${cfg.infraNamespace} --no-headers | grep "0/" | wc -l)
155 while [[ \$config != 0 ]]; do
156 sleep 5
157 config=\$(kubectl get jobs.batch -n ${cfg.infraNamespace} --no-headers | grep "0/" | wc -l)
158 done
159 """
Andrea Campanella04b393a2021-07-22 10:48:33 +0200160 // NOTE that this is only required for VOLTHA-2.9 onwards, to wait until the pod completed,
Matteo Scandolo937f4792021-09-24 11:05:52 -0700161 // meaning ONOS fully deployed
Andrea Campanella04b393a2021-07-22 10:48:33 +0200162 sh """
163 set +x
Andrea Campanella11832512021-07-23 10:53:19 +0200164 config=\$(kubectl get pods -l app=onos-config-loader -n ${cfg.infraNamespace} --no-headers --field-selector=status.phase=Running | grep "0/" | wc -l)
Andrea Campanella04b393a2021-07-22 10:48:33 +0200165 while [[ \$config != 0 ]]; do
166 sleep 5
Andrea Campanella11832512021-07-23 10:53:19 +0200167 config=\$(kubectl get pods -l app=onos-config-loader -n ${cfg.infraNamespace} --no-headers --field-selector=status.phase=Running | grep "0/" | wc -l)
Andrea Campanella04b393a2021-07-22 10:48:33 +0200168 done
169 """
Matteo Scandolo42f6e572021-01-25 15:11:34 -0800170}