blob: 2f91865b84998dba16d21fd93923e11220a0571d [file] [log] [blame]
Jiri Broulikbb447ac2017-05-04 15:36:22 +02001/**
2 * Update packages on given nodes
3 *
4 * Expected parameters:
Jiri Brouliked3a9e62018-02-13 16:08:40 +01005 * SALT_MASTER_CREDENTIALS Credentials to the Salt API.
6 * SALT_MASTER_URL Full Salt API address [http://10.10.10.1:8000].
7 * STAGE_TEST_UPGRADE Run test upgrade stage (bool)
8 * STAGE_REAL_UPGRADE Run real upgrade stage (bool)
9 * STAGE_ROLLBACK_UPGRADE Run rollback upgrade stage (bool)
10 * SKIP_VM_RELAUNCH Set to true if vms should not be recreated (bool)
11 * OPERATING_SYSTEM_RELEASE_UPGRADE Set to true if operating system of vms should be upgraded to newer release (bool)
Jiri Broulikbb447ac2017-05-04 15:36:22 +020012 *
13**/
14
15def common = new com.mirantis.mk.Common()
16def salt = new com.mirantis.mk.Salt()
chnyda625f4b42017-10-11 14:10:31 +020017def python = new com.mirantis.mk.Python()
Jiri Broulikbb447ac2017-05-04 15:36:22 +020018
Jiri Brouliked3a9e62018-02-13 16:08:40 +010019def stopServices(pepperEnv, probe, target, type) {
20 def openstack = new com.mirantis.mk.Openstack()
21 def services = []
22 if (type == 'prx') {
23 services.add('keepalived')
24 services.add('nginx')
25 } else if (type == 'ctl') {
26 services.add('keepalived')
27 services.add('haproxy')
28 services.add('nova')
29 services.add('cinder')
30 services.add('glance')
31 services.add('heat')
32 services.add('neutron')
33 services.add('apache2')
34 }
35 openstack.stopServices(pepperEnv, probe, target, services)
36}
37
38def retryStateRun(pepperEnv, target, state) {
39 def common = new com.mirantis.mk.Common()
40 def salt = new com.mirantis.mk.Salt()
41 try {
42 salt.enforceState(pepperEnv, target, state)
43 } catch (Exception e) {
44 common.warningMsg("running ${state} state again")
45 salt.enforceState(pepperEnv, target, state)
46 }
47}
48
49def stateRun(pepperEnv, target, state) {
50 def common = new com.mirantis.mk.Common()
51 def salt = new com.mirantis.mk.Salt()
52 try {
53 salt.enforceState(pepperEnv, target, state)
54 } catch (Exception e) {
55 common.warningMsg("Some parts of ${state} state failed. We should continue to run.")
56 }
57}
58
59
60def vcpTestUpgrade(pepperEnv) {
61 def common = new com.mirantis.mk.Common()
62 def salt = new com.mirantis.mk.Salt()
63 def test_upgrade_node = "upg01"
64 salt.runSaltProcessStep(pepperEnv, 'I@salt:master', 'saltutil.refresh_pillar', [], null, true, 2)
65
66 stateRun(pepperEnv, 'I@salt:master', 'linux.system.repo')
67 stateRun(pepperEnv, 'I@salt:master', 'salt.master')
68 stateRun(pepperEnv, 'I@salt:master', 'reclass')
69 stateRun(pepperEnv, 'I@salt:master', 'linux.system.repo')
70
71 try {
72 salt.runSaltProcessStep(pepperEnv, '*', 'saltutil.refresh_pillar', [], null, true, 2)
73 } catch (Exception e) {
74 common.warningMsg("No response from some minions. We should continue to run")
75 }
76
77 try {
78 salt.runSaltProcessStep(pepperEnv, '*', 'saltutil.sync_all', [], null, true, 2)
79 } catch (Exception e) {
80 common.warningMsg("No response from some minions. We should continue to run")
81 }
82
83 def domain = salt.getDomainName(pepperEnv)
84
85 def backupninja_backup_host = salt.getReturnValues(salt.getPillar(pepperEnv, '( I@galera:master or I@galera:slave ) and I@backupninja:client', '_param:backupninja_backup_host'))
86
87 if (SKIP_VM_RELAUNCH.toBoolean() == false) {
88
89 def upgNodeProvider = salt.getNodeProvider(pepperEnv, test_upgrade_node)
90
91 salt.runSaltProcessStep(pepperEnv, "${upgNodeProvider}", 'virt.destroy', ["${test_upgrade_node}.${domain}"])
92 salt.runSaltProcessStep(pepperEnv, "${upgNodeProvider}", 'virt.undefine', ["${test_upgrade_node}.${domain}"])
93
94 try {
95 salt.cmdRun(pepperEnv, 'I@salt:master', "salt-key -d ${test_upgrade_node}.${domain} -y")
96 } catch (Exception e) {
97 common.warningMsg("${test_upgrade_node}.${domain} does not match any accepted, unaccepted or rejected keys. The key did not exist yet or was already removed. We should continue to run")
98 }
99
100 // salt 'kvm02*' state.sls salt.control
101 salt.enforceState(pepperEnv, "${upgNodeProvider}", 'salt.control')
102 // wait until upg node is registered in salt-key
103 salt.minionPresent(pepperEnv, 'I@salt:master', test_upgrade_node)
104 // salt '*' saltutil.refresh_pillar
105 salt.runSaltProcessStep(pepperEnv, "${test_upgrade_node}*", 'saltutil.refresh_pillar', [])
106 // salt '*' saltutil.sync_all
107 salt.runSaltProcessStep(pepperEnv, "${test_upgrade_node}*", 'saltutil.sync_all', [])
108 }
109
Jiri Broulik827d0112018-04-25 16:00:07 +0200110 stateRun(pepperEnv, "${test_upgrade_node}*", ['linux.network.proxy'])
111 try {
112 salt.runSaltProcessStep(pepperEnv, "${test_upgrade_node}*", 'state.sls', ["salt.minion.base"], null, true, 60)
113 } catch (Exception e) {
114 common.warningMsg(e)
115 }
116
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100117 stateRun(pepperEnv, "${test_upgrade_node}*", ['linux', 'openssh'])
118
119 try {
Jiri Broulik827d0112018-04-25 16:00:07 +0200120 salt.runSaltProcessStep(pepperEnv, "${test_upgrade_node}*", 'state.sls', ["salt.minion"], null, true, 60)
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100121 } catch (Exception e) {
122 common.warningMsg(e)
123 }
124 stateRun(pepperEnv, "${test_upgrade_node}*", ['ntp', 'rsyslog'])
125 salt.enforceState(pepperEnv, "${test_upgrade_node}*", ['linux', 'openssh', 'salt.minion', 'ntp', 'rsyslog'])
126 salt.enforceState(pepperEnv, "${test_upgrade_node}*", ['rabbitmq', 'memcached'])
127 try {
128 salt.enforceState(pepperEnv, '( I@galera:master or I@galera:slave ) and I@backupninja:client', ['openssh.client', 'salt.minion'])
129 } catch (Exception e) {
130 common.warningMsg('salt-minion was restarted. We should continue to run')
131 }
132 try {
133 salt.enforceState(pepperEnv, 'I@backupninja:server', ['salt.minion'])
134 } catch (Exception e) {
135 common.warningMsg('salt-minion was restarted. We should continue to run')
136 }
137 // salt '*' state.apply salt.minion.grains
138 //salt.enforceState(pepperEnv, '*', 'salt.minion.grains')
139 // salt -C 'I@backupninja:server' state.sls backupninja
140 salt.enforceState(pepperEnv, 'I@backupninja:server', 'backupninja')
141 salt.enforceState(pepperEnv, '( I@galera:master or I@galera:slave ) and I@backupninja:client', 'backupninja')
142 salt.runSaltProcessStep(pepperEnv, '( I@galera:master or I@galera:slave ) and I@backupninja:client', 'ssh.rm_known_host', ["root", "${backupninja_backup_host}"])
143 try {
144 salt.cmdRun(pepperEnv, '( I@galera:master or I@galera:slave ) and I@backupninja:client', "arp -d ${backupninja_backup_host}")
145 } catch (Exception e) {
146 common.warningMsg('The ARP entry does not exist. We should continue to run.')
147 }
148 salt.runSaltProcessStep(pepperEnv, '( I@galera:master or I@galera:slave ) and I@backupninja:client', 'ssh.set_known_host', ["root", "${backupninja_backup_host}"])
149 salt.cmdRun(pepperEnv, '( I@galera:master or I@galera:slave ) and I@backupninja:client', 'backupninja -n --run /etc/backup.d/101.mysql')
150 salt.cmdRun(pepperEnv, '( I@galera:master or I@galera:slave ) and I@backupninja:client', 'backupninja -n --run /etc/backup.d/200.backup.rsync > /tmp/backupninjalog')
151
152 salt.enforceState(pepperEnv, 'I@xtrabackup:server', 'xtrabackup')
153 salt.enforceState(pepperEnv, 'I@xtrabackup:client', 'openssh.client')
154 salt.cmdRun(pepperEnv, 'I@xtrabackup:client', "su root -c 'salt-call state.sls xtrabackup'")
Jiri Broulik60dcab32018-03-08 17:42:06 +0100155 salt.cmdRun(pepperEnv, 'I@xtrabackup:client', "su root -c '/usr/local/bin/innobackupex-runner.sh -f -s'")
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100156
157 def databases = salt.cmdRun(pepperEnv, 'I@mysql:client','salt-call mysql.db_list | grep upgrade | awk \'/-/ {print \$2}\'')
158 if(databases && databases != ""){
159 def databasesList = salt.getReturnValues(databases).trim().tokenize("\n")
160 for( i = 0; i < databasesList.size(); i++){
161 if(databasesList[i].toLowerCase().contains('upgrade')){
162 salt.runSaltProcessStep(pepperEnv, 'I@mysql:client', 'mysql.db_remove', ["${databasesList[i]}"])
163 common.warningMsg("removing database ${databasesList[i]}")
164 salt.runSaltProcessStep(pepperEnv, 'I@mysql:client', 'file.remove', ["/root/mysql/flags/${databasesList[i]}-installed"])
165 }
166 }
167 salt.enforceState(pepperEnv, 'I@mysql:client', 'mysql.client')
168 }else{
169 common.errorMsg("No _upgrade databases were returned")
170 }
171
172 try {
173 salt.enforceState(pepperEnv, "${test_upgrade_node}*", 'keystone.server')
174 salt.runSaltProcessStep(pepperEnv, "${test_upgrade_node}*", 'service.restart', ['apache2'])
175 } catch (Exception e) {
176 common.warningMsg('Restarting Apache2')
177 salt.runSaltProcessStep(pepperEnv, "${test_upgrade_node}*", 'service.restart', ['apache2'])
178 }
179 retryStateRun(pepperEnv, "${test_upgrade_node}*", 'keystone.client')
180 retryStateRun(pepperEnv, "${test_upgrade_node}*", 'glance')
181 salt.enforceState(pepperEnv, "${test_upgrade_node}*", 'keystone.server')
182
183 retryStateRun(pepperEnv, "${test_upgrade_node}*", 'nova')
184 retryStateRun(pepperEnv, "${test_upgrade_node}*", 'nova') // run nova state again as sometimes nova does not enforce itself for some reason
185 retryStateRun(pepperEnv, "${test_upgrade_node}*", 'cinder')
186 retryStateRun(pepperEnv, "${test_upgrade_node}*", 'neutron')
187 retryStateRun(pepperEnv, "${test_upgrade_node}*", 'heat')
188
189 salt.cmdRun(pepperEnv, "${test_upgrade_node}*", '. /root/keystonercv3; openstack service list; openstack image list; openstack flavor list; openstack compute service list; openstack server list; openstack network list; openstack volume list; openstack orchestration service list')
190
191 if (STAGE_TEST_UPGRADE.toBoolean() == true && STAGE_REAL_UPGRADE.toBoolean() == true) {
192 stage('Ask for manual confirmation') {
193 input message: "Do you want to continue with upgrade?"
194 }
195 }
196}
197
198
199def vcpRealUpgrade(pepperEnv) {
200 def common = new com.mirantis.mk.Common()
201 def salt = new com.mirantis.mk.Salt()
202 def openstack = new com.mirantis.mk.Openstack()
203 def virsh = new com.mirantis.mk.Virsh()
204
205 def upgrade_target = []
206 upgrade_target.add('I@horizon:server')
207 upgrade_target.add('I@keystone:server and not upg*')
208
209 def proxy_general_target = "I@horizon:server"
210 def control_general_target = "I@keystone:server and not upg*"
211 def upgrade_general_target = "( I@keystone:server and not upg* ) or I@horizon:server"
212
213 def snapshotName = "upgradeSnapshot1"
214
215 def domain = salt.getDomainName(pepperEnv)
216 def errorOccured = false
217
218 for (tgt in upgrade_target) {
219 def target_hosts = salt.getMinionsSorted(pepperEnv, "${tgt}")
220 def node = salt.getFirstMinion(pepperEnv, "${tgt}")
221 def general_target = ""
222
223 if (tgt.toString().contains('horizon:server')) {
224 general_target = 'prx'
225 } else if (tgt.toString().contains('keystone:server')) {
226 general_target = 'ctl'
227 }
228
229 if (OPERATING_SYSTEM_RELEASE_UPGRADE.toBoolean() == false) {
230 stopServices(pepperEnv, node, tgt, general_target)
231 }
232
233 def node_count = 1
234 for (t in target_hosts) {
235 def target = salt.stripDomainName(t)
236 def nodeProvider = salt.getNodeProvider(pepperEnv, "${general_target}0${node_count}")
237 if ((OPERATING_SYSTEM_RELEASE_UPGRADE.toBoolean() == true) && (SKIP_VM_RELAUNCH.toBoolean() == false)) {
238 salt.runSaltProcessStep(pepperEnv, "${nodeProvider}", 'virt.destroy', ["${target}.${domain}"])
239 sleep(2)
240 try {
241 salt.cmdRun(pepperEnv, "${nodeProvider}", "[ ! -f /root/${target}.${domain}.qcow2.bak ] && cp /var/lib/libvirt/images/${target}.${domain}/system.qcow2 ./${target}.${domain}.qcow2.bak")
242 } catch (Exception e) {
243 common.warningMsg('File already exists')
244 }
245 salt.runSaltProcessStep(pepperEnv, "${nodeProvider}", 'virt.undefine', ["${target}.${domain}"])
246 try {
247 salt.cmdRun(pepperEnv, 'I@salt:master', "salt-key -d ${target}.${domain} -y")
248 } catch (Exception e) {
249 common.warningMsg('does not match any accepted, unaccepted or rejected keys. They were probably already removed. We should continue to run')
250 }
251 } else if (OPERATING_SYSTEM_RELEASE_UPGRADE.toBoolean() == false) {
252 virsh.liveSnapshotPresent(pepperEnv, nodeProvider, target, snapshotName)
253 }
254 node_count++
255 }
256 }
257
258 if ((OPERATING_SYSTEM_RELEASE_UPGRADE.toBoolean() == true) && (SKIP_VM_RELAUNCH.toBoolean() == false)) {
Jiri Broulik60dcab32018-03-08 17:42:06 +0100259 salt.cmdRun(pepperEnv, 'I@xtrabackup:client', "su root -c '/usr/local/bin/innobackupex-runner.sh -f -s'")
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100260
261 salt.enforceState(pepperEnv, 'I@salt:control', 'salt.control')
262
263 for (tgt in upgrade_target) {
264 salt.minionsPresent(pepperEnv, 'I@salt:master', tgt)
265 }
266 }
267
268 // salt '*' saltutil.refresh_pillar
269 salt.runSaltProcessStep(pepperEnv, upgrade_general_target, 'saltutil.refresh_pillar', [])
270 // salt '*' saltutil.sync_all
271 salt.runSaltProcessStep(pepperEnv, upgrade_general_target, 'saltutil.sync_all', [])
272
Jiri Broulik827d0112018-04-25 16:00:07 +0200273 stateRun(pepperEnv, upgrade_general_target, ['linux.network.proxy'])
274 try {
275 salt.runSaltProcessStep(pepperEnv, upgrade_general_target, 'state.sls', ["salt.minion.base"], null, true, 60)
276 } catch (Exception e) {
277 common.warningMsg(e)
278 }
279
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100280 if (OPERATING_SYSTEM_RELEASE_UPGRADE.toBoolean() == false) {
281
282 try {
283 salt.enforceState(pepperEnv, upgrade_general_target, ['linux.system.repo'])
284 } catch (Exception e) {
285 common.warningMsg(e)
286 }
287
288 salt.runSaltProcessStep(pepperEnv, upgrade_general_target, 'pkg.install', ['salt-minion'], null, true, 5)
289 salt.minionsReachable(pepperEnv, 'I@salt:master', upgrade_general_target)
290
291 // Apply package upgrades
292 args = 'export DEBIAN_FRONTEND=noninteractive; apt-get -y -q --allow-downgrades --allow-unauthenticated -o Dpkg::Options::=\"--force-confdef\" -o Dpkg::Options::=\"--force-confold\" dist-upgrade;'
293 common.warningMsg("Running apt dist-upgrade on ${proxy_general_target} and ${control_general_target}, this might take a while...")
294 out = salt.runSaltProcessStep(pepperEnv, upgrade_general_target, 'cmd.run', [args])
295 // stop services again
296 def proxy_node = salt.getFirstMinion(pepperEnv, proxy_general_target)
297 def control_node = salt.getFirstMinion(pepperEnv, control_general_target)
298 stopServices(pepperEnv, proxy_node, proxy_general_target, 'prx')
299 stopServices(pepperEnv, control_node, control_general_target, 'ctl')
300 salt.printSaltCommandResult(out)
301 if (out.toString().contains("dpkg returned an error code")) {
302 input message: "Apt dist-upgrade failed, please fix it manually and then click on proceed. If unable to fix it, click on abort and run the rollback stage."
303 }
304 // run base states
305 try {
306 salt.enforceState(pepperEnv, upgrade_general_target, ['linux', 'openssh', 'salt.minion', 'ntp', 'rsyslog'])
307 } catch (Exception e) {
308 common.warningMsg(e)
309 }
310 salt.enforceState(pepperEnv, control_general_target, ['keepalived', 'haproxy'])
311 } else {
312 // initial VM setup
313 try {
314 salt.enforceState(pepperEnv, upgrade_general_target, ['linux', 'openssh'])
315 } catch (Exception e) {
316 common.warningMsg(e)
317 }
318 try {
Jiri Broulik827d0112018-04-25 16:00:07 +0200319 salt.runSaltProcessStep(pepperEnv, upgrade_general_target, 'state.sls', ["salt.minion"], null, true, 60)
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100320 } catch (Exception e) {
321 common.warningMsg(e)
322 }
323 try {
324 salt.enforceState(pepperEnv, upgrade_general_target, ['ntp', 'rsyslog'])
325 } catch (Exception e) {
326 common.warningMsg(e)
327 }
328 salt.enforceState(pepperEnv, upgrade_general_target, ['linux', 'openssh', 'salt.minion', 'ntp', 'rsyslog'])
329 salt.enforceState(pepperEnv, control_general_target, ['keepalived', 'haproxy'])
330 salt.runSaltProcessStep(pepperEnv, control_general_target, 'service.restart', ['rsyslog'])
331 }
332
333 try {
334 try {
335 salt.enforceState(pepperEnv, control_general_target, ['memcached', 'keystone.server'])
336 salt.runSaltProcessStep(pepperEnv, control_general_target, 'service.restart', ['apache2'])
337 } catch (Exception e) {
338 common.warningMsg('Restarting Apache2 and enforcing keystone.server state again')
339 salt.runSaltProcessStep(pepperEnv, control_general_target, 'service.restart', ['apache2'])
340 salt.enforceState(pepperEnv, control_general_target, 'keystone.server')
341 }
342 // salt 'ctl01*' state.sls keystone.client
343 retryStateRun(pepperEnv, "I@keystone:client and ${control_general_target}", 'keystone.client')
344 retryStateRun(pepperEnv, control_general_target, 'glance')
345 salt.enforceState(pepperEnv, control_general_target, 'glusterfs.client')
346 salt.enforceState(pepperEnv, control_general_target, 'keystone.server')
347 retryStateRun(pepperEnv, control_general_target, 'nova')
348 retryStateRun(pepperEnv, control_general_target, 'cinder')
349 retryStateRun(pepperEnv, control_general_target, 'neutron')
350 retryStateRun(pepperEnv, control_general_target, 'heat')
351 } catch (Exception e) {
352 errorOccured = true
353 if (OPERATING_SYSTEM_RELEASE_UPGRADE.toBoolean() == false) {
354 input message: "Some states that require syncdb failed. Please check the reason.Click proceed only if you want to restore database into it's pre-upgrade state. If you want restore production database and also the VMs into its pre-upgrade state please click on abort and run the rollback stage."
355 } else {
356 input message: "Some states that require syncdb failed. Please check the reason and click proceed only if you want to restore database into it's pre-upgrade state. Otherwise, click abort."
357 }
358 openstack.restoreGaleraDb(pepperEnv)
359 common.errorMsg("Stage Real control upgrade failed")
360 }
361 if(!errorOccured){
362
363 if (OPERATING_SYSTEM_RELEASE_UPGRADE.toBoolean() == true) {
364
365 try {
366 if (salt.testTarget(pepperEnv, "I@ceph:client and ${control_general_target}*")) {
367 salt.enforceState(pepperEnv, "I@ceph:client and ${control_general_target}*", 'ceph.client')
368 }
369 } catch (Exception er) {
370 common.warningMsg("Ceph client state on controllers failed. Please fix it manually")
371 }
372 try {
373 if (salt.testTarget(pepperEnv, "I@ceph:common and ${control_general_target}*")) {
374 salt.enforceState(pepperEnv, "I@ceph:common and ${control_general_target}*", ['ceph.common', 'ceph.setup.keyring'])
375 }
376 } catch (Exception er) {
377 common.warningMsg("Ceph common state on controllers failed. Please fix it manually")
378 }
379 try {
380 if (salt.testTarget(pepperEnv, "I@ceph:common and ${control_general_target}*")) {
381 salt.runSaltProcessStep(master, "I@ceph:common and ${control_general_target}*", 'service.restart', ['glance-api', 'glance-glare', 'glance-registry'])
382 }
383 } catch (Exception er) {
384 common.warningMsg("Restarting Glance services on controllers failed. Please fix it manually")
385 }
386 }
387
388 // salt 'cmp*' cmd.run 'service nova-compute restart'
389 salt.runSaltProcessStep(pepperEnv, 'I@nova:compute', 'service.restart', ['nova-compute'])
390 salt.runSaltProcessStep(pepperEnv, control_general_target, 'service.restart', ['nova-conductor'])
391 salt.runSaltProcessStep(pepperEnv, control_general_target, 'service.restart', ['nova-scheduler'])
392
393 retryStateRun(pepperEnv, proxy_general_target, 'keepalived')
394 retryStateRun(pepperEnv, proxy_general_target, 'horizon')
395 retryStateRun(pepperEnv, proxy_general_target, 'nginx')
396 retryStateRun(pepperEnv, proxy_general_target, 'memcached')
397
398 try {
399 salt.enforceHighstate(pepperEnv, control_general_target)
400 } catch (Exception er) {
401 common.errorMsg("Highstate was executed on controller nodes but something failed. Please check it and fix it accordingly.")
402 }
403
404 try {
405 salt.enforceHighstate(pepperEnv, proxy_general_target)
406 } catch (Exception er) {
407 common.errorMsg("Highstate was executed on proxy nodes but something failed. Please check it and fix it accordingly.")
408 }
409
410 try {
411 salt.cmdRun(pepperEnv, "${control_general_target}01*", '. /root/keystonercv3; openstack service list; openstack image list; openstack flavor list; openstack compute service list; openstack server list; openstack network list; openstack volume list; openstack orchestration service list')
412 } catch (Exception er) {
413 common.errorMsg(er)
414 }
415
416 /*
417 if (OPERATING_SYSTEM_RELEASE_UPGRADE.toBoolean() == false) {
418 input message: "Please verify if the control upgrade was successful! If so, by clicking proceed the original VMs disk images will be backed up and snapshot will be merged to the upgraded VMs which will finalize the upgrade procedure"
419 node_count = 1
420 for (t in proxy_target_hosts) {
421 def target = salt.stripDomainName(t)
422 def nodeProvider = salt.getNodeProvider(pepperEnv, "${general_target}0${node_count}")
423 try {
424 salt.cmdRun(pepperEnv, "${nodeProvider}", "[ ! -f /root/${target}.${domain}.qcow2.bak ] && cp /var/lib/libvirt/images/${target}.${domain}/system.qcow2 ./${target}.${domain}.qcow2.bak")
425 } catch (Exception e) {
426 common.warningMsg('File already exists')
427 }
428 virsh.liveSnapshotMerge(pepperEnv, nodeProvider, target, snapshotName)
429 node_count++
430 }
431 node_count = 1
432 for (t in control_target_hosts) {
433 def target = salt.stripDomainName(t)
434 def nodeProvider = salt.getNodeProvider(pepperEnv, "${general_target}0${node_count}")
435 try {
436 salt.cmdRun(pepperEnv, "${nodeProvider}", "[ ! -f /root/${target}.${domain}.qcow2.bak ] && cp /var/lib/libvirt/images/${target}.${domain}/system.qcow2 ./${target}.${domain}.qcow2.bak")
437 } catch (Exception e) {
438 common.warningMsg('File already exists')
439 }
440 virsh.liveSnapshotMerge(pepperEnv, nodeProvider, target, snapshotName)
441 node_count++
442 }
443 input message: "Please scroll up and look for red highlighted messages containing 'virsh blockcommit' string.
444 If there are any fix it manually. Otherwise click on proceed."
445 }
446 */
447 }
448}
449
450
451def vcpRollback(pepperEnv) {
452 def common = new com.mirantis.mk.Common()
453 def salt = new com.mirantis.mk.Salt()
454 def openstack = new com.mirantis.mk.Openstack()
455 def virsh = new com.mirantis.mk.Virsh()
456 def snapshotName = "upgradeSnapshot1"
457 try {
458 salt.runSaltProcessStep(pepperEnv, '*', 'saltutil.refresh_pillar', [], null, true, 2)
459 } catch (Exception e) {
460 common.warningMsg("No response from some minions. We should continue to run")
461 }
462
463 def domain = salt.getDomainName(pepperEnv)
464
465 def rollback_target = []
466 rollback_target.add('I@horizon:server')
467 rollback_target.add('I@keystone:server and not upg*')
468
469 def control_general_target = "I@keystone:server and not upg*"
470 def upgrade_general_target = "( I@keystone:server and not upg* ) or I@horizon:server"
471
472 openstack.restoreGaleraDb(pepperEnv)
473
474 for (tgt in rollback_target) {
475 def target_hosts = salt.getMinionsSorted(pepperEnv, "${tgt}")
476 def node = salt.getFirstMinion(pepperEnv, "${tgt}")
477 def general_target = salt.getMinionsGeneralName(pepperEnv, "${tgt}")
478
479 if (tgt.toString().contains('horizon:server')) {
480 general_target = 'prx'
481 } else if (tgt.toString().contains('keystone:server')) {
482 general_target = 'ctl'
483 }
484
485 def node_count = 1
486 for (t in target_hosts) {
487 def target = salt.stripDomainName(t)
488 def nodeProvider = salt.getNodeProvider(pepperEnv, "${general_target}0${node_count}")
489 salt.runSaltProcessStep(pepperEnv, "${nodeProvider}", 'virt.destroy', ["${target}.${domain}"])
490 sleep(2)
491 if (OPERATING_SYSTEM_RELEASE_UPGRADE.toBoolean() == true) {
492 salt.runSaltProcessStep(pepperEnv, "${nodeProvider}", 'file.copy', ["/root/${target}.${domain}.qcow2.bak", "/var/lib/libvirt/images/${target}.${domain}/system.qcow2"])
493 try {
494 salt.cmdRun(pepperEnv, 'I@salt:master', "salt-key -d ${target}.${domain} -y")
495 } catch (Exception e) {
496 common.warningMsg('does not match any accepted, unaccepted or rejected keys. They were probably already removed. We should continue to run')
497 }
498 salt.runSaltProcessStep(pepperEnv, "${nodeProvider}", 'virt.start', ["${target}.${domain}"])
499 } else {
500 salt.cmdRun(pepperEnv, "${nodeProvider}", "virsh define /var/lib/libvirt/images/${target}.${domain}.xml")
501 salt.runSaltProcessStep(pepperEnv, "${nodeProvider}", 'virt.start', ["${target}.${domain}"])
502 virsh.liveSnapshotAbsent(pepperEnv, nodeProvider, target, snapshotName)
503 }
504 node_count++
505 }
506 }
507
508 // salt 'cmp*' cmd.run 'service nova-compute restart'
509 salt.runSaltProcessStep(pepperEnv, 'I@nova:compute', 'service.restart', ['nova-compute'])
510
511 if (OPERATING_SYSTEM_RELEASE_UPGRADE.toBoolean() == true) {
512 for (tgt in rollback_target) {
513 salt.minionsPresent(pepperEnv, 'I@salt:master', tgt)
514 }
515 }
516
517 salt.minionsReachable(pepperEnv, 'I@salt:master', upgrade_general_target)
518
519 salt.runSaltProcessStep(pepperEnv, control_general_target, 'service.restart', ['nova-conductor'])
520 salt.runSaltProcessStep(pepperEnv, control_general_target, 'service.restart', ['nova-scheduler'])
521
522 def control_node = salt.getFirstMinion(pepperEnv, control_general_target)
523
524 salt.cmdRun(pepperEnv, "${control_node}*", '. /root/keystonerc; nova service-list; glance image-list; nova flavor-list; nova hypervisor-list; nova list; neutron net-list; cinder list; heat service-list')
525}
526
527
chnyda625f4b42017-10-11 14:10:31 +0200528def pepperEnv = "pepperEnv"
Jakub Josefa63f9862018-01-11 17:58:38 +0100529timeout(time: 12, unit: 'HOURS') {
530 node() {
Jiri Broulikbb447ac2017-05-04 15:36:22 +0200531
Jakub Josefa63f9862018-01-11 17:58:38 +0100532 stage('Setup virtualenv for Pepper') {
533 python.setupPepperVirtualenv(pepperEnv, SALT_MASTER_URL, SALT_MASTER_CREDENTIALS)
534 }
Jiri Broulikbb447ac2017-05-04 15:36:22 +0200535
Jakub Josefa63f9862018-01-11 17:58:38 +0100536 if (STAGE_TEST_UPGRADE.toBoolean() == true) {
537 stage('Test upgrade') {
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100538 vcpTestUpgrade(pepperEnv)
Ruslan Kamaldinov6feef402017-08-02 16:55:58 +0400539 }
540 }
Ruslan Kamaldinov6feef402017-08-02 16:55:58 +0400541
Jakub Josefa63f9862018-01-11 17:58:38 +0100542 if (STAGE_REAL_UPGRADE.toBoolean() == true) {
543 stage('Real upgrade') {
544 // # actual upgrade
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100545 vcpRealUpgrade(pepperEnv)
Jakub Josefa63f9862018-01-11 17:58:38 +0100546 }
547
548 if (STAGE_REAL_UPGRADE.toBoolean() == true && STAGE_ROLLBACK_UPGRADE.toBoolean() == true) {
549 stage('Ask for manual confirmation') {
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100550 input message: "Please verify if the control upgrade was successful. If it did not succeed, in the worst scenario, you can click on proceed to continue with control-upgrade-rollback. Do you want to continue with the rollback?"
Jakub Josefa63f9862018-01-11 17:58:38 +0100551 }
552 }
553 }
554
555 if (STAGE_ROLLBACK_UPGRADE.toBoolean() == true) {
556 stage('Rollback upgrade') {
Jakub Josefa63f9862018-01-11 17:58:38 +0100557 stage('Ask for manual confirmation') {
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100558 input message: "Before rollback please check the documentation for reclass model changes. Do you really want to continue with the rollback?"
Jakub Josefa63f9862018-01-11 17:58:38 +0100559 }
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100560 vcpRollback(pepperEnv)
Ruslan Kamaldinov6feef402017-08-02 16:55:58 +0400561 }
562 }
563 }
Jakub Josefa63f9862018-01-11 17:58:38 +0100564}