blob: df9bfd132846d4b8d999973c568863c55617fa98 [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 Broulik0d111e92018-04-25 21:30:42 +020019def getNodeProvider(pepperEnv, name) {
20 def salt = new com.mirantis.mk.Salt()
21 def kvm = salt.getKvmMinionId(pepperEnv)
22 return salt.getReturnValues(salt.getPillar(pepperEnv, "${kvm}", "salt:control:cluster:internal:node:${name}:provider"))
23}
24
Jiri Brouliked3a9e62018-02-13 16:08:40 +010025def stopServices(pepperEnv, probe, target, type) {
26 def openstack = new com.mirantis.mk.Openstack()
27 def services = []
28 if (type == 'prx') {
29 services.add('keepalived')
30 services.add('nginx')
31 } else if (type == 'ctl') {
32 services.add('keepalived')
33 services.add('haproxy')
34 services.add('nova')
35 services.add('cinder')
36 services.add('glance')
37 services.add('heat')
38 services.add('neutron')
39 services.add('apache2')
40 }
41 openstack.stopServices(pepperEnv, probe, target, services)
42}
43
44def retryStateRun(pepperEnv, target, state) {
45 def common = new com.mirantis.mk.Common()
46 def salt = new com.mirantis.mk.Salt()
47 try {
48 salt.enforceState(pepperEnv, target, state)
49 } catch (Exception e) {
50 common.warningMsg("running ${state} state again")
51 salt.enforceState(pepperEnv, target, state)
52 }
53}
54
55def stateRun(pepperEnv, target, state) {
56 def common = new com.mirantis.mk.Common()
57 def salt = new com.mirantis.mk.Salt()
58 try {
59 salt.enforceState(pepperEnv, target, state)
60 } catch (Exception e) {
61 common.warningMsg("Some parts of ${state} state failed. We should continue to run.")
62 }
63}
64
65
66def vcpTestUpgrade(pepperEnv) {
67 def common = new com.mirantis.mk.Common()
68 def salt = new com.mirantis.mk.Salt()
69 def test_upgrade_node = "upg01"
70 salt.runSaltProcessStep(pepperEnv, 'I@salt:master', 'saltutil.refresh_pillar', [], null, true, 2)
71
72 stateRun(pepperEnv, 'I@salt:master', 'linux.system.repo')
73 stateRun(pepperEnv, 'I@salt:master', 'salt.master')
74 stateRun(pepperEnv, 'I@salt:master', 'reclass')
75 stateRun(pepperEnv, 'I@salt:master', 'linux.system.repo')
76
77 try {
78 salt.runSaltProcessStep(pepperEnv, '*', 'saltutil.refresh_pillar', [], null, true, 2)
79 } catch (Exception e) {
80 common.warningMsg("No response from some minions. We should continue to run")
81 }
82
83 try {
84 salt.runSaltProcessStep(pepperEnv, '*', 'saltutil.sync_all', [], null, true, 2)
85 } catch (Exception e) {
86 common.warningMsg("No response from some minions. We should continue to run")
87 }
88
89 def domain = salt.getDomainName(pepperEnv)
90
91 def backupninja_backup_host = salt.getReturnValues(salt.getPillar(pepperEnv, '( I@galera:master or I@galera:slave ) and I@backupninja:client', '_param:backupninja_backup_host'))
92
93 if (SKIP_VM_RELAUNCH.toBoolean() == false) {
94
Jiri Broulik0d111e92018-04-25 21:30:42 +020095 def upgNodeProvider = getNodeProvider(pepperEnv, test_upgrade_node)
Jiri Brouliked3a9e62018-02-13 16:08:40 +010096
97 salt.runSaltProcessStep(pepperEnv, "${upgNodeProvider}", 'virt.destroy', ["${test_upgrade_node}.${domain}"])
98 salt.runSaltProcessStep(pepperEnv, "${upgNodeProvider}", 'virt.undefine', ["${test_upgrade_node}.${domain}"])
99
100 try {
101 salt.cmdRun(pepperEnv, 'I@salt:master', "salt-key -d ${test_upgrade_node}.${domain} -y")
102 } catch (Exception e) {
103 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")
104 }
105
106 // salt 'kvm02*' state.sls salt.control
107 salt.enforceState(pepperEnv, "${upgNodeProvider}", 'salt.control')
108 // wait until upg node is registered in salt-key
109 salt.minionPresent(pepperEnv, 'I@salt:master', test_upgrade_node)
110 // salt '*' saltutil.refresh_pillar
111 salt.runSaltProcessStep(pepperEnv, "${test_upgrade_node}*", 'saltutil.refresh_pillar', [])
112 // salt '*' saltutil.sync_all
113 salt.runSaltProcessStep(pepperEnv, "${test_upgrade_node}*", 'saltutil.sync_all', [])
114 }
115
Jiri Broulik827d0112018-04-25 16:00:07 +0200116 stateRun(pepperEnv, "${test_upgrade_node}*", ['linux.network.proxy'])
117 try {
118 salt.runSaltProcessStep(pepperEnv, "${test_upgrade_node}*", 'state.sls', ["salt.minion.base"], null, true, 60)
119 } catch (Exception e) {
120 common.warningMsg(e)
121 }
122
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100123 stateRun(pepperEnv, "${test_upgrade_node}*", ['linux', 'openssh'])
124
125 try {
Jiri Broulik827d0112018-04-25 16:00:07 +0200126 salt.runSaltProcessStep(pepperEnv, "${test_upgrade_node}*", 'state.sls', ["salt.minion"], null, true, 60)
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100127 } catch (Exception e) {
128 common.warningMsg(e)
129 }
130 stateRun(pepperEnv, "${test_upgrade_node}*", ['ntp', 'rsyslog'])
131 salt.enforceState(pepperEnv, "${test_upgrade_node}*", ['linux', 'openssh', 'salt.minion', 'ntp', 'rsyslog'])
132 salt.enforceState(pepperEnv, "${test_upgrade_node}*", ['rabbitmq', 'memcached'])
133 try {
134 salt.enforceState(pepperEnv, '( I@galera:master or I@galera:slave ) and I@backupninja:client', ['openssh.client', 'salt.minion'])
135 } catch (Exception e) {
136 common.warningMsg('salt-minion was restarted. We should continue to run')
137 }
138 try {
139 salt.enforceState(pepperEnv, 'I@backupninja:server', ['salt.minion'])
140 } catch (Exception e) {
141 common.warningMsg('salt-minion was restarted. We should continue to run')
142 }
143 // salt '*' state.apply salt.minion.grains
144 //salt.enforceState(pepperEnv, '*', 'salt.minion.grains')
145 // salt -C 'I@backupninja:server' state.sls backupninja
146 salt.enforceState(pepperEnv, 'I@backupninja:server', 'backupninja')
147 salt.enforceState(pepperEnv, '( I@galera:master or I@galera:slave ) and I@backupninja:client', 'backupninja')
148 salt.runSaltProcessStep(pepperEnv, '( I@galera:master or I@galera:slave ) and I@backupninja:client', 'ssh.rm_known_host', ["root", "${backupninja_backup_host}"])
149 try {
150 salt.cmdRun(pepperEnv, '( I@galera:master or I@galera:slave ) and I@backupninja:client', "arp -d ${backupninja_backup_host}")
151 } catch (Exception e) {
152 common.warningMsg('The ARP entry does not exist. We should continue to run.')
153 }
154 salt.runSaltProcessStep(pepperEnv, '( I@galera:master or I@galera:slave ) and I@backupninja:client', 'ssh.set_known_host', ["root", "${backupninja_backup_host}"])
155 salt.cmdRun(pepperEnv, '( I@galera:master or I@galera:slave ) and I@backupninja:client', 'backupninja -n --run /etc/backup.d/101.mysql')
156 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')
157
158 salt.enforceState(pepperEnv, 'I@xtrabackup:server', 'xtrabackup')
159 salt.enforceState(pepperEnv, 'I@xtrabackup:client', 'openssh.client')
160 salt.cmdRun(pepperEnv, 'I@xtrabackup:client', "su root -c 'salt-call state.sls xtrabackup'")
Jiri Broulik60dcab32018-03-08 17:42:06 +0100161 salt.cmdRun(pepperEnv, 'I@xtrabackup:client', "su root -c '/usr/local/bin/innobackupex-runner.sh -f -s'")
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100162
163 def databases = salt.cmdRun(pepperEnv, 'I@mysql:client','salt-call mysql.db_list | grep upgrade | awk \'/-/ {print \$2}\'')
164 if(databases && databases != ""){
165 def databasesList = salt.getReturnValues(databases).trim().tokenize("\n")
166 for( i = 0; i < databasesList.size(); i++){
167 if(databasesList[i].toLowerCase().contains('upgrade')){
168 salt.runSaltProcessStep(pepperEnv, 'I@mysql:client', 'mysql.db_remove', ["${databasesList[i]}"])
169 common.warningMsg("removing database ${databasesList[i]}")
170 salt.runSaltProcessStep(pepperEnv, 'I@mysql:client', 'file.remove', ["/root/mysql/flags/${databasesList[i]}-installed"])
171 }
172 }
173 salt.enforceState(pepperEnv, 'I@mysql:client', 'mysql.client')
174 }else{
175 common.errorMsg("No _upgrade databases were returned")
176 }
177
178 try {
179 salt.enforceState(pepperEnv, "${test_upgrade_node}*", 'keystone.server')
180 salt.runSaltProcessStep(pepperEnv, "${test_upgrade_node}*", 'service.restart', ['apache2'])
181 } catch (Exception e) {
182 common.warningMsg('Restarting Apache2')
183 salt.runSaltProcessStep(pepperEnv, "${test_upgrade_node}*", 'service.restart', ['apache2'])
184 }
185 retryStateRun(pepperEnv, "${test_upgrade_node}*", 'keystone.client')
186 retryStateRun(pepperEnv, "${test_upgrade_node}*", 'glance')
187 salt.enforceState(pepperEnv, "${test_upgrade_node}*", 'keystone.server')
188
189 retryStateRun(pepperEnv, "${test_upgrade_node}*", 'nova')
190 retryStateRun(pepperEnv, "${test_upgrade_node}*", 'nova') // run nova state again as sometimes nova does not enforce itself for some reason
191 retryStateRun(pepperEnv, "${test_upgrade_node}*", 'cinder')
192 retryStateRun(pepperEnv, "${test_upgrade_node}*", 'neutron')
193 retryStateRun(pepperEnv, "${test_upgrade_node}*", 'heat')
194
195 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')
196
197 if (STAGE_TEST_UPGRADE.toBoolean() == true && STAGE_REAL_UPGRADE.toBoolean() == true) {
198 stage('Ask for manual confirmation') {
199 input message: "Do you want to continue with upgrade?"
200 }
201 }
202}
203
204
205def vcpRealUpgrade(pepperEnv) {
206 def common = new com.mirantis.mk.Common()
207 def salt = new com.mirantis.mk.Salt()
208 def openstack = new com.mirantis.mk.Openstack()
209 def virsh = new com.mirantis.mk.Virsh()
210
211 def upgrade_target = []
212 upgrade_target.add('I@horizon:server')
213 upgrade_target.add('I@keystone:server and not upg*')
214
215 def proxy_general_target = "I@horizon:server"
216 def control_general_target = "I@keystone:server and not upg*"
217 def upgrade_general_target = "( I@keystone:server and not upg* ) or I@horizon:server"
218
219 def snapshotName = "upgradeSnapshot1"
220
221 def domain = salt.getDomainName(pepperEnv)
222 def errorOccured = false
223
224 for (tgt in upgrade_target) {
225 def target_hosts = salt.getMinionsSorted(pepperEnv, "${tgt}")
226 def node = salt.getFirstMinion(pepperEnv, "${tgt}")
227 def general_target = ""
228
229 if (tgt.toString().contains('horizon:server')) {
230 general_target = 'prx'
231 } else if (tgt.toString().contains('keystone:server')) {
232 general_target = 'ctl'
233 }
234
235 if (OPERATING_SYSTEM_RELEASE_UPGRADE.toBoolean() == false) {
236 stopServices(pepperEnv, node, tgt, general_target)
237 }
238
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100239 for (t in target_hosts) {
240 def target = salt.stripDomainName(t)
Jiri Broulikcaf721e2018-04-25 17:16:50 +0200241 def nodeProvider = salt.getNodeProvider(pepperEnv, t)
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100242 if ((OPERATING_SYSTEM_RELEASE_UPGRADE.toBoolean() == true) && (SKIP_VM_RELAUNCH.toBoolean() == false)) {
243 salt.runSaltProcessStep(pepperEnv, "${nodeProvider}", 'virt.destroy', ["${target}.${domain}"])
244 sleep(2)
245 try {
246 salt.cmdRun(pepperEnv, "${nodeProvider}", "[ ! -f /root/${target}.${domain}.qcow2.bak ] && cp /var/lib/libvirt/images/${target}.${domain}/system.qcow2 ./${target}.${domain}.qcow2.bak")
247 } catch (Exception e) {
248 common.warningMsg('File already exists')
249 }
250 salt.runSaltProcessStep(pepperEnv, "${nodeProvider}", 'virt.undefine', ["${target}.${domain}"])
251 try {
252 salt.cmdRun(pepperEnv, 'I@salt:master', "salt-key -d ${target}.${domain} -y")
253 } catch (Exception e) {
254 common.warningMsg('does not match any accepted, unaccepted or rejected keys. They were probably already removed. We should continue to run')
255 }
256 } else if (OPERATING_SYSTEM_RELEASE_UPGRADE.toBoolean() == false) {
257 virsh.liveSnapshotPresent(pepperEnv, nodeProvider, target, snapshotName)
258 }
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100259 }
260 }
261
262 if ((OPERATING_SYSTEM_RELEASE_UPGRADE.toBoolean() == true) && (SKIP_VM_RELAUNCH.toBoolean() == false)) {
Jiri Broulik60dcab32018-03-08 17:42:06 +0100263 salt.cmdRun(pepperEnv, 'I@xtrabackup:client', "su root -c '/usr/local/bin/innobackupex-runner.sh -f -s'")
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100264
265 salt.enforceState(pepperEnv, 'I@salt:control', 'salt.control')
266
267 for (tgt in upgrade_target) {
268 salt.minionsPresent(pepperEnv, 'I@salt:master', tgt)
269 }
270 }
271
272 // salt '*' saltutil.refresh_pillar
273 salt.runSaltProcessStep(pepperEnv, upgrade_general_target, 'saltutil.refresh_pillar', [])
274 // salt '*' saltutil.sync_all
275 salt.runSaltProcessStep(pepperEnv, upgrade_general_target, 'saltutil.sync_all', [])
276
Jiri Broulik827d0112018-04-25 16:00:07 +0200277 stateRun(pepperEnv, upgrade_general_target, ['linux.network.proxy'])
278 try {
279 salt.runSaltProcessStep(pepperEnv, upgrade_general_target, 'state.sls', ["salt.minion.base"], null, true, 60)
280 } catch (Exception e) {
281 common.warningMsg(e)
282 }
283
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100284 if (OPERATING_SYSTEM_RELEASE_UPGRADE.toBoolean() == false) {
285
286 try {
287 salt.enforceState(pepperEnv, upgrade_general_target, ['linux.system.repo'])
288 } catch (Exception e) {
289 common.warningMsg(e)
290 }
291
292 salt.runSaltProcessStep(pepperEnv, upgrade_general_target, 'pkg.install', ['salt-minion'], null, true, 5)
293 salt.minionsReachable(pepperEnv, 'I@salt:master', upgrade_general_target)
294
295 // Apply package upgrades
296 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;'
297 common.warningMsg("Running apt dist-upgrade on ${proxy_general_target} and ${control_general_target}, this might take a while...")
298 out = salt.runSaltProcessStep(pepperEnv, upgrade_general_target, 'cmd.run', [args])
299 // stop services again
300 def proxy_node = salt.getFirstMinion(pepperEnv, proxy_general_target)
301 def control_node = salt.getFirstMinion(pepperEnv, control_general_target)
302 stopServices(pepperEnv, proxy_node, proxy_general_target, 'prx')
303 stopServices(pepperEnv, control_node, control_general_target, 'ctl')
304 salt.printSaltCommandResult(out)
305 if (out.toString().contains("dpkg returned an error code")) {
306 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."
307 }
308 // run base states
309 try {
310 salt.enforceState(pepperEnv, upgrade_general_target, ['linux', 'openssh', 'salt.minion', 'ntp', 'rsyslog'])
311 } catch (Exception e) {
312 common.warningMsg(e)
313 }
314 salt.enforceState(pepperEnv, control_general_target, ['keepalived', 'haproxy'])
315 } else {
316 // initial VM setup
317 try {
318 salt.enforceState(pepperEnv, upgrade_general_target, ['linux', 'openssh'])
319 } catch (Exception e) {
320 common.warningMsg(e)
321 }
322 try {
Jiri Broulik827d0112018-04-25 16:00:07 +0200323 salt.runSaltProcessStep(pepperEnv, upgrade_general_target, 'state.sls', ["salt.minion"], null, true, 60)
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100324 } catch (Exception e) {
325 common.warningMsg(e)
326 }
327 try {
328 salt.enforceState(pepperEnv, upgrade_general_target, ['ntp', 'rsyslog'])
329 } catch (Exception e) {
330 common.warningMsg(e)
331 }
332 salt.enforceState(pepperEnv, upgrade_general_target, ['linux', 'openssh', 'salt.minion', 'ntp', 'rsyslog'])
333 salt.enforceState(pepperEnv, control_general_target, ['keepalived', 'haproxy'])
334 salt.runSaltProcessStep(pepperEnv, control_general_target, 'service.restart', ['rsyslog'])
335 }
336
337 try {
338 try {
339 salt.enforceState(pepperEnv, control_general_target, ['memcached', 'keystone.server'])
340 salt.runSaltProcessStep(pepperEnv, control_general_target, 'service.restart', ['apache2'])
341 } catch (Exception e) {
342 common.warningMsg('Restarting Apache2 and enforcing keystone.server state again')
343 salt.runSaltProcessStep(pepperEnv, control_general_target, 'service.restart', ['apache2'])
344 salt.enforceState(pepperEnv, control_general_target, 'keystone.server')
345 }
346 // salt 'ctl01*' state.sls keystone.client
347 retryStateRun(pepperEnv, "I@keystone:client and ${control_general_target}", 'keystone.client')
348 retryStateRun(pepperEnv, control_general_target, 'glance')
349 salt.enforceState(pepperEnv, control_general_target, 'glusterfs.client')
350 salt.enforceState(pepperEnv, control_general_target, 'keystone.server')
351 retryStateRun(pepperEnv, control_general_target, 'nova')
352 retryStateRun(pepperEnv, control_general_target, 'cinder')
353 retryStateRun(pepperEnv, control_general_target, 'neutron')
354 retryStateRun(pepperEnv, control_general_target, 'heat')
355 } catch (Exception e) {
356 errorOccured = true
357 if (OPERATING_SYSTEM_RELEASE_UPGRADE.toBoolean() == false) {
358 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."
359 } else {
360 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."
361 }
362 openstack.restoreGaleraDb(pepperEnv)
363 common.errorMsg("Stage Real control upgrade failed")
364 }
365 if(!errorOccured){
366
367 if (OPERATING_SYSTEM_RELEASE_UPGRADE.toBoolean() == true) {
368
369 try {
370 if (salt.testTarget(pepperEnv, "I@ceph:client and ${control_general_target}*")) {
371 salt.enforceState(pepperEnv, "I@ceph:client and ${control_general_target}*", 'ceph.client')
372 }
373 } catch (Exception er) {
374 common.warningMsg("Ceph client state on controllers failed. Please fix it manually")
375 }
376 try {
377 if (salt.testTarget(pepperEnv, "I@ceph:common and ${control_general_target}*")) {
378 salt.enforceState(pepperEnv, "I@ceph:common and ${control_general_target}*", ['ceph.common', 'ceph.setup.keyring'])
379 }
380 } catch (Exception er) {
381 common.warningMsg("Ceph common state on controllers failed. Please fix it manually")
382 }
383 try {
384 if (salt.testTarget(pepperEnv, "I@ceph:common and ${control_general_target}*")) {
385 salt.runSaltProcessStep(master, "I@ceph:common and ${control_general_target}*", 'service.restart', ['glance-api', 'glance-glare', 'glance-registry'])
386 }
387 } catch (Exception er) {
388 common.warningMsg("Restarting Glance services on controllers failed. Please fix it manually")
389 }
390 }
391
392 // salt 'cmp*' cmd.run 'service nova-compute restart'
393 salt.runSaltProcessStep(pepperEnv, 'I@nova:compute', 'service.restart', ['nova-compute'])
394 salt.runSaltProcessStep(pepperEnv, control_general_target, 'service.restart', ['nova-conductor'])
395 salt.runSaltProcessStep(pepperEnv, control_general_target, 'service.restart', ['nova-scheduler'])
396
397 retryStateRun(pepperEnv, proxy_general_target, 'keepalived')
398 retryStateRun(pepperEnv, proxy_general_target, 'horizon')
399 retryStateRun(pepperEnv, proxy_general_target, 'nginx')
400 retryStateRun(pepperEnv, proxy_general_target, 'memcached')
401
402 try {
403 salt.enforceHighstate(pepperEnv, control_general_target)
404 } catch (Exception er) {
405 common.errorMsg("Highstate was executed on controller nodes but something failed. Please check it and fix it accordingly.")
406 }
407
408 try {
409 salt.enforceHighstate(pepperEnv, proxy_general_target)
410 } catch (Exception er) {
411 common.errorMsg("Highstate was executed on proxy nodes but something failed. Please check it and fix it accordingly.")
412 }
413
414 try {
415 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')
416 } catch (Exception er) {
417 common.errorMsg(er)
418 }
419
420 /*
421 if (OPERATING_SYSTEM_RELEASE_UPGRADE.toBoolean() == false) {
422 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"
423 node_count = 1
424 for (t in proxy_target_hosts) {
425 def target = salt.stripDomainName(t)
426 def nodeProvider = salt.getNodeProvider(pepperEnv, "${general_target}0${node_count}")
427 try {
428 salt.cmdRun(pepperEnv, "${nodeProvider}", "[ ! -f /root/${target}.${domain}.qcow2.bak ] && cp /var/lib/libvirt/images/${target}.${domain}/system.qcow2 ./${target}.${domain}.qcow2.bak")
429 } catch (Exception e) {
430 common.warningMsg('File already exists')
431 }
432 virsh.liveSnapshotMerge(pepperEnv, nodeProvider, target, snapshotName)
433 node_count++
434 }
435 node_count = 1
436 for (t in control_target_hosts) {
437 def target = salt.stripDomainName(t)
438 def nodeProvider = salt.getNodeProvider(pepperEnv, "${general_target}0${node_count}")
439 try {
440 salt.cmdRun(pepperEnv, "${nodeProvider}", "[ ! -f /root/${target}.${domain}.qcow2.bak ] && cp /var/lib/libvirt/images/${target}.${domain}/system.qcow2 ./${target}.${domain}.qcow2.bak")
441 } catch (Exception e) {
442 common.warningMsg('File already exists')
443 }
444 virsh.liveSnapshotMerge(pepperEnv, nodeProvider, target, snapshotName)
445 node_count++
446 }
447 input message: "Please scroll up and look for red highlighted messages containing 'virsh blockcommit' string.
448 If there are any fix it manually. Otherwise click on proceed."
449 }
450 */
451 }
452}
453
454
455def vcpRollback(pepperEnv) {
456 def common = new com.mirantis.mk.Common()
457 def salt = new com.mirantis.mk.Salt()
458 def openstack = new com.mirantis.mk.Openstack()
459 def virsh = new com.mirantis.mk.Virsh()
460 def snapshotName = "upgradeSnapshot1"
461 try {
462 salt.runSaltProcessStep(pepperEnv, '*', 'saltutil.refresh_pillar', [], null, true, 2)
463 } catch (Exception e) {
464 common.warningMsg("No response from some minions. We should continue to run")
465 }
466
467 def domain = salt.getDomainName(pepperEnv)
468
469 def rollback_target = []
470 rollback_target.add('I@horizon:server')
471 rollback_target.add('I@keystone:server and not upg*')
472
473 def control_general_target = "I@keystone:server and not upg*"
474 def upgrade_general_target = "( I@keystone:server and not upg* ) or I@horizon:server"
475
476 openstack.restoreGaleraDb(pepperEnv)
477
478 for (tgt in rollback_target) {
479 def target_hosts = salt.getMinionsSorted(pepperEnv, "${tgt}")
480 def node = salt.getFirstMinion(pepperEnv, "${tgt}")
481 def general_target = salt.getMinionsGeneralName(pepperEnv, "${tgt}")
482
483 if (tgt.toString().contains('horizon:server')) {
484 general_target = 'prx'
485 } else if (tgt.toString().contains('keystone:server')) {
486 general_target = 'ctl'
487 }
488
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100489 for (t in target_hosts) {
490 def target = salt.stripDomainName(t)
Jiri Broulikcaf721e2018-04-25 17:16:50 +0200491 def nodeProvider = salt.getNodeProvider(pepperEnv, t)
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100492 salt.runSaltProcessStep(pepperEnv, "${nodeProvider}", 'virt.destroy', ["${target}.${domain}"])
493 sleep(2)
494 if (OPERATING_SYSTEM_RELEASE_UPGRADE.toBoolean() == true) {
495 salt.runSaltProcessStep(pepperEnv, "${nodeProvider}", 'file.copy', ["/root/${target}.${domain}.qcow2.bak", "/var/lib/libvirt/images/${target}.${domain}/system.qcow2"])
496 try {
497 salt.cmdRun(pepperEnv, 'I@salt:master', "salt-key -d ${target}.${domain} -y")
498 } catch (Exception e) {
499 common.warningMsg('does not match any accepted, unaccepted or rejected keys. They were probably already removed. We should continue to run')
500 }
501 salt.runSaltProcessStep(pepperEnv, "${nodeProvider}", 'virt.start', ["${target}.${domain}"])
502 } else {
503 salt.cmdRun(pepperEnv, "${nodeProvider}", "virsh define /var/lib/libvirt/images/${target}.${domain}.xml")
504 salt.runSaltProcessStep(pepperEnv, "${nodeProvider}", 'virt.start', ["${target}.${domain}"])
505 virsh.liveSnapshotAbsent(pepperEnv, nodeProvider, target, snapshotName)
506 }
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100507 }
508 }
509
510 // salt 'cmp*' cmd.run 'service nova-compute restart'
511 salt.runSaltProcessStep(pepperEnv, 'I@nova:compute', 'service.restart', ['nova-compute'])
512
513 if (OPERATING_SYSTEM_RELEASE_UPGRADE.toBoolean() == true) {
514 for (tgt in rollback_target) {
515 salt.minionsPresent(pepperEnv, 'I@salt:master', tgt)
516 }
517 }
518
519 salt.minionsReachable(pepperEnv, 'I@salt:master', upgrade_general_target)
520
521 salt.runSaltProcessStep(pepperEnv, control_general_target, 'service.restart', ['nova-conductor'])
522 salt.runSaltProcessStep(pepperEnv, control_general_target, 'service.restart', ['nova-scheduler'])
523
524 def control_node = salt.getFirstMinion(pepperEnv, control_general_target)
525
526 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')
527}
528
529
chnyda625f4b42017-10-11 14:10:31 +0200530def pepperEnv = "pepperEnv"
Jakub Josefa63f9862018-01-11 17:58:38 +0100531timeout(time: 12, unit: 'HOURS') {
532 node() {
Jiri Broulikbb447ac2017-05-04 15:36:22 +0200533
Jakub Josefa63f9862018-01-11 17:58:38 +0100534 stage('Setup virtualenv for Pepper') {
535 python.setupPepperVirtualenv(pepperEnv, SALT_MASTER_URL, SALT_MASTER_CREDENTIALS)
536 }
Jiri Broulikbb447ac2017-05-04 15:36:22 +0200537
Jakub Josefa63f9862018-01-11 17:58:38 +0100538 if (STAGE_TEST_UPGRADE.toBoolean() == true) {
539 stage('Test upgrade') {
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100540 vcpTestUpgrade(pepperEnv)
Ruslan Kamaldinov6feef402017-08-02 16:55:58 +0400541 }
542 }
Ruslan Kamaldinov6feef402017-08-02 16:55:58 +0400543
Jakub Josefa63f9862018-01-11 17:58:38 +0100544 if (STAGE_REAL_UPGRADE.toBoolean() == true) {
545 stage('Real upgrade') {
546 // # actual upgrade
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100547 vcpRealUpgrade(pepperEnv)
Jakub Josefa63f9862018-01-11 17:58:38 +0100548 }
549
550 if (STAGE_REAL_UPGRADE.toBoolean() == true && STAGE_ROLLBACK_UPGRADE.toBoolean() == true) {
551 stage('Ask for manual confirmation') {
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100552 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 +0100553 }
554 }
555 }
556
557 if (STAGE_ROLLBACK_UPGRADE.toBoolean() == true) {
558 stage('Rollback upgrade') {
Jakub Josefa63f9862018-01-11 17:58:38 +0100559 stage('Ask for manual confirmation') {
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100560 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 +0100561 }
Jiri Brouliked3a9e62018-02-13 16:08:40 +0100562 vcpRollback(pepperEnv)
Ruslan Kamaldinov6feef402017-08-02 16:55:58 +0400563 }
564 }
565 }
Jakub Josefa63f9862018-01-11 17:58:38 +0100566}