blob: aef03f96f1cffc8d9802c9852210eaee29a6c8df [file] [log] [blame]
Zack Williams9d68aa32018-07-12 11:50:37 -07001// Copyright 2017-present Open Networking Foundation
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15// chart-api-test-helm.groovy
16// Checks functionality of the helm-chart, without overriding the version/tag used
17
Zack Williams9d68aa32018-07-12 11:50:37 -070018pipeline {
19
Zack Williamsfd87d652018-07-12 14:21:12 -070020 /* no label, executor is determined by JJB */
21 agent {
22 label "${params.executorNode}"
23 }
Zack Williams9d68aa32018-07-12 11:50:37 -070024
25 stages {
26
27 stage('repo') {
28 steps {
29 checkout(changelog: false, \
30 poll: false,
31 scm: [$class: 'RepoScm', \
32 manifestRepositoryUrl: "${params.manifestUrl}", \
33 manifestBranch: "${params.manifestBranch}", \
34 currentBranch: true, \
35 destinationDir: 'cord', \
36 forceSync: true,
37 resetFirst: true, \
38 quiet: true, \
39 jobs: 4, \
40 showAllChanges: true] \
41 )
42 }
43 }
44
Zack Williams9d68aa32018-07-12 11:50:37 -070045 stage('minikube') {
46 steps {
47 /* see https://github.com/kubernetes/minikube/#linux-continuous-integration-without-vm-support */
48 sh '''
49 export MINIKUBE_WANTUPDATENOTIFICATION=false
50 export MINIKUBE_WANTREPORTERRORPROMPT=false
51 export CHANGE_MINIKUBE_NONE_USER=true
52 export MINIKUBE_HOME=$HOME
53 mkdir -p $HOME/.kube || true
54 touch $HOME/.kube/config
55 export KUBECONFIG=$HOME/.kube/config
56 sudo -E /usr/bin/minikube start --vm-driver=none
57 '''
58 script {
59 timeout(3) {
60 waitUntil {
61 sleep 5
62 def kc_ret = sh script: "kubectl get po", returnStatus: true
63 return (kc_ret == 0);
64 }
65 }
66 }
67 }
68 }
69
70 stage('helm') {
71 steps {
72 sh '''
73 helm init
74 sleep 60
75 helm repo add incubator https://kubernetes-charts-incubator.storage.googleapis.com/
76 '''
77 }
78 }
79
Zack Williamsa26fc9d2018-09-18 16:49:01 -070080 stage('cord-kafka') {
81 steps {
82 sh '''
83 #!/usr/bin/env bash
84 set -eu -o pipefail
85
86 pushd cord/helm-charts
87 helm install -f examples/kafka-single.yaml --version 0.8.8 -n cord-kafka incubator/kafka
88 scripts/wait_for_pods.sh
89
90 popd
91 '''
92 }
93 }
94
Kailash Khalasi1c773ed2018-08-01 10:47:59 -070095 stage('install/test rcord-lite') {
Zack Williams9d68aa32018-07-12 11:50:37 -070096 steps {
97 sh """
98 #!/usr/bin/env bash
99 set -eu -o pipefail
100
101 helm_install_args='-f examples/api-test-values.yaml'
Zack Williams9d68aa32018-07-12 11:50:37 -0700102
103 pushd cord/helm-charts
104
105 helm dep up xos-core
106 helm install \${helm_install_args} xos-core -n xos-core
107
Kailash Khalasi1c773ed2018-08-01 10:47:59 -0700108 helm dep update xos-profiles/rcord-lite
109 helm install \${helm_install_args} xos-profiles/rcord-lite -n rcord-lite
Zack Williams9d68aa32018-07-12 11:50:37 -0700110
Kailash Khalasi1c773ed2018-08-01 10:47:59 -0700111 # wait for services to load
Kailash Khalasiedb48b12018-07-31 13:01:01 -0700112 JOBS_TIMEOUT=900 ./scripts/wait_for_jobs.sh
Kailash Khalasiba3e3d72018-08-03 13:53:45 -0700113 # adding tmp sleep momentarily
114 sleep 120
Zack Williams9d68aa32018-07-12 11:50:37 -0700115
116 echo "# Checking helm deployments"
117 kubectl get pods
118 helm list
119
120 for hchart in \$(helm list -q);
121 do
122 echo "## 'helm status' for chart: \${hchart} ##"
123 helm status "\${hchart}"
124 done
125
Zack Williamsfd87d652018-07-12 14:21:12 -0700126 CORE_CONTAINER=\$(docker ps | grep k8s_xos-core | awk '{print \$1}')
Zack Williams9d68aa32018-07-12 11:50:37 -0700127
Zack Williamsfd87d652018-07-12 14:21:12 -0700128 docker cp $WORKSPACE/cord/test/cord-tester/src/test/cord-api/Tests/targets/xosapitests.xtarget \$CORE_CONTAINER:/opt/xos/lib/xos-genx/xosgenx/targets/xosapitests.xtarget
129 docker cp $WORKSPACE/cord/test/cord-tester/src/test/cord-api/Tests/targets/xosserviceapitests.xtarget \$CORE_CONTAINER:/opt/xos/lib/xos-genx/xosgenx/targets/xosserviceapitests.xtarget
130 docker cp $WORKSPACE/cord/test/cord-tester/src/test/cord-api/Tests/targets/xoslibrary.xtarget \$CORE_CONTAINER:/opt/xos/lib/xos-genx/xosgenx/targets/xoslibrary.xtarget
131 docker exec -i \$CORE_CONTAINER /bin/bash -c "xosgenx --target /opt/xos/lib/xos-genx/xosgenx/targets/./xosapitests.xtarget /opt/xos/core/models/core.xproto" > $WORKSPACE/cord/test/cord-tester/src/test/cord-api/Tests/XOSCoreAPITests.robot
Zack Williams9d68aa32018-07-12 11:50:37 -0700132
Kailash Khalasi1c773ed2018-08-01 10:47:59 -0700133 export testname=_service_api.robot
134 export library=_library.robot
Zack Williams9d68aa32018-07-12 11:50:37 -0700135
Kailash Khalasi1c773ed2018-08-01 10:47:59 -0700136 SERVICES=\$(docker exec -i \$CORE_CONTAINER /bin/bash -c "cd /opt/xos/dynamic_services/;find -name '*.xproto'" | awk -F[//] '{print \$2}')
137 echo \$SERVICES
Zack Williams9d68aa32018-07-12 11:50:37 -0700138
Kailash Khalasi1c773ed2018-08-01 10:47:59 -0700139 for i in \$SERVICES; do bash -c "docker exec -i \$CORE_CONTAINER /bin/bash -c 'xosgenx --target /opt/xos/lib/xos-genx/xosgenx/targets/./xosserviceapitests.xtarget /opt/xos/dynamic_services/\$i/\$i.xproto /opt/xos/core/models/core.xproto'" > $WORKSPACE/cord/test/cord-tester/src/test/cord-api/Tests/\$i\$testname; done
Zack Williamsfd87d652018-07-12 14:21:12 -0700140
Kailash Khalasi1c773ed2018-08-01 10:47:59 -0700141 for i in \$SERVICES; do bash -c "docker exec -i \$CORE_CONTAINER /bin/bash -c 'xosgenx --target /opt/xos/lib/xos-genx/xosgenx/targets/./xoslibrary.xtarget /opt/xos/dynamic_services/\$i/\$i.xproto /opt/xos/core/models/core.xproto'" > $WORKSPACE/cord/test/cord-tester/src/test/cord-api/Tests/\$i\$library; done
Zack Williams9d68aa32018-07-12 11:50:37 -0700142
Zack Williamsfd87d652018-07-12 14:21:12 -0700143 CORE_CONTAINER=\$(docker ps | grep k8s_xos-core | awk '{print \$1}')
144 CHAM_CONTAINER=\$(docker ps | grep k8s_xos-chameleon | awk '{print \$1}')
145 XOS_CHAMELEON=\$(docker exec \$CHAM_CONTAINER ip a | grep -oE "([0-9]{1,3}\\.){3}[0-9]{1,3}\\b" | grep 172)
Zack Williams9d68aa32018-07-12 11:50:37 -0700146
Zack Williamsfd87d652018-07-12 14:21:12 -0700147 cd $WORKSPACE/cord/test/cord-tester/src/test/cord-api/Properties/
148 sed -i \"s/^\\(SERVER_IP = \\).*/\\1\'\$XOS_CHAMELEON\'/\" RestApiProperties.py
149 sed -i \"s/^\\(SERVER_PORT = \\).*/\\1\'9101\'/\" RestApiProperties.py
150 sed -i \"s/^\\(XOS_USER = \\).*/\\1\'admin@opencord.org\'/\" RestApiProperties.py
151 sed -i \"s/^\\(XOS_PASSWD = \\).*/\\1\'letmein\'/\" RestApiProperties.py
152 sed -i \"s/^\\(PASSWD = \\).*/\\1\'letmein\'/\" RestApiProperties.py
Zack Williams9d68aa32018-07-12 11:50:37 -0700153
Zack Williamsfd87d652018-07-12 14:21:12 -0700154 cd $WORKSPACE/cord/test/cord-tester/src/test/cord-api/Tests
Kailash Khalasi1c773ed2018-08-01 10:47:59 -0700155 ## Run CORE API Tests
Kailash Khalasi07c97a42018-08-06 12:15:43 -0700156 pybot -d Log -T XOSCoreAPITests.robot || true
Kailash Khalasi1c773ed2018-08-01 10:47:59 -0700157 ## Run Rcord-lite services API Tests
Kailash Khalasi07c97a42018-08-06 12:15:43 -0700158 for i in \$SERVICES; do bash -c "pybot -d Log -T -v TESTLIBRARY:\$i\$library \$i\$testname"; sleep 2; done || true
Zack Williamsfd87d652018-07-12 14:21:12 -0700159
160 popd
Kailash Khalasi1c773ed2018-08-01 10:47:59 -0700161
162 helm delete --purge rcord-lite
163 helm delete --purge xos-core
Zack Williamsfd87d652018-07-12 14:21:12 -0700164 """
165 }
Zack Williams9d68aa32018-07-12 11:50:37 -0700166 }
Zack Williamsfd87d652018-07-12 14:21:12 -0700167
Kailash Khalasi1c773ed2018-08-01 10:47:59 -0700168 stage('install/test mcord') {
Zack Williamsfd87d652018-07-12 14:21:12 -0700169 steps {
170 sh """
Kailash Khalasi1c773ed2018-08-01 10:47:59 -0700171 #!/usr/bin/env bash
172 set -eu -o pipefail
Zack Williamsfd87d652018-07-12 14:21:12 -0700173
Kailash Khalasi1c773ed2018-08-01 10:47:59 -0700174 helm_install_args='-f examples/api-test-values.yaml'
175
176 pushd cord/helm-charts
177
178 helm dep up xos-core
179 helm install \${helm_install_args} xos-core -n xos-core
180
181 helm dep update xos-profiles/base-openstack
182 helm dep update xos-profiles/mcord
183 helm install \${helm_install_args} xos-profiles/base-openstack -n base-openstack
184 helm install \${helm_install_args} xos-profiles/mcord -n mcord
185
186 # wait for services to load
187 JOBS_TIMEOUT=900 ./scripts/wait_for_jobs.sh
188
189 echo "# Checking helm deployments"
190 kubectl get pods
191 helm list
192
193 for hchart in \$(helm list -q);
194 do
195 echo "## 'helm status' for chart: \${hchart} ##"
196 helm status "\${hchart}"
197 done
198
199 CORE_CONTAINER=\$(docker ps | grep k8s_xos-core | awk '{print \$1}')
200
201 docker cp $WORKSPACE/cord/test/cord-tester/src/test/cord-api/Tests/targets/xosapitests.xtarget \$CORE_CONTAINER:/opt/xos/lib/xos-genx/xosgenx/targets/xosapitests.xtarget
202 docker cp $WORKSPACE/cord/test/cord-tester/src/test/cord-api/Tests/targets/xosserviceapitests.xtarget \$CORE_CONTAINER:/opt/xos/lib/xos-genx/xosgenx/targets/xosserviceapitests.xtarget
203 docker cp $WORKSPACE/cord/test/cord-tester/src/test/cord-api/Tests/targets/xoslibrary.xtarget \$CORE_CONTAINER:/opt/xos/lib/xos-genx/xosgenx/targets/xoslibrary.xtarget
204 docker exec -i \$CORE_CONTAINER /bin/bash -c "xosgenx --target /opt/xos/lib/xos-genx/xosgenx/targets/./xosapitests.xtarget /opt/xos/core/models/core.xproto" > $WORKSPACE/cord/test/cord-tester/src/test/cord-api/Tests/XOSCoreAPITests.robot
205
206 export testname=_service_api.robot
207 export library=_library.robot
208
209 SERVICES=\$(docker exec -i \$CORE_CONTAINER /bin/bash -c "cd /opt/xos/dynamic_services/;find -name '*.xproto'" | awk -F[//] '{print \$2}')
210 echo \$SERVICES
211
212 for i in \$SERVICES; do bash -c "docker exec -i \$CORE_CONTAINER /bin/bash -c 'xosgenx --target /opt/xos/lib/xos-genx/xosgenx/targets/./xosserviceapitests.xtarget /opt/xos/dynamic_services/\$i/\$i.xproto /opt/xos/core/models/core.xproto'" > $WORKSPACE/cord/test/cord-tester/src/test/cord-api/Tests/\$i\$testname; done
213
214 for i in \$SERVICES; do bash -c "docker exec -i \$CORE_CONTAINER /bin/bash -c 'xosgenx --target /opt/xos/lib/xos-genx/xosgenx/targets/./xoslibrary.xtarget /opt/xos/dynamic_services/\$i/\$i.xproto /opt/xos/core/models/core.xproto'" > $WORKSPACE/cord/test/cord-tester/src/test/cord-api/Tests/\$i\$library; done
215
216 CORE_CONTAINER=\$(docker ps | grep k8s_xos-core | awk '{print \$1}')
217 CHAM_CONTAINER=\$(docker ps | grep k8s_xos-chameleon | awk '{print \$1}')
218 XOS_CHAMELEON=\$(docker exec \$CHAM_CONTAINER ip a | grep -oE "([0-9]{1,3}\\.){3}[0-9]{1,3}\\b" | grep 172)
219
220 cd $WORKSPACE/cord/test/cord-tester/src/test/cord-api/Properties/
221 sed -i \"s/^\\(SERVER_IP = \\).*/\\1\'\$XOS_CHAMELEON\'/\" RestApiProperties.py
222
223 cd $WORKSPACE/cord/test/cord-tester/src/test/cord-api/Tests
224 ## Run mcord services API Tests
Kailash Khalasi07c97a42018-08-06 12:15:43 -0700225 for i in \$SERVICES; do bash -c "pybot -d Log -T -e ProgranServiceInstance -v TESTLIBRARY:\$i\$library \$i\$testname"; sleep 2; done || true
Kailash Khalasi1c773ed2018-08-01 10:47:59 -0700226
227 popd
228
229 helm delete --purge base-openstack
230 helm delete --purge mcord
231 helm delete --purge xos-core
232 """
Zack Williamsfd87d652018-07-12 14:21:12 -0700233 }
234 }
235
Kailash Khalasi1c773ed2018-08-01 10:47:59 -0700236 stage('install/test simpleexampleservice') {
237 steps {
238 sh """
239 #!/usr/bin/env bash
240 set -eu -o pipefail
241
242 helm_install_args='-f examples/api-test-values.yaml'
243
244 pushd cord/helm-charts
245
246 helm dep up xos-core
247 helm install \${helm_install_args} xos-core -n xos-core
248
249 helm dep update xos-profiles/base-kubernetes
250 helm dep update xos-profiles/demo-simpleexampleservice
251 helm install \${helm_install_args} xos-profiles/base-kubernetes -n base-kubernetes
252 helm install \${helm_install_args} xos-profiles/demo-simpleexampleservice -n demo-simpleexampleservice
253
254 # wait for services to load
255 JOBS_TIMEOUT=900 ./scripts/wait_for_jobs.sh
256
257 echo "# Checking helm deployments"
258 kubectl get pods
259 helm list
260
261 for hchart in \$(helm list -q);
262 do
263 echo "## 'helm status' for chart: \${hchart} ##"
264 helm status "\${hchart}"
265 done
266
267 CORE_CONTAINER=\$(docker ps | grep k8s_xos-core | awk '{print \$1}')
268
269 docker cp $WORKSPACE/cord/test/cord-tester/src/test/cord-api/Tests/targets/xosapitests.xtarget \$CORE_CONTAINER:/opt/xos/lib/xos-genx/xosgenx/targets/xosapitests.xtarget
270 docker cp $WORKSPACE/cord/test/cord-tester/src/test/cord-api/Tests/targets/xosserviceapitests.xtarget \$CORE_CONTAINER:/opt/xos/lib/xos-genx/xosgenx/targets/xosserviceapitests.xtarget
271 docker cp $WORKSPACE/cord/test/cord-tester/src/test/cord-api/Tests/targets/xoslibrary.xtarget \$CORE_CONTAINER:/opt/xos/lib/xos-genx/xosgenx/targets/xoslibrary.xtarget
272 docker exec -i \$CORE_CONTAINER /bin/bash -c "xosgenx --target /opt/xos/lib/xos-genx/xosgenx/targets/./xosapitests.xtarget /opt/xos/core/models/core.xproto" > $WORKSPACE/cord/test/cord-tester/src/test/cord-api/Tests/XOSCoreAPITests.robot
273
274 export testname=_service_api.robot
275 export library=_library.robot
276
277 SERVICES=\$(docker exec -i \$CORE_CONTAINER /bin/bash -c "cd /opt/xos/dynamic_services/;find -name '*.xproto'" | awk -F[//] '{print \$2}')
278 echo \$SERVICES
279
280 for i in \$SERVICES; do bash -c "docker exec -i \$CORE_CONTAINER /bin/bash -c 'xosgenx --target /opt/xos/lib/xos-genx/xosgenx/targets/./xosserviceapitests.xtarget /opt/xos/dynamic_services/\$i/\$i.xproto /opt/xos/core/models/core.xproto'" > $WORKSPACE/cord/test/cord-tester/src/test/cord-api/Tests/\$i\$testname; done
281
282 for i in \$SERVICES; do bash -c "docker exec -i \$CORE_CONTAINER /bin/bash -c 'xosgenx --target /opt/xos/lib/xos-genx/xosgenx/targets/./xoslibrary.xtarget /opt/xos/dynamic_services/\$i/\$i.xproto /opt/xos/core/models/core.xproto'" > $WORKSPACE/cord/test/cord-tester/src/test/cord-api/Tests/\$i\$library; done
283
284 CORE_CONTAINER=\$(docker ps | grep k8s_xos-core | awk '{print \$1}')
285 CHAM_CONTAINER=\$(docker ps | grep k8s_xos-chameleon | awk '{print \$1}')
286 XOS_CHAMELEON=\$(docker exec \$CHAM_CONTAINER ip a | grep -oE "([0-9]{1,3}\\.){3}[0-9]{1,3}\\b" | grep 172)
287
288 cd $WORKSPACE/cord/test/cord-tester/src/test/cord-api/Properties/
289 sed -i \"s/^\\(SERVER_IP = \\).*/\\1\'\$XOS_CHAMELEON\'/\" RestApiProperties.py
290
291 cd $WORKSPACE/cord/test/cord-tester/src/test/cord-api/Tests
292 ## Run kubernetes-base services API Tests
Kailash Khalasi07c97a42018-08-06 12:15:43 -0700293 for i in \$SERVICES; do bash -c "pybot -d Log -T -v TESTLIBRARY:\$i\$library \$i\$testname"; sleep 2; done || true
Kailash Khalasi1c773ed2018-08-01 10:47:59 -0700294
295 popd
296
297 helm delete --purge base-kubernetes
298 helm delete --purge demo-simpleexampleservice
299 helm delete --purge xos-core
300 """
301 }
302 }
303
304 stage('install/test hippie-oss') {
305 steps {
306 sh """
307 #!/usr/bin/env bash
308 set -eu -o pipefail
309
310 helm_install_args='-f examples/api-test-values.yaml'
311
312 pushd cord/helm-charts
313
314 helm dep up xos-core
315 helm install \${helm_install_args} xos-core -n xos-core
316
317 helm dep update xos-services/hippie-oss
318 helm install \${helm_install_args} xos-services/hippie-oss -n hippie-oss
319
320 # wait for services to load
321 JOBS_TIMEOUT=900 ./scripts/wait_for_jobs.sh
322 ## sleeping as hippie-oss doesnt have a tosca-loader
323 sleep 300
324 echo "# Checking helm deployments"
325 kubectl get pods
326 helm list
327
328 for hchart in \$(helm list -q);
329 do
330 echo "## 'helm status' for chart: \${hchart} ##"
331 helm status "\${hchart}"
332 done
333
334 CORE_CONTAINER=\$(docker ps | grep k8s_xos-core | awk '{print \$1}')
335
336 docker cp $WORKSPACE/cord/test/cord-tester/src/test/cord-api/Tests/targets/xosapitests.xtarget \$CORE_CONTAINER:/opt/xos/lib/xos-genx/xosgenx/targets/xosapitests.xtarget
337 docker cp $WORKSPACE/cord/test/cord-tester/src/test/cord-api/Tests/targets/xosserviceapitests.xtarget \$CORE_CONTAINER:/opt/xos/lib/xos-genx/xosgenx/targets/xosserviceapitests.xtarget
338 docker cp $WORKSPACE/cord/test/cord-tester/src/test/cord-api/Tests/targets/xoslibrary.xtarget \$CORE_CONTAINER:/opt/xos/lib/xos-genx/xosgenx/targets/xoslibrary.xtarget
339 docker exec -i \$CORE_CONTAINER /bin/bash -c "xosgenx --target /opt/xos/lib/xos-genx/xosgenx/targets/./xosapitests.xtarget /opt/xos/core/models/core.xproto" > $WORKSPACE/cord/test/cord-tester/src/test/cord-api/Tests/XOSCoreAPITests.robot
340
341 export testname=_service_api.robot
342 export library=_library.robot
343
344 SERVICES=\$(docker exec -i \$CORE_CONTAINER /bin/bash -c "cd /opt/xos/dynamic_services/;find -name '*.xproto'" | awk -F[//] '{print \$2}')
345 echo \$SERVICES
346
347 cd $WORKSPACE/cord/test/cord-tester/src/test/cord-api/Tests
348 ## Run hippie-oss services API Tests
Kailash Khalasi07c97a42018-08-06 12:15:43 -0700349 for i in \$SERVICES; do bash -c "pybot -d Log -T -v TESTLIBRARY:\$i\$library \$i\$testname"; sleep 2; done || true
Kailash Khalasi1c773ed2018-08-01 10:47:59 -0700350
351 popd
352
353 helm delete --purge hippie-oss
354 helm delete --purge xos-core
355 """
356 }
357 }
Zack Williamsfd87d652018-07-12 14:21:12 -0700358 }
359 post {
360 always {
361 sh '''
Kailash Khalasi1c773ed2018-08-01 10:47:59 -0700362 # copy robot logs
363 if [ -d RobotLogs ]; then rm -r RobotLogs; fi; mkdir RobotLogs
364 cp -r $WORKSPACE/cord/test/cord-tester/src/test/cord-api/Tests/Log/*ml ./RobotLogs
Kailash Khalasiecb4eb62018-07-31 15:20:19 -0700365
Zack Williamsfd87d652018-07-12 14:21:12 -0700366 kubectl get pods --all-namespaces
367
368 echo "# removing helm deployments"
369 kubectl get pods
370 helm list
371
372 for hchart in \$(helm list -q);
373 do
374 echo "## Purging chart: \${hchart} ##"
375 helm delete --purge "\${hchart}"
376 done
377
Zack Williamsf8b356c2018-07-17 17:01:27 -0700378 sudo minikube delete
Zack Williamsfd87d652018-07-12 14:21:12 -0700379 '''
Kailash Khalasi1c773ed2018-08-01 10:47:59 -0700380 step([$class: 'RobotPublisher',
381 disableArchiveOutput: false,
382 logFileName: 'RobotLogs/log*.html',
383 otherFiles: '',
384 outputFileName: 'RobotLogs/output*.xml',
385 outputPath: '.',
386 passThreshold: 100,
387 reportFileName: 'RobotLogs/report*.html',
388 unstableThreshold: 0]);
389 step([$class: 'Mailer', notifyEveryUnstableBuild: true, recipients: "kailash@opennetworking.org", sendToIndividuals: false])
Zack Williamsfd87d652018-07-12 14:21:12 -0700390 }
391 }
Zack Williams9d68aa32018-07-12 11:50:37 -0700392}