blob: 50d2c28e54e8b443a8b209d273c07c7e55585dcb [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
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100233 for (t in target_hosts) {
234 def target = salt.stripDomainName(t)
Jiri Broulikcaf721e2018-04-25 17:16:50 +0200235 def nodeProvider = salt.getNodeProvider(pepperEnv, t)
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100236 if ((OPERATING_SYSTEM_RELEASE_UPGRADE.toBoolean() == true) && (SKIP_VM_RELAUNCH.toBoolean() == false)) {
237 salt.runSaltProcessStep(pepperEnv, "${nodeProvider}", 'virt.destroy', ["${target}.${domain}"])
238 sleep(2)
239 try {
240 salt.cmdRun(pepperEnv, "${nodeProvider}", "[ ! -f /root/${target}.${domain}.qcow2.bak ] && cp /var/lib/libvirt/images/${target}.${domain}/system.qcow2 ./${target}.${domain}.qcow2.bak")
241 } catch (Exception e) {
242 common.warningMsg('File already exists')
243 }
244 salt.runSaltProcessStep(pepperEnv, "${nodeProvider}", 'virt.undefine', ["${target}.${domain}"])
245 try {
246 salt.cmdRun(pepperEnv, 'I@salt:master', "salt-key -d ${target}.${domain} -y")
247 } catch (Exception e) {
248 common.warningMsg('does not match any accepted, unaccepted or rejected keys. They were probably already removed. We should continue to run')
249 }
250 } else if (OPERATING_SYSTEM_RELEASE_UPGRADE.toBoolean() == false) {
251 virsh.liveSnapshotPresent(pepperEnv, nodeProvider, target, snapshotName)
252 }
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100253 }
254 }
255
256 if ((OPERATING_SYSTEM_RELEASE_UPGRADE.toBoolean() == true) && (SKIP_VM_RELAUNCH.toBoolean() == false)) {
Jiri Broulik60dcab32018-03-08 17:42:06 +0100257 salt.cmdRun(pepperEnv, 'I@xtrabackup:client', "su root -c '/usr/local/bin/innobackupex-runner.sh -f -s'")
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100258
259 salt.enforceState(pepperEnv, 'I@salt:control', 'salt.control')
260
261 for (tgt in upgrade_target) {
262 salt.minionsPresent(pepperEnv, 'I@salt:master', tgt)
263 }
264 }
265
266 // salt '*' saltutil.refresh_pillar
267 salt.runSaltProcessStep(pepperEnv, upgrade_general_target, 'saltutil.refresh_pillar', [])
268 // salt '*' saltutil.sync_all
269 salt.runSaltProcessStep(pepperEnv, upgrade_general_target, 'saltutil.sync_all', [])
270
Jiri Broulik827d0112018-04-25 16:00:07 +0200271 stateRun(pepperEnv, upgrade_general_target, ['linux.network.proxy'])
272 try {
273 salt.runSaltProcessStep(pepperEnv, upgrade_general_target, 'state.sls', ["salt.minion.base"], null, true, 60)
274 } catch (Exception e) {
275 common.warningMsg(e)
276 }
277
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100278 if (OPERATING_SYSTEM_RELEASE_UPGRADE.toBoolean() == false) {
279
280 try {
281 salt.enforceState(pepperEnv, upgrade_general_target, ['linux.system.repo'])
282 } catch (Exception e) {
283 common.warningMsg(e)
284 }
285
286 salt.runSaltProcessStep(pepperEnv, upgrade_general_target, 'pkg.install', ['salt-minion'], null, true, 5)
287 salt.minionsReachable(pepperEnv, 'I@salt:master', upgrade_general_target)
288
289 // Apply package upgrades
290 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;'
291 common.warningMsg("Running apt dist-upgrade on ${proxy_general_target} and ${control_general_target}, this might take a while...")
292 out = salt.runSaltProcessStep(pepperEnv, upgrade_general_target, 'cmd.run', [args])
293 // stop services again
294 def proxy_node = salt.getFirstMinion(pepperEnv, proxy_general_target)
295 def control_node = salt.getFirstMinion(pepperEnv, control_general_target)
296 stopServices(pepperEnv, proxy_node, proxy_general_target, 'prx')
297 stopServices(pepperEnv, control_node, control_general_target, 'ctl')
298 salt.printSaltCommandResult(out)
299 if (out.toString().contains("dpkg returned an error code")) {
300 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."
301 }
302 // run base states
303 try {
304 salt.enforceState(pepperEnv, upgrade_general_target, ['linux', 'openssh', 'salt.minion', 'ntp', 'rsyslog'])
305 } catch (Exception e) {
306 common.warningMsg(e)
307 }
308 salt.enforceState(pepperEnv, control_general_target, ['keepalived', 'haproxy'])
309 } else {
310 // initial VM setup
311 try {
312 salt.enforceState(pepperEnv, upgrade_general_target, ['linux', 'openssh'])
313 } catch (Exception e) {
314 common.warningMsg(e)
315 }
316 try {
Jiri Broulik827d0112018-04-25 16:00:07 +0200317 salt.runSaltProcessStep(pepperEnv, upgrade_general_target, 'state.sls', ["salt.minion"], null, true, 60)
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100318 } catch (Exception e) {
319 common.warningMsg(e)
320 }
321 try {
322 salt.enforceState(pepperEnv, upgrade_general_target, ['ntp', 'rsyslog'])
323 } catch (Exception e) {
324 common.warningMsg(e)
325 }
326 salt.enforceState(pepperEnv, upgrade_general_target, ['linux', 'openssh', 'salt.minion', 'ntp', 'rsyslog'])
327 salt.enforceState(pepperEnv, control_general_target, ['keepalived', 'haproxy'])
328 salt.runSaltProcessStep(pepperEnv, control_general_target, 'service.restart', ['rsyslog'])
329 }
330
331 try {
332 try {
333 salt.enforceState(pepperEnv, control_general_target, ['memcached', 'keystone.server'])
334 salt.runSaltProcessStep(pepperEnv, control_general_target, 'service.restart', ['apache2'])
335 } catch (Exception e) {
336 common.warningMsg('Restarting Apache2 and enforcing keystone.server state again')
337 salt.runSaltProcessStep(pepperEnv, control_general_target, 'service.restart', ['apache2'])
338 salt.enforceState(pepperEnv, control_general_target, 'keystone.server')
339 }
340 // salt 'ctl01*' state.sls keystone.client
341 retryStateRun(pepperEnv, "I@keystone:client and ${control_general_target}", 'keystone.client')
342 retryStateRun(pepperEnv, control_general_target, 'glance')
343 salt.enforceState(pepperEnv, control_general_target, 'glusterfs.client')
344 salt.enforceState(pepperEnv, control_general_target, 'keystone.server')
345 retryStateRun(pepperEnv, control_general_target, 'nova')
346 retryStateRun(pepperEnv, control_general_target, 'cinder')
347 retryStateRun(pepperEnv, control_general_target, 'neutron')
348 retryStateRun(pepperEnv, control_general_target, 'heat')
349 } catch (Exception e) {
350 errorOccured = true
351 if (OPERATING_SYSTEM_RELEASE_UPGRADE.toBoolean() == false) {
352 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."
353 } else {
354 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."
355 }
356 openstack.restoreGaleraDb(pepperEnv)
357 common.errorMsg("Stage Real control upgrade failed")
358 }
359 if(!errorOccured){
360
361 if (OPERATING_SYSTEM_RELEASE_UPGRADE.toBoolean() == true) {
362
363 try {
364 if (salt.testTarget(pepperEnv, "I@ceph:client and ${control_general_target}*")) {
365 salt.enforceState(pepperEnv, "I@ceph:client and ${control_general_target}*", 'ceph.client')
366 }
367 } catch (Exception er) {
368 common.warningMsg("Ceph client state on controllers failed. Please fix it manually")
369 }
370 try {
371 if (salt.testTarget(pepperEnv, "I@ceph:common and ${control_general_target}*")) {
372 salt.enforceState(pepperEnv, "I@ceph:common and ${control_general_target}*", ['ceph.common', 'ceph.setup.keyring'])
373 }
374 } catch (Exception er) {
375 common.warningMsg("Ceph common state on controllers failed. Please fix it manually")
376 }
377 try {
378 if (salt.testTarget(pepperEnv, "I@ceph:common and ${control_general_target}*")) {
379 salt.runSaltProcessStep(master, "I@ceph:common and ${control_general_target}*", 'service.restart', ['glance-api', 'glance-glare', 'glance-registry'])
380 }
381 } catch (Exception er) {
382 common.warningMsg("Restarting Glance services on controllers failed. Please fix it manually")
383 }
384 }
385
386 // salt 'cmp*' cmd.run 'service nova-compute restart'
387 salt.runSaltProcessStep(pepperEnv, 'I@nova:compute', 'service.restart', ['nova-compute'])
388 salt.runSaltProcessStep(pepperEnv, control_general_target, 'service.restart', ['nova-conductor'])
389 salt.runSaltProcessStep(pepperEnv, control_general_target, 'service.restart', ['nova-scheduler'])
390
391 retryStateRun(pepperEnv, proxy_general_target, 'keepalived')
392 retryStateRun(pepperEnv, proxy_general_target, 'horizon')
393 retryStateRun(pepperEnv, proxy_general_target, 'nginx')
394 retryStateRun(pepperEnv, proxy_general_target, 'memcached')
395
396 try {
397 salt.enforceHighstate(pepperEnv, control_general_target)
398 } catch (Exception er) {
399 common.errorMsg("Highstate was executed on controller nodes but something failed. Please check it and fix it accordingly.")
400 }
401
402 try {
403 salt.enforceHighstate(pepperEnv, proxy_general_target)
404 } catch (Exception er) {
405 common.errorMsg("Highstate was executed on proxy nodes but something failed. Please check it and fix it accordingly.")
406 }
407
408 try {
409 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')
410 } catch (Exception er) {
411 common.errorMsg(er)
412 }
413
414 /*
415 if (OPERATING_SYSTEM_RELEASE_UPGRADE.toBoolean() == false) {
416 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"
417 node_count = 1
418 for (t in proxy_target_hosts) {
419 def target = salt.stripDomainName(t)
420 def nodeProvider = salt.getNodeProvider(pepperEnv, "${general_target}0${node_count}")
421 try {
422 salt.cmdRun(pepperEnv, "${nodeProvider}", "[ ! -f /root/${target}.${domain}.qcow2.bak ] && cp /var/lib/libvirt/images/${target}.${domain}/system.qcow2 ./${target}.${domain}.qcow2.bak")
423 } catch (Exception e) {
424 common.warningMsg('File already exists')
425 }
426 virsh.liveSnapshotMerge(pepperEnv, nodeProvider, target, snapshotName)
427 node_count++
428 }
429 node_count = 1
430 for (t in control_target_hosts) {
431 def target = salt.stripDomainName(t)
432 def nodeProvider = salt.getNodeProvider(pepperEnv, "${general_target}0${node_count}")
433 try {
434 salt.cmdRun(pepperEnv, "${nodeProvider}", "[ ! -f /root/${target}.${domain}.qcow2.bak ] && cp /var/lib/libvirt/images/${target}.${domain}/system.qcow2 ./${target}.${domain}.qcow2.bak")
435 } catch (Exception e) {
436 common.warningMsg('File already exists')
437 }
438 virsh.liveSnapshotMerge(pepperEnv, nodeProvider, target, snapshotName)
439 node_count++
440 }
441 input message: "Please scroll up and look for red highlighted messages containing 'virsh blockcommit' string.
442 If there are any fix it manually. Otherwise click on proceed."
443 }
444 */
445 }
446}
447
448
449def vcpRollback(pepperEnv) {
450 def common = new com.mirantis.mk.Common()
451 def salt = new com.mirantis.mk.Salt()
452 def openstack = new com.mirantis.mk.Openstack()
453 def virsh = new com.mirantis.mk.Virsh()
454 def snapshotName = "upgradeSnapshot1"
455 try {
456 salt.runSaltProcessStep(pepperEnv, '*', 'saltutil.refresh_pillar', [], null, true, 2)
457 } catch (Exception e) {
458 common.warningMsg("No response from some minions. We should continue to run")
459 }
460
461 def domain = salt.getDomainName(pepperEnv)
462
463 def rollback_target = []
464 rollback_target.add('I@horizon:server')
465 rollback_target.add('I@keystone:server and not upg*')
466
467 def control_general_target = "I@keystone:server and not upg*"
468 def upgrade_general_target = "( I@keystone:server and not upg* ) or I@horizon:server"
469
470 openstack.restoreGaleraDb(pepperEnv)
471
472 for (tgt in rollback_target) {
473 def target_hosts = salt.getMinionsSorted(pepperEnv, "${tgt}")
474 def node = salt.getFirstMinion(pepperEnv, "${tgt}")
475 def general_target = salt.getMinionsGeneralName(pepperEnv, "${tgt}")
476
477 if (tgt.toString().contains('horizon:server')) {
478 general_target = 'prx'
479 } else if (tgt.toString().contains('keystone:server')) {
480 general_target = 'ctl'
481 }
482
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100483 for (t in target_hosts) {
484 def target = salt.stripDomainName(t)
Jiri Broulikcaf721e2018-04-25 17:16:50 +0200485 def nodeProvider = salt.getNodeProvider(pepperEnv, t)
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100486 salt.runSaltProcessStep(pepperEnv, "${nodeProvider}", 'virt.destroy', ["${target}.${domain}"])
487 sleep(2)
488 if (OPERATING_SYSTEM_RELEASE_UPGRADE.toBoolean() == true) {
489 salt.runSaltProcessStep(pepperEnv, "${nodeProvider}", 'file.copy', ["/root/${target}.${domain}.qcow2.bak", "/var/lib/libvirt/images/${target}.${domain}/system.qcow2"])
490 try {
491 salt.cmdRun(pepperEnv, 'I@salt:master', "salt-key -d ${target}.${domain} -y")
492 } catch (Exception e) {
493 common.warningMsg('does not match any accepted, unaccepted or rejected keys. They were probably already removed. We should continue to run')
494 }
495 salt.runSaltProcessStep(pepperEnv, "${nodeProvider}", 'virt.start', ["${target}.${domain}"])
496 } else {
497 salt.cmdRun(pepperEnv, "${nodeProvider}", "virsh define /var/lib/libvirt/images/${target}.${domain}.xml")
498 salt.runSaltProcessStep(pepperEnv, "${nodeProvider}", 'virt.start', ["${target}.${domain}"])
499 virsh.liveSnapshotAbsent(pepperEnv, nodeProvider, target, snapshotName)
500 }
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100501 }
502 }
503
504 // salt 'cmp*' cmd.run 'service nova-compute restart'
505 salt.runSaltProcessStep(pepperEnv, 'I@nova:compute', 'service.restart', ['nova-compute'])
506
507 if (OPERATING_SYSTEM_RELEASE_UPGRADE.toBoolean() == true) {
508 for (tgt in rollback_target) {
509 salt.minionsPresent(pepperEnv, 'I@salt:master', tgt)
510 }
511 }
512
513 salt.minionsReachable(pepperEnv, 'I@salt:master', upgrade_general_target)
514
515 salt.runSaltProcessStep(pepperEnv, control_general_target, 'service.restart', ['nova-conductor'])
516 salt.runSaltProcessStep(pepperEnv, control_general_target, 'service.restart', ['nova-scheduler'])
517
518 def control_node = salt.getFirstMinion(pepperEnv, control_general_target)
519
520 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')
521}
522
523
chnyda625f4b42017-10-11 14:10:31 +0200524def pepperEnv = "pepperEnv"
Jakub Josefa63f9862018-01-11 17:58:38 +0100525timeout(time: 12, unit: 'HOURS') {
526 node() {
Jiri Broulikbb447ac2017-05-04 15:36:22 +0200527
Jakub Josefa63f9862018-01-11 17:58:38 +0100528 stage('Setup virtualenv for Pepper') {
529 python.setupPepperVirtualenv(pepperEnv, SALT_MASTER_URL, SALT_MASTER_CREDENTIALS)
530 }
Jiri Broulikbb447ac2017-05-04 15:36:22 +0200531
Jakub Josefa63f9862018-01-11 17:58:38 +0100532 if (STAGE_TEST_UPGRADE.toBoolean() == true) {
533 stage('Test upgrade') {
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100534 vcpTestUpgrade(pepperEnv)
Ruslan Kamaldinov6feef402017-08-02 16:55:58 +0400535 }
536 }
Ruslan Kamaldinov6feef402017-08-02 16:55:58 +0400537
Jakub Josefa63f9862018-01-11 17:58:38 +0100538 if (STAGE_REAL_UPGRADE.toBoolean() == true) {
539 stage('Real upgrade') {
540 // # actual upgrade
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100541 vcpRealUpgrade(pepperEnv)
Jakub Josefa63f9862018-01-11 17:58:38 +0100542 }
543
544 if (STAGE_REAL_UPGRADE.toBoolean() == true && STAGE_ROLLBACK_UPGRADE.toBoolean() == true) {
545 stage('Ask for manual confirmation') {
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100546 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 +0100547 }
548 }
549 }
550
551 if (STAGE_ROLLBACK_UPGRADE.toBoolean() == true) {
552 stage('Rollback upgrade') {
Jakub Josefa63f9862018-01-11 17:58:38 +0100553 stage('Ask for manual confirmation') {
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100554 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 +0100555 }
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100556 vcpRollback(pepperEnv)
Ruslan Kamaldinov6feef402017-08-02 16:55:58 +0400557 }
558 }
559 }
Jakub Josefa63f9862018-01-11 17:58:38 +0100560}