blob: 20e6541e4b4f05d14b61f58c63d038695cf2eec3 [file] [log] [blame]
Ales Komarek1fe5b8f2017-03-06 11:07:54 +01001/**
Ales Komarek374cc382017-03-16 08:49:01 +01002 * Update packages on given nodes
Ales Komarek1fe5b8f2017-03-06 11:07:54 +01003 *
4 * Expected parameters:
Ales Komarek374cc382017-03-16 08:49:01 +01005 * SALT_MASTER_CREDENTIALS Credentials to the Salt API.
6 * SALT_MASTER_URL Full Salt API address [https://10.10.10.1:8000].
7 * TARGET_SERVERS Salt compound target to match nodes to be updated [*, G@osfamily:debian].
8 * TARGET_PACKAGES Space delimited list of packages to be updates [package1=version package2=version], empty string means all updating all packages to the latest version.
Jiri Broulik9b73d6c2017-06-02 12:27:05 +02009 * TARGET_SUBSET_TEST Number of nodes to list package updates, empty string means all targetted nodes.
10 * TARGET_SUBSET_LIVE Number of selected nodes to live apply selected package update.
11 * TARGET_BATCH_LIVE Batch size for the complete live package update on all nodes, empty string means apply to all targetted nodes.
Ales Komarek1fe5b8f2017-03-06 11:07:54 +010012 *
13**/
14
Ales Komarek1fe5b8f2017-03-06 11:07:54 +010015def common = new com.mirantis.mk.Common()
16def salt = new com.mirantis.mk.Salt()
Ales Komarek1fe5b8f2017-03-06 11:07:54 +010017
Ales Komarek374cc382017-03-16 08:49:01 +010018def saltMaster
Ales Komarek374cc382017-03-16 08:49:01 +010019def targetTestSubset
20def targetLiveSubset
21def targetLiveAll
22def minions
23def result
24def packages
Jakub Joseff080c142017-03-16 18:22:18 +010025def command
Filip Pytloun43896ed2017-03-29 14:23:32 +020026def commandKwargs
Ales Komarek374cc382017-03-16 08:49:01 +010027
28node() {
29 try {
30
Ales Komarek374cc382017-03-16 08:49:01 +010031 stage('Connect to Salt master') {
32 saltMaster = salt.connection(SALT_MASTER_URL, SALT_MASTER_CREDENTIALS)
Ales Komarek1fe5b8f2017-03-06 11:07:54 +010033 }
34
Ales Komarek374cc382017-03-16 08:49:01 +010035 stage('List target servers') {
Tomáš Kukrálc86c8b42017-07-13 10:26:51 +020036 minions = salt.getMinions(saltMaster, TARGET_SERVERS)
Tomáš Kukráld73cef02017-04-05 15:24:57 +020037
38 if (minions.isEmpty()) {
39 throw new Exception("No minion was targeted")
40 }
41
Ales Komarek374cc382017-03-16 08:49:01 +010042 if (TARGET_SUBSET_TEST != "") {
43 targetTestSubset = minions.subList(0, Integer.valueOf(TARGET_SUBSET_TEST)).join(' or ')
Tomáš Kukráld73cef02017-04-05 15:24:57 +020044 } else {
Ales Komarek374cc382017-03-16 08:49:01 +010045 targetTestSubset = minions.join(' or ')
46 }
47 targetLiveSubset = minions.subList(0, Integer.valueOf(TARGET_SUBSET_LIVE)).join(' or ')
Tomáš Kukráld73cef02017-04-05 15:24:57 +020048
Ales Komarek374cc382017-03-16 08:49:01 +010049 targetLiveAll = minions.join(' or ')
50 common.infoMsg("Found nodes: ${targetLiveAll}")
51 common.infoMsg("Selected test nodes: ${targetTestSubset}")
52 common.infoMsg("Selected sample nodes: ${targetLiveSubset}")
Ales Komarek1fe5b8f2017-03-06 11:07:54 +010053 }
54
Ales Komarek374cc382017-03-16 08:49:01 +010055 stage("List package upgrades") {
Sam Stoelingaf52a0422017-08-01 12:26:21 -070056 common.infoMsg("Listing all the packages that have a new update available on test nodes: ${targetTestSubset}")
Ales Komarek374cc382017-03-16 08:49:01 +010057 salt.runSaltProcessStep(saltMaster, targetTestSubset, 'pkg.list_upgrades', [], null, true)
Sam Stoelingaf52a0422017-08-01 12:26:21 -070058 if(TARGET_PACKAGES != "" && TARGET_PACKAGES != "*"){
59 common.infoMsg("Note that only the ${TARGET_PACKAGES} would be installed from the above list of available updates on the ${targetTestSubset}")
60 }
Ales Komarek374cc382017-03-16 08:49:01 +010061 }
62
63 stage('Confirm live package upgrades on sample') {
Jakub Josef4a013752017-03-16 17:37:51 +010064 if(TARGET_PACKAGES==""){
65 timeout(time: 2, unit: 'HOURS') {
66 def userInput = input(
67 id: 'userInput', message: 'Insert package names for update', parameters: [
68 [$class: 'TextParameterDefinition', defaultValue: '', description: 'Package names (or *)', name: 'packages']
69 ])
Jakub Joseff080c142017-03-16 18:22:18 +010070 if(userInput!= "" && userInput!= "*"){
71 TARGET_PACKAGES = userInput
Jakub Josef4a013752017-03-16 17:37:51 +010072 }
73 }
74 }else{
75 timeout(time: 2, unit: 'HOURS') {
76 input message: "Approve live package upgrades on ${targetLiveSubset} nodes?"
77 }
Ales Komarek374cc382017-03-16 08:49:01 +010078 }
Jakub Josefc5407c42017-03-16 18:31:10 +010079 }
80
81 if (TARGET_PACKAGES != "") {
Filip Pytloun43896ed2017-03-29 14:23:32 +020082 command = "pkg.install"
Jakub Josefc5407c42017-03-16 18:31:10 +010083 packages = TARGET_PACKAGES.tokenize(' ')
Filip Pytloun43896ed2017-03-29 14:23:32 +020084 commandKwargs = ['only_upgrade': 'true']
Jakub Josefc5407c42017-03-16 18:31:10 +010085 }else {
86 command = "pkg.upgrade"
87 packages = null
Ales Komarek374cc382017-03-16 08:49:01 +010088 }
89
90 stage('Apply package upgrades on sample') {
Filip Pytloun43896ed2017-03-29 14:23:32 +020091 out = salt.runSaltCommand(saltMaster, 'local', ['expression': targetLiveSubset, 'type': 'compound'], command, null, packages, commandKwargs)
92 salt.printSaltCommandResult(out)
Ales Komarek374cc382017-03-16 08:49:01 +010093 }
94
95 stage('Confirm package upgrades on all nodes') {
96 timeout(time: 2, unit: 'HOURS') {
97 input message: "Approve live package upgrades on ${targetLiveAll} nodes?"
98 }
99 }
100
101 stage('Apply package upgrades on all nodes') {
Filip Pytloun43896ed2017-03-29 14:23:32 +0200102 out = salt.runSaltCommand(saltMaster, 'local', ['expression': targetLiveAll, 'type': 'compound'], command, null, packages, commandKwargs)
103 salt.printSaltCommandResult(out)
Ales Komarek374cc382017-03-16 08:49:01 +0100104 }
105
106 } catch (Throwable e) {
107 // If there was an error or exception thrown, the build failed
108 currentBuild.result = "FAILURE"
109 throw e
Ales Komarek1fe5b8f2017-03-06 11:07:54 +0100110 }
111}