blob: 14463daa25a097665fbef4e6d16a79ebd2f7c41c [file] [log] [blame]
Tomáš Kukrálb9957b32017-02-28 14:49:00 +01001/**
2 *
3 * Launch heat stack with basic k8s
4 * Flow parameters:
Jakub Josef3c7915f2017-05-24 11:23:57 +02005 * STACK_NAME Heat stack name
6 * STACK_TYPE Orchestration engine: heat, ''
7 * STACK_INSTALL What should be installed (k8s, openstack, ...)
8 * STACK_TEST What should be tested (k8s, openstack, ...)
9 *
10 * STACK_TEMPLATE_URL URL to git repo with stack templates
11 * STACK_TEMPLATE_BRANCH Stack templates repo branch
12 * STACK_TEMPLATE_CREDENTIALS Credentials to the stack templates repo
13 * STACK_TEMPLATE Heat stack HOT template
14 * STACK_DELETE Delete stack when finished (bool)
15 * STACK_REUSE Reuse stack (don't create one)
16 * STACK_CLEANUP_JOB Name of job for deleting Heat stack
Tomáš Kukrálb9957b32017-02-28 14:49:00 +010017 *
18 * Expected parameters:
Tomáš Kukrálb9957b32017-02-28 14:49:00 +010019 * required for STACK_TYPE=heat
Tomáš Kukrálb9957b32017-02-28 14:49:00 +010020 * HEAT_STACK_ENVIRONMENT Heat stack environmental parameters
21 * HEAT_STACK_ZONE Heat stack availability zone
22 * HEAT_STACK_PUBLIC_NET Heat stack floating IP pool
Tomáš Kukrálb9957b32017-02-28 14:49:00 +010023 * OPENSTACK_API_URL OpenStack API address
24 * OPENSTACK_API_CREDENTIALS Credentials to the OpenStack API
25 * OPENSTACK_API_PROJECT OpenStack project to connect to
26 * OPENSTACK_API_CLIENT Versions of OpenStack python clients
27 * OPENSTACK_API_VERSION Version of the OpenStack API (2/3)
28 *
29 * SALT_MASTER_CREDENTIALS Credentials to the Salt API
30 *
31 * required for STACK_TYPE=NONE or empty string
32 * SALT_MASTER_URL URL of Salt-API
33
34 * K8S_API_SERVER Kubernetes API address
35 * K8S_CONFORMANCE_IMAGE Path to docker image with conformance e2e tests
36 *
Victor Ryzhenkin5f3b7e62017-03-09 16:02:58 +040037 * TEMPEST_IMAGE_LINK Tempest image link
38 *
Matthew Mosesohna85f24e2017-04-28 13:45:19 +030039 * optional parameters for overwriting soft params
40 * KUBERNETES_HYPERKUBE_IMAGE Docker repository and tag for hyperkube image
Matthew Mosesohnd00a8f52017-05-22 17:07:19 +030041 * CALICO_CNI_IMAGE Docker repository and tag for calico CNI image
42 * CALICO_NODE_IMAGE Docker repository and tag for calico node image
43 * CALICOCTL_IMAGE Docker repository and tag for calicoctl image
Matthew Mosesohna85f24e2017-04-28 13:45:19 +030044 *
Tomáš Kukrálb9957b32017-02-28 14:49:00 +010045 */
46
Tomáš Kukrál1f8b5012017-04-28 21:07:10 +020047common = new com.mirantis.mk.Common()
Tomáš Kukrálb9957b32017-02-28 14:49:00 +010048git = new com.mirantis.mk.Git()
49openstack = new com.mirantis.mk.Openstack()
Tomáš Kukrál1f8b5012017-04-28 21:07:10 +020050orchestrate = new com.mirantis.mk.Orchestrate()
Tomáš Kukrálb9957b32017-02-28 14:49:00 +010051salt = new com.mirantis.mk.Salt()
Ondrej Smola8f35e482017-03-30 14:04:36 +020052test = new com.mirantis.mk.Test()
Tomáš Kukrál1f8b5012017-04-28 21:07:10 +020053
Tomáš Kukrálab2f3702017-05-11 09:17:43 +020054_MAX_PERMITTED_STACKS = 2
Matthew Mosesohna85f24e2017-04-28 13:45:19 +030055overwriteFile = "/srv/salt/reclass/classes/cluster/overwrite.yml"
Tomáš Kukrále80680a2017-03-02 16:34:35 +010056
Tomáš Kukrál9e0fb732017-03-02 10:12:05 +010057timestamps {
58 node {
Tomáš Kukrála18de112017-03-02 13:57:47 +010059 try {
60 //
61 // Prepare machines
62 //
Tomáš Kukrála18de112017-03-02 13:57:47 +010063 stage ('Create infrastructure') {
Tomáš Kukrál6d627d62017-03-23 17:39:07 +010064
Tomáš Kukrála18de112017-03-02 13:57:47 +010065 if (STACK_TYPE == 'heat') {
66 // value defaults
67 def openstackCloud
68 def openstackVersion = OPENSTACK_API_CLIENT ? OPENSTACK_API_CLIENT : 'liberty'
69 def openstackEnv = "${env.WORKSPACE}/venv"
Tomáš Kukrálb9957b32017-02-28 14:49:00 +010070
Jakub Josef3c7915f2017-05-24 11:23:57 +020071 if (STACK_REUSE.toBoolean() == true && STACK_NAME == '') {
Filip Pytloun794ad952017-03-03 10:39:26 +010072 error("If you want to reuse existing stack you need to provide it's name")
73 }
74
Jakub Josef3c7915f2017-05-24 11:23:57 +020075 if (STACK_REUSE.toBoolean() == false) {
Filip Pytloun794ad952017-03-03 10:39:26 +010076 // Don't allow to set custom heat stack name
77 wrap([$class: 'BuildUser']) {
Tomáš Kukrál24d7fe62017-03-03 10:57:11 +010078 if (env.BUILD_USER_ID) {
Jakub Josef3c7915f2017-05-24 11:23:57 +020079 STACK_NAME = "${env.BUILD_USER_ID}-${JOB_NAME}-${BUILD_NUMBER}"
Tomáš Kukrál24d7fe62017-03-03 10:57:11 +010080 } else {
Jakub Josef3c7915f2017-05-24 11:23:57 +020081 STACK_NAME = "jenkins-${JOB_NAME}-${BUILD_NUMBER}"
Tomáš Kukrál24d7fe62017-03-03 10:57:11 +010082 }
Jakub Josef3c7915f2017-05-24 11:23:57 +020083 currentBuild.description = STACK_NAME
Filip Pytloun794ad952017-03-03 10:39:26 +010084 }
Tomáš Kukrál9e0fb732017-03-02 10:12:05 +010085 }
Tomáš Kukrála18de112017-03-02 13:57:47 +010086
Tomáš Kukrálcbabec42017-03-02 16:24:04 +010087 // set description
Jakub Josef3c7915f2017-05-24 11:23:57 +020088 currentBuild.description = "${STACK_NAME}"
Tomáš Kukrálcbabec42017-03-02 16:24:04 +010089
Tomáš Kukrála18de112017-03-02 13:57:47 +010090 // get templates
Jakub Josef3c7915f2017-05-24 11:23:57 +020091 git.checkoutGitRepository('template', STACK_TEMPLATE_URL, STACK_TEMPLATE_BRANCH, STACK_TEMPLATE_CREDENTIALS)
Tomáš Kukrála18de112017-03-02 13:57:47 +010092
93 // create openstack env
94 openstack.setupOpenstackVirtualenv(openstackEnv, openstackVersion)
95 openstackCloud = openstack.createOpenstackEnv(OPENSTACK_API_URL, OPENSTACK_API_CREDENTIALS, OPENSTACK_API_PROJECT)
96 openstack.getKeystoneToken(openstackCloud, openstackEnv)
Jakub Josef458913d2017-05-10 15:37:56 +020097 //
98 // Verify possibility of create stack for given user and stack type
99 //
100 wrap([$class: 'BuildUser']) {
Jakub Josef3c7915f2017-05-24 11:23:57 +0200101 if (env.BUILD_USER_ID && !env.BUILD_USER_ID.equals("jenkins") && !STACK_REUSE.toBoolean()) {
Jakub Josef78c3f8b2017-05-10 15:45:29 +0200102 def existingStacks = openstack.getStacksForNameContains(openstackCloud, "${env.BUILD_USER_ID}-${JOB_NAME}", openstackEnv)
103 if(existingStacks.size() >= _MAX_PERMITTED_STACKS){
Jakub Josef3c7915f2017-05-24 11:23:57 +0200104 STACK_DELETE = "false"
Jakub Josef78c3f8b2017-05-10 15:45:29 +0200105 throw new Exception("You cannot create new stack, you already have ${_MAX_PERMITTED_STACKS} stacks of this type (${JOB_NAME}). \nStack names: ${existingStacks}")
106 }
Jakub Josef458913d2017-05-10 15:37:56 +0200107 }
108 }
Tomáš Kukrála18de112017-03-02 13:57:47 +0100109 // launch stack
Jakub Josef3c7915f2017-05-24 11:23:57 +0200110 if (STACK_REUSE.toBoolean() == false) {
Tomáš Kukrála18de112017-03-02 13:57:47 +0100111 stage('Launch new Heat stack') {
112 // create stack
113 envParams = [
114 'instance_zone': HEAT_STACK_ZONE,
115 'public_net': HEAT_STACK_PUBLIC_NET
116 ]
Jakub Josef3c7915f2017-05-24 11:23:57 +0200117 openstack.createHeatStack(openstackCloud, STACK_NAME, STACK_TEMPLATE, envParams, HEAT_STACK_ENVIRONMENT, openstackEnv)
Tomáš Kukrála18de112017-03-02 13:57:47 +0100118 }
119 }
120
121 // get SALT_MASTER_URL
Jakub Josef3c7915f2017-05-24 11:23:57 +0200122 saltMasterHost = openstack.getHeatStackOutputParam(openstackCloud, STACK_NAME, 'salt_master_ip', openstackEnv)
123 currentBuild.description = "${STACK_NAME}: ${saltMasterHost}"
Tomáš Kukrál615aa9c2017-03-04 15:29:08 +0100124
Ales Komarek47a29f12017-04-26 12:05:47 +0200125 SALT_MASTER_URL = "http://${saltMasterHost}:6969"
Tomáš Kukrál9e0fb732017-03-02 10:12:05 +0100126 }
Tomáš Kukrál9e0fb732017-03-02 10:12:05 +0100127 }
Tomáš Kukrál9e0fb732017-03-02 10:12:05 +0100128
Tomáš Kukrála18de112017-03-02 13:57:47 +0100129 //
130 // Connect to Salt master
131 //
Tomáš Kukrál9e0fb732017-03-02 10:12:05 +0100132
Tomáš Kukrála18de112017-03-02 13:57:47 +0100133 def saltMaster
134 stage('Connect to Salt API') {
135 saltMaster = salt.connection(SALT_MASTER_URL, SALT_MASTER_CREDENTIALS)
136 }
Tomáš Kukrál9e0fb732017-03-02 10:12:05 +0100137
Tomáš Kukrála18de112017-03-02 13:57:47 +0100138 //
139 // Install
140 //
Tomáš Kukrál9e0fb732017-03-02 10:12:05 +0100141
Jakub Josef3c7915f2017-05-24 11:23:57 +0200142 if (common.checkContains('STACK_INSTALL', 'core')) {
Tomáš Kukrála18de112017-03-02 13:57:47 +0100143 stage('Install core infrastructure') {
Ales Komarek47a29f12017-04-26 12:05:47 +0200144 orchestrate.installFoundationInfra(saltMaster)
Tomáš Kukrálc265e352017-03-02 11:45:11 +0100145
Jakub Josef3c7915f2017-05-24 11:23:57 +0200146 if (common.checkContains('STACK_INSTALL', 'kvm')) {
Ales Komarek47a29f12017-04-26 12:05:47 +0200147 orchestrate.installInfraKvm(saltMaster)
148 orchestrate.installFoundationInfra(saltMaster)
Tomáš Kukrála18de112017-03-02 13:57:47 +0100149 }
150
Ales Komarek47a29f12017-04-26 12:05:47 +0200151 orchestrate.validateFoundationInfra(saltMaster)
Tomáš Kukrála18de112017-03-02 13:57:47 +0100152 }
153 }
154
155 // install k8s
Jakub Josef3c7915f2017-05-24 11:23:57 +0200156 if (common.checkContains('STACK_INSTALL', 'k8s')) {
Tomáš Kukrála18de112017-03-02 13:57:47 +0100157 stage('Install Kubernetes infra') {
Ales Komarek47a29f12017-04-26 12:05:47 +0200158 orchestrate.installKubernetesInfra(saltMaster)
Tomáš Kukrálc265e352017-03-02 11:45:11 +0100159 }
160
Tomáš Kukrála18de112017-03-02 13:57:47 +0100161 stage('Install Kubernetes control') {
Tomáš Kukrál06c27a92017-03-01 16:21:46 +0100162
Ales Komarek47a29f12017-04-26 12:05:47 +0200163 // Overwrite Kubernetes vars if specified
164 if (env.getEnvironment().containsKey("KUBERNETES_HYPERKUBE_IMAGE")) {
Tomáš Kukrálfbb98322017-05-02 10:38:05 +0200165 salt.runSaltProcessStep(saltMaster, 'I@salt:master', 'file.append', overwriteFile, " kubernetes_hyperkube_image: ${KUBERNETES_HYPERKUBE_IMAGE}")
Ales Komarek47a29f12017-04-26 12:05:47 +0200166 }
Matthew Mosesohnd00a8f52017-05-22 17:07:19 +0300167 // Overwrite Calico vars if specified
168 if (env.getEnvironment().containsKey("CALICO_CNI_IMAGE")) {
169 salt.runSaltProcessStep(saltmaster, 'I@salt:master', 'file.append', overwriteFile, " kubernetes_calico_cni_image: ${CALICO_CNI_IMAGE}")
170 }
171 if (env.getEnvironment().containsKey("CALICO_NODE_IMAGE")) {
172 salt.runSaltProcessStep(saltmaster, 'I@salt:master', 'file.append', overwriteFile, " kubernetes_calico_node_image: ${CALICO_NODE_IMAGE}")
173 }
174 if (env.getEnvironment().containsKey("CALICOCTL_IMAGE")) {
175 salt.runSaltProcessStep(saltmaster, 'I@salt:master', 'file.append', overwriteFile, " kubernetes_calicoctl_image: ${CALICOCTL_IMAGE}")
176 }
Tomáš Kukrálc265e352017-03-02 11:45:11 +0100177
Ales Komarek47a29f12017-04-26 12:05:47 +0200178 orchestrate.installKubernetesControl(saltMaster)
Tomáš Kukrálc265e352017-03-02 11:45:11 +0100179 }
Tomáš Kukrálfeb959e2017-05-18 11:00:41 +0200180
181
Jakub Josef3c7915f2017-05-24 11:23:57 +0200182 if (common.checkContains('STACK_INSTALL', 'contrail')) {
Tomáš Kukrálfeb959e2017-05-18 11:00:41 +0200183 state('Install Contrail for Kubernetes') {
184 orchestrate.installContrailNetwork(saltMaster)
185 orchestrate.installContrailCompute(saltMaster)
186 }
187 }
Tomáš Kukrál9e0fb732017-03-02 10:12:05 +0100188 }
189
Tomáš Kukrála18de112017-03-02 13:57:47 +0100190 // install openstack
Jakub Josef3c7915f2017-05-24 11:23:57 +0200191 if (common.checkContains('STACK_INSTALL', 'openstack')) {
Tomáš Kukrála18de112017-03-02 13:57:47 +0100192 // install Infra and control, tests, ...
Tomáš Kukrál9e0fb732017-03-02 10:12:05 +0100193
Tomáš Kukrála18de112017-03-02 13:57:47 +0100194 stage('Install OpenStack infra') {
Ales Komarek47a29f12017-04-26 12:05:47 +0200195 orchestrate.installOpenstackInfra(saltMaster)
Tomáš Kukrálc265e352017-03-02 11:45:11 +0100196 }
197
Tomáš Kukrála18de112017-03-02 13:57:47 +0100198 stage('Install OpenStack control') {
Ales Komarek47a29f12017-04-26 12:05:47 +0200199 orchestrate.installOpenstackControl(saltMaster)
Tomáš Kukrála18de112017-03-02 13:57:47 +0100200 }
201
202 stage('Install OpenStack network') {
Tomáš Kukrála18de112017-03-02 13:57:47 +0100203
Jakub Josef3c7915f2017-05-24 11:23:57 +0200204 if (common.checkContains('STACK_INSTALL', 'contrail')) {
Ales Komarek47a29f12017-04-26 12:05:47 +0200205 orchestrate.installContrailNetwork(saltMaster)
Jakub Josef3c7915f2017-05-24 11:23:57 +0200206 } else if (common.checkContains('STACK_INSTALL', 'ovs')) {
Ales Komarek47a29f12017-04-26 12:05:47 +0200207 orchestrate.installOpenstackNetwork(saltMaster)
Tomáš Kukrála18de112017-03-02 13:57:47 +0100208 }
209
Tomáš Kukrálfbb98322017-05-02 10:38:05 +0200210 salt.runSaltProcessStep(saltMaster, 'I@keystone:server', 'cmd.run', ['. /root/keystonerc; neutron net-list'])
211 salt.runSaltProcessStep(saltMaster, 'I@keystone:server', 'cmd.run', ['. /root/keystonerc; nova net-list'])
Tomáš Kukrála18de112017-03-02 13:57:47 +0100212 }
213
214 stage('Install OpenStack compute') {
Ales Komarek47a29f12017-04-26 12:05:47 +0200215 orchestrate.installOpenstackCompute(saltMaster)
Tomáš Kukrála18de112017-03-02 13:57:47 +0100216
Jakub Josef3c7915f2017-05-24 11:23:57 +0200217 if (common.checkContains('STACK_INSTALL', 'contrail')) {
Ales Komarek47a29f12017-04-26 12:05:47 +0200218 orchestrate.installContrailCompute(saltMaster)
Tomáš Kukráld5a40af2017-03-07 15:34:58 +0100219 }
Tomáš Kukrála18de112017-03-02 13:57:47 +0100220 }
Tomáš Kukrál2b4c1282017-03-03 17:25:26 +0100221
Tomáš Kukrál00ed1302017-03-03 17:38:40 +0100222 }
Tomáš Kukrál2b4c1282017-03-03 17:25:26 +0100223
Tomáš Kukrál00ed1302017-03-03 17:38:40 +0100224
Jakub Josef3c7915f2017-05-24 11:23:57 +0200225 if (common.checkContains('STACK_INSTALL', 'stacklight')) {
Tomáš Kukrál2b4c1282017-03-03 17:25:26 +0100226 stage('Install StackLight') {
Ales Komarek47a29f12017-04-26 12:05:47 +0200227 orchestrate.installStacklightControl(saltMaster)
228 orchestrate.installStacklightClient(saltMaster)
Tomáš Kukrál2b4c1282017-03-03 17:25:26 +0100229 }
Tomáš Kukrál9e0fb732017-03-02 10:12:05 +0100230 }
231
Tomáš Kukrála18de112017-03-02 13:57:47 +0100232 //
233 // Test
234 //
Tomáš Kukrál695d6462017-04-21 16:31:52 +0200235 def artifacts_dir = '_artifacts/'
Tomáš Kukrála18de112017-03-02 13:57:47 +0100236
Jakub Josef3c7915f2017-05-24 11:23:57 +0200237 if (common.checkContains('STACK_TEST', 'k8s')) {
Tomáš Kukrála18de112017-03-02 13:57:47 +0100238 stage('Run k8s bootstrap tests') {
Tomáš Kukrál695d6462017-04-21 16:31:52 +0200239 def image = 'tomkukral/k8s-scripts'
Tomáš Kukrál44ca7fe2017-04-21 16:44:19 +0200240 def output_file = image.replaceAll('/', '-') + '.output'
Tomáš Kukrál695d6462017-04-21 16:31:52 +0200241
Tomáš Kukrálb22826d2017-04-21 16:38:00 +0200242 // run image
243 test.runConformanceTests(saltMaster, K8S_API_SERVER, image)
Tomáš Kukrálf56beed2017-04-21 16:21:06 +0200244
245 // collect output
Tomáš Kukrálf56beed2017-04-21 16:21:06 +0200246 sh "mkdir -p ${artifacts_dir}"
Tomáš Kukrálb22826d2017-04-21 16:38:00 +0200247 file_content = salt.getFileContent(saltMaster, 'ctl01*', '/tmp/' + output_file)
Tomáš Kukrálf56beed2017-04-21 16:21:06 +0200248 writeFile file: "${artifacts_dir}${output_file}", text: file_content
Tomáš Kukrálf56beed2017-04-21 16:21:06 +0200249 sh "cat ${artifacts_dir}${output_file}"
250
251 // collect artifacts
252 archiveArtifacts artifacts: "${artifacts_dir}${output_file}"
Tomáš Kukrála18de112017-03-02 13:57:47 +0100253 }
254
Tomáš Kukrálb22826d2017-04-21 16:38:00 +0200255 stage('Run k8s conformance e2e tests') {
256 //test.runConformanceTests(saltMaster, K8S_API_SERVER, K8S_CONFORMANCE_IMAGE)
257
258 def image = K8S_CONFORMANCE_IMAGE
Tomáš Kukrál44ca7fe2017-04-21 16:44:19 +0200259 def output_file = image.replaceAll('/', '-') + '.output'
Tomáš Kukrálb22826d2017-04-21 16:38:00 +0200260
261 // run image
262 test.runConformanceTests(saltMaster, K8S_API_SERVER, image)
263
264 // collect output
265 sh "mkdir -p ${artifacts_dir}"
266 file_content = salt.getFileContent(saltMaster, 'ctl01*', '/tmp/' + output_file)
267 writeFile file: "${artifacts_dir}${output_file}", text: file_content
268 sh "cat ${artifacts_dir}${output_file}"
269
270 // collect artifacts
271 archiveArtifacts artifacts: "${artifacts_dir}${output_file}"
272 }
Tomáš Kukrál9e0fb732017-03-02 10:12:05 +0100273 }
Tomáš Kukrálb9957b32017-02-28 14:49:00 +0100274
Jakub Josef3c7915f2017-05-24 11:23:57 +0200275 if (common.checkContains('STACK_TEST', 'openstack')) {
Victor Ryzhenkin5f3b7e62017-03-09 16:02:58 +0400276 stage('Run OpenStack tests') {
277 test.runTempestTests(saltMaster, TEMPEST_IMAGE_LINK)
278 }
279
280 stage('Copy Tempest results to config node') {
281 test.copyTempestResults(saltMaster)
282 }
283 }
284
Tomáš Kukrál420d7ff2017-03-21 11:38:33 +0100285 stage('Finalize') {
Jakub Josef3c7915f2017-05-24 11:23:57 +0200286 if (STACK_INSTALL != '') {
Tomáš Kukrál38ab6bb2017-04-21 21:29:31 +0200287 try {
288 salt.runSaltProcessStep(saltMaster, '*', 'state.apply', [], null, true)
289 } catch (Exception e) {
290 common.warningMsg('State apply failed but we should continue to run')
Jakub Josefa6904f12017-05-22 16:37:27 +0200291 throw e
Tomáš Kukrál38ab6bb2017-04-21 21:29:31 +0200292 }
Tomáš Kukrál420d7ff2017-03-21 11:38:33 +0100293 }
294 }
Tomáš Kukrála18de112017-03-02 13:57:47 +0100295 } catch (Throwable e) {
296 currentBuild.result = 'FAILURE'
297 throw e
Tomáš Kukrál65fb5fd2017-03-02 14:56:49 +0100298 } finally {
Tomáš Kukrálb9957b32017-02-28 14:49:00 +0100299
Tomáš Kukrál96b12d52017-03-07 22:43:37 +0100300
Tomáš Kukrála18de112017-03-02 13:57:47 +0100301 //
302 // Clean
303 //
304
Tomáš Kukrálc9a630a2017-03-07 17:28:53 +0100305 if (STACK_TYPE == 'heat') {
Tomáš Kukrál4507c6a2017-03-23 19:00:39 +0100306 // send notification
Jakub Josef3c7915f2017-05-24 11:23:57 +0200307 common.sendNotification(currentBuild.result, STACK_NAME, ["slack"])
Tomáš Kukrál4507c6a2017-03-23 19:00:39 +0100308
Jakub Josef3c7915f2017-05-24 11:23:57 +0200309 if (STACK_DELETE.toBoolean() == true) {
Tomáš Kukrálc9a630a2017-03-07 17:28:53 +0100310 common.errorMsg('Heat job cleanup triggered')
311 stage('Trigger cleanup job') {
Jakub Josef3c7915f2017-05-24 11:23:57 +0200312 build job: 'deploy-heat-cleanup', parameters: [[$class: 'StringParameterValue', name: 'HEAT_STACK_NAME', value: STACK_NAME]]
Tomáš Kukrálc9a630a2017-03-07 17:28:53 +0100313 }
314 } else {
Tomáš Kukrálbcc53ea2017-03-08 08:15:57 +0100315 if (currentBuild.result == 'FAILURE') {
316 common.errorMsg("Deploy job FAILED and was not deleted. Please fix the problem and delete stack on you own.")
Tomáš Kukrálc9a630a2017-03-07 17:28:53 +0100317
Tomáš Kukrálbcc53ea2017-03-08 08:15:57 +0100318 if (SALT_MASTER_URL) {
319 common.errorMsg("Salt master URL: ${SALT_MASTER_URL}")
320 }
Tomáš Kukrálb908dac2017-03-07 18:58:35 +0100321 }
322
Tomáš Kukrála18de112017-03-02 13:57:47 +0100323 }
Tomáš Kukrál9e0fb732017-03-02 10:12:05 +0100324 }
Tomáš Kukrálb9957b32017-02-28 14:49:00 +0100325 }
326 }
327}