| Ales Komarek | 1fe5b8f | 2017-03-06 11:07:54 +0100 | [diff] [blame] | 1 | /** | 
| Ales Komarek | 374cc38 | 2017-03-16 08:49:01 +0100 | [diff] [blame] | 2 |  * Update packages on given nodes | 
| Ales Komarek | 1fe5b8f | 2017-03-06 11:07:54 +0100 | [diff] [blame] | 3 |  * | 
 | 4 |  * Expected parameters: | 
| Ales Komarek | 374cc38 | 2017-03-16 08:49:01 +0100 | [diff] [blame] | 5 |  *   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. | 
 | 9 |  *   TARGET_SIZE_TEST           Number of nodes to list package updates, empty string means all targetted nodes. | 
 | 10 |  *   TARGET_SIZE_SAMPLE         Number of selected noded to live apply selected package update. | 
 | 11 |  *   TARGET_SIZE_BATCH          Batch size for the complete live package update on all nodes, empty string means apply to all targetted nodes. | 
| Ales Komarek | 1fe5b8f | 2017-03-06 11:07:54 +0100 | [diff] [blame] | 12 |  * | 
 | 13 | **/ | 
 | 14 |  | 
| Ales Komarek | 1fe5b8f | 2017-03-06 11:07:54 +0100 | [diff] [blame] | 15 | def common = new com.mirantis.mk.Common() | 
 | 16 | def salt = new com.mirantis.mk.Salt() | 
| Ales Komarek | 1fe5b8f | 2017-03-06 11:07:54 +0100 | [diff] [blame] | 17 |  | 
| Ales Komarek | 374cc38 | 2017-03-16 08:49:01 +0100 | [diff] [blame] | 18 | def saltMaster | 
 | 19 | def targetAll = ['expression': TARGET_SERVERS, 'type': 'compound'] | 
 | 20 | def targetTestSubset | 
 | 21 | def targetLiveSubset | 
 | 22 | def targetLiveAll | 
 | 23 | def minions | 
 | 24 | def result | 
 | 25 | def packages | 
| Jakub Josef | f080c14 | 2017-03-16 18:22:18 +0100 | [diff] [blame] | 26 | def command | 
| Filip Pytloun | 43896ed | 2017-03-29 14:23:32 +0200 | [diff] [blame] | 27 | def commandKwargs | 
| Ales Komarek | 374cc38 | 2017-03-16 08:49:01 +0100 | [diff] [blame] | 28 |  | 
 | 29 | node() { | 
 | 30 |     try { | 
 | 31 |  | 
| Ales Komarek | 374cc38 | 2017-03-16 08:49:01 +0100 | [diff] [blame] | 32 |         stage('Connect to Salt master') { | 
 | 33 |             saltMaster = salt.connection(SALT_MASTER_URL, SALT_MASTER_CREDENTIALS) | 
| Ales Komarek | 1fe5b8f | 2017-03-06 11:07:54 +0100 | [diff] [blame] | 34 |         } | 
 | 35 |  | 
| Ales Komarek | 374cc38 | 2017-03-16 08:49:01 +0100 | [diff] [blame] | 36 |         stage('List target servers') { | 
 | 37 |             minions = salt.getMinions(saltMaster, targetAll) | 
| Tomáš Kukrál | d73cef0 | 2017-04-05 15:24:57 +0200 | [diff] [blame] | 38 |  | 
 | 39 |             if (minions.isEmpty()) { | 
 | 40 |                 throw new Exception("No minion was targeted") | 
 | 41 |             } | 
 | 42 |  | 
| Ales Komarek | 374cc38 | 2017-03-16 08:49:01 +0100 | [diff] [blame] | 43 |             if (TARGET_SUBSET_TEST != "") { | 
 | 44 |                 targetTestSubset = minions.subList(0, Integer.valueOf(TARGET_SUBSET_TEST)).join(' or ') | 
| Tomáš Kukrál | d73cef0 | 2017-04-05 15:24:57 +0200 | [diff] [blame] | 45 |             } else { | 
| Ales Komarek | 374cc38 | 2017-03-16 08:49:01 +0100 | [diff] [blame] | 46 |                 targetTestSubset = minions.join(' or ') | 
 | 47 |             } | 
 | 48 |             targetLiveSubset = minions.subList(0, Integer.valueOf(TARGET_SUBSET_LIVE)).join(' or ') | 
| Tomáš Kukrál | d73cef0 | 2017-04-05 15:24:57 +0200 | [diff] [blame] | 49 |  | 
| Ales Komarek | 374cc38 | 2017-03-16 08:49:01 +0100 | [diff] [blame] | 50 |             targetLiveAll = minions.join(' or ') | 
 | 51 |             common.infoMsg("Found nodes: ${targetLiveAll}") | 
 | 52 |             common.infoMsg("Selected test nodes: ${targetTestSubset}") | 
 | 53 |             common.infoMsg("Selected sample nodes: ${targetLiveSubset}") | 
| Ales Komarek | 1fe5b8f | 2017-03-06 11:07:54 +0100 | [diff] [blame] | 54 |         } | 
 | 55 |  | 
| Ales Komarek | 374cc38 | 2017-03-16 08:49:01 +0100 | [diff] [blame] | 56 |         stage("List package upgrades") { | 
 | 57 |             salt.runSaltProcessStep(saltMaster, targetTestSubset, 'pkg.list_upgrades', [], null, true) | 
 | 58 |         } | 
 | 59 |  | 
 | 60 |         stage('Confirm live package upgrades on sample') { | 
| Jakub Josef | 4a01375 | 2017-03-16 17:37:51 +0100 | [diff] [blame] | 61 |             if(TARGET_PACKAGES==""){ | 
 | 62 |                 timeout(time: 2, unit: 'HOURS') { | 
 | 63 |                     def userInput = input( | 
 | 64 |                      id: 'userInput', message: 'Insert package names for update', parameters: [ | 
 | 65 |                      [$class: 'TextParameterDefinition', defaultValue: '', description: 'Package names (or *)', name: 'packages'] | 
 | 66 |                     ]) | 
| Jakub Josef | f080c14 | 2017-03-16 18:22:18 +0100 | [diff] [blame] | 67 |                     if(userInput!= "" && userInput!= "*"){ | 
 | 68 |                         TARGET_PACKAGES = userInput | 
| Jakub Josef | 4a01375 | 2017-03-16 17:37:51 +0100 | [diff] [blame] | 69 |                     } | 
 | 70 |                 } | 
 | 71 |             }else{ | 
 | 72 |                 timeout(time: 2, unit: 'HOURS') { | 
 | 73 |                    input message: "Approve live package upgrades on ${targetLiveSubset} nodes?" | 
 | 74 |                 } | 
| Ales Komarek | 374cc38 | 2017-03-16 08:49:01 +0100 | [diff] [blame] | 75 |             } | 
| Jakub Josef | c5407c4 | 2017-03-16 18:31:10 +0100 | [diff] [blame] | 76 |         } | 
 | 77 |  | 
 | 78 |         if (TARGET_PACKAGES != "") { | 
| Filip Pytloun | 43896ed | 2017-03-29 14:23:32 +0200 | [diff] [blame] | 79 |             command = "pkg.install" | 
| Jakub Josef | c5407c4 | 2017-03-16 18:31:10 +0100 | [diff] [blame] | 80 |             packages = TARGET_PACKAGES.tokenize(' ') | 
| Filip Pytloun | 43896ed | 2017-03-29 14:23:32 +0200 | [diff] [blame] | 81 |             commandKwargs = ['only_upgrade': 'true'] | 
| Jakub Josef | c5407c4 | 2017-03-16 18:31:10 +0100 | [diff] [blame] | 82 |         }else { | 
 | 83 |             command = "pkg.upgrade" | 
 | 84 |             packages = null | 
| Ales Komarek | 374cc38 | 2017-03-16 08:49:01 +0100 | [diff] [blame] | 85 |         } | 
 | 86 |  | 
 | 87 |         stage('Apply package upgrades on sample') { | 
| Filip Pytloun | 43896ed | 2017-03-29 14:23:32 +0200 | [diff] [blame] | 88 |             out = salt.runSaltCommand(saltMaster, 'local', ['expression': targetLiveSubset, 'type': 'compound'], command, null, packages, commandKwargs) | 
 | 89 |             salt.printSaltCommandResult(out) | 
| Ales Komarek | 374cc38 | 2017-03-16 08:49:01 +0100 | [diff] [blame] | 90 |         } | 
 | 91 |  | 
 | 92 |         stage('Confirm package upgrades on all nodes') { | 
 | 93 |             timeout(time: 2, unit: 'HOURS') { | 
 | 94 |                input message: "Approve live package upgrades on ${targetLiveAll} nodes?" | 
 | 95 |             } | 
 | 96 |         } | 
 | 97 |  | 
 | 98 |         stage('Apply package upgrades on all nodes') { | 
| Filip Pytloun | 43896ed | 2017-03-29 14:23:32 +0200 | [diff] [blame] | 99 |             out = salt.runSaltCommand(saltMaster, 'local', ['expression': targetLiveAll, 'type': 'compound'], command, null, packages, commandKwargs) | 
 | 100 |             salt.printSaltCommandResult(out) | 
| Ales Komarek | 374cc38 | 2017-03-16 08:49:01 +0100 | [diff] [blame] | 101 |         } | 
 | 102 |  | 
 | 103 |     } catch (Throwable e) { | 
 | 104 |         // If there was an error or exception thrown, the build failed | 
 | 105 |         currentBuild.result = "FAILURE" | 
 | 106 |         throw e | 
| Ales Komarek | 1fe5b8f | 2017-03-06 11:07:54 +0100 | [diff] [blame] | 107 |     } | 
 | 108 | } |