vitalygusev | 2270137 | 2018-09-25 17:27:35 +0400 | [diff] [blame] | 1 | /** |
| 2 | * |
| 3 | * Upgrade Stacklight packages and components |
| 4 | * |
| 5 | * Requred parameters: |
| 6 | * SALT_MASTER_URL URL of Salt master |
| 7 | * SALT_MASTER_CREDENTIALS Credentials to the Salt API |
| 8 | * |
| 9 | * STAGE_UPGRADE_SYSTEM_PART Set to True if upgrade of system part (telegraf, fluentd, prometheus-relay) is desired |
| 10 | * STAGE_UPGRADE_ES_KIBANA Set to True if Elasticsearch and Kibana upgrade is desired |
| 11 | * STAGE_UPGRADE_DOCKER_COMPONENTS Set to True if upgrade for components running in Docker Swarm is desired |
| 12 | * |
| 13 | */ |
| 14 | |
vitalygusev | 4b331fa | 2018-12-04 19:03:47 +0400 | [diff] [blame] | 15 | common = new com.mirantis.mk.Common() |
| 16 | salt = new com.mirantis.mk.Salt() |
| 17 | python = new com.mirantis.mk.Python() |
| 18 | command = 'cmd.run' |
| 19 | pepperEnv = "pepperEnv" |
| 20 | errorOccured = false |
vitalygusev | 2270137 | 2018-09-25 17:27:35 +0400 | [diff] [blame] | 21 | |
| 22 | def upgrade(master, target, service, pckg, state) { |
vitalygusev | 4b331fa | 2018-12-04 19:03:47 +0400 | [diff] [blame] | 23 | stage("Upgrade ${service}") { |
vitalygusev | 25872e1 | 2018-12-14 18:45:29 +0400 | [diff] [blame^] | 24 | salt.runSaltProcessStep(master, "${target}", 'saltutil.refresh_pillar', [], null, true) |
vitalygusev | 2270137 | 2018-09-25 17:27:35 +0400 | [diff] [blame] | 25 | salt.enforceState(master, "${target}", 'linux.system.repo', true) |
vitalygusev | 25872e1 | 2018-12-14 18:45:29 +0400 | [diff] [blame^] | 26 | common.infoMsg("Upgrade ${service} package(s)") |
vitalygusev | 2270137 | 2018-09-25 17:27:35 +0400 | [diff] [blame] | 27 | try { |
vitalygusev | 25872e1 | 2018-12-14 18:45:29 +0400 | [diff] [blame^] | 28 | salt.runSaltProcessStep(master, "${target}", command, ["apt-get install -y -o Dpkg::Options::=\"--force-confold\" ${pckg}"], null, true) |
vitalygusev | 2270137 | 2018-09-25 17:27:35 +0400 | [diff] [blame] | 29 | } catch (Exception er) { |
| 30 | errorOccured = true |
vitalygusev | 25872e1 | 2018-12-14 18:45:29 +0400 | [diff] [blame^] | 31 | common.errorMsg("[ERROR] ${pckg} package(s) was not upgraded.") |
| 32 | throw er |
vitalygusev | 2270137 | 2018-09-25 17:27:35 +0400 | [diff] [blame] | 33 | } |
vitalygusev | 4b331fa | 2018-12-04 19:03:47 +0400 | [diff] [blame] | 34 | common.infoMsg("Run ${state} state on ${target} nodes") |
vitalygusev | 2270137 | 2018-09-25 17:27:35 +0400 | [diff] [blame] | 35 | try { |
vitalygusev | 2532889 | 2018-10-17 11:40:27 +0400 | [diff] [blame] | 36 | salt.enforceState(master, "${target}", ["${state}"], true) |
vitalygusev | 2270137 | 2018-09-25 17:27:35 +0400 | [diff] [blame] | 37 | } catch (Exception er) { |
| 38 | errorOccured = true |
vitalygusev | 4b331fa | 2018-12-04 19:03:47 +0400 | [diff] [blame] | 39 | common.errorMsg("[ERROR] ${state} state was executed and failed. Please fix it manually.") |
vitalygusev | 25872e1 | 2018-12-14 18:45:29 +0400 | [diff] [blame^] | 40 | throw er |
vitalygusev | 2270137 | 2018-09-25 17:27:35 +0400 | [diff] [blame] | 41 | } |
vitalygusev | 25872e1 | 2018-12-14 18:45:29 +0400 | [diff] [blame^] | 42 | common.infoMsg("Check ${service} service(s) status on the target nodes") |
| 43 | for (s in service.split(" ")){ |
| 44 | salt.runSaltProcessStep(master, "${target}", "service.status", "${s}", null, true) |
| 45 | } |
| 46 | } |
| 47 | } |
| 48 | |
| 49 | def verify_es_is_green(master) { |
| 50 | common.infoMsg('Verify that the Elasticsearch cluster status is green') |
| 51 | try { |
| 52 | def retries_wait = 20 |
| 53 | def retries = 15 |
| 54 | def elasticsearch_vip |
| 55 | def pillar = salt.getPillar(master, "I@elasticsearch:client", 'elasticsearch:client:server:host') |
| 56 | if(!pillar['return'].isEmpty()) { |
| 57 | elasticsearch_vip = pillar['return'][0].values()[0] |
| 58 | } else { |
| 59 | errorOccured = true |
| 60 | common.errorMsg('[ERROR] Elasticsearch VIP address could not be retrieved') |
| 61 | } |
| 62 | pillar = salt.getPillar(master, "I@elasticsearch:client", 'elasticsearch:client:server:port') |
| 63 | def elasticsearch_port |
| 64 | if(!pillar['return'].isEmpty()) { |
| 65 | elasticsearch_port = pillar['return'][0].values()[0] |
| 66 | } else { |
| 67 | errorOccured = true |
| 68 | common.errorMsg('[ERROR] Elasticsearch VIP port could not be retrieved') |
| 69 | } |
| 70 | common.retry(retries,retries_wait) { |
| 71 | common.infoMsg('Waiting for Elasticsearch to become green..') |
| 72 | salt.cmdRun(master, "I@elasticsearch:client", "curl -sf ${elasticsearch_vip}:${elasticsearch_port}/_cat/health | awk '{print \$4}' | grep green") |
| 73 | } |
| 74 | } catch (Exception er) { |
| 75 | errorOccured = true |
| 76 | common.errorMsg("[ERROR] Elasticsearch cluster status is not \'green\'. Please fix it manually.") |
| 77 | throw er |
vitalygusev | 2270137 | 2018-09-25 17:27:35 +0400 | [diff] [blame] | 78 | } |
vitalygusev | 2270137 | 2018-09-25 17:27:35 +0400 | [diff] [blame] | 79 | } |
| 80 | |
| 81 | def upgrade_es_kibana(master) { |
vitalygusev | 25872e1 | 2018-12-14 18:45:29 +0400 | [diff] [blame^] | 82 | def elasticsearch_version |
| 83 | def es_pillar = salt.getPillar(master, "I@elasticsearch:client", '_param:elasticsearch_version') |
| 84 | if(!es_pillar['return'].isEmpty()) { |
| 85 | elasticsearch_version = es_pillar['return'][0].values()[0] |
| 86 | } |
vitalygusev | 4b331fa | 2018-12-04 19:03:47 +0400 | [diff] [blame] | 87 | stage('Upgrade elasticsearch') { |
vitalygusev | 25872e1 | 2018-12-14 18:45:29 +0400 | [diff] [blame^] | 88 | if (elasticsearch_version == '5') { |
| 89 | try { |
| 90 | common.infoMsg('Upgrade the Elasticsearch package') |
| 91 | salt.runSaltProcessStep(master, 'I@elasticsearch:server', command, ["systemctl stop elasticsearch"], null, true) |
| 92 | salt.runSaltProcessStep(master, 'I@elasticsearch:server', command, ["apt-get --only-upgrade install elasticsearch"], null, true) |
| 93 | salt.runSaltProcessStep(master, 'I@elasticsearch:server', command, ["systemctl daemon-reload"], null, true) |
| 94 | salt.runSaltProcessStep(master, 'I@elasticsearch:server', command, ["systemctl start elasticsearch"], null, true) |
| 95 | salt.runSaltProcessStep(master, '*', 'saltutil.sync_all', [], null, true) |
| 96 | verify_es_is_green(master) |
| 97 | } catch (Exception er) { |
vitalygusev | 2270137 | 2018-09-25 17:27:35 +0400 | [diff] [blame] | 98 | errorOccured = true |
vitalygusev | 25872e1 | 2018-12-14 18:45:29 +0400 | [diff] [blame^] | 99 | common.errorMsg("[ERROR] Elasticsearch upgrade failed. Please fix it manually.") |
| 100 | throw er |
vitalygusev | 2270137 | 2018-09-25 17:27:35 +0400 | [diff] [blame] | 101 | } |
vitalygusev | 25872e1 | 2018-12-14 18:45:29 +0400 | [diff] [blame^] | 102 | } else { |
| 103 | try { |
| 104 | salt.runSaltProcessStep(master, "*", 'saltutil.refresh_pillar', [], null, true) |
| 105 | salt.enforceState(master, "I@elasticsearch:server", 'linux.system.repo', true) |
| 106 | salt.runSaltProcessStep(master, 'I@elasticsearch:client', command, ["apt-get install -y -o Dpkg::Options::=\"--force-confold\" python-elasticsearch"], null, true) |
| 107 | salt.enforceState(master, "I@elasticsearch:server", 'salt.minion', true) |
| 108 | salt.runSaltProcessStep(master, 'I@elasticsearch:server', command, ["systemctl stop elasticsearch"], null, true) |
| 109 | salt.runSaltProcessStep(master, 'I@elasticsearch:server', command, ["export ES_PATH_CONF=/etc/elasticsearch; apt-get install -y -o Dpkg::Options::=\"--force-confold\" elasticsearch"], null, true) |
| 110 | salt.enforceState(master, "I@elasticsearch:server", 'elasticsearch.server', true) |
| 111 | verify_es_is_green(master) |
| 112 | salt.enforceState(master, "I@elasticsearch:client", 'elasticsearch.client.update_index_templates', true) |
| 113 | salt.enforceState(master, "I@elasticsearch:client", 'elasticsearch.client', true) |
| 114 | } catch (Exception er) { |
vitalygusev | 2270137 | 2018-09-25 17:27:35 +0400 | [diff] [blame] | 115 | errorOccured = true |
vitalygusev | 25872e1 | 2018-12-14 18:45:29 +0400 | [diff] [blame^] | 116 | common.errorMsg("[ERROR] Elasticsearch upgrade failed. Please fix it manually.") |
| 117 | throw er |
vitalygusev | 2270137 | 2018-09-25 17:27:35 +0400 | [diff] [blame] | 118 | } |
vitalygusev | 2270137 | 2018-09-25 17:27:35 +0400 | [diff] [blame] | 119 | } |
| 120 | } |
vitalygusev | 4b331fa | 2018-12-04 19:03:47 +0400 | [diff] [blame] | 121 | stage('Upgrade kibana') { |
vitalygusev | 25872e1 | 2018-12-14 18:45:29 +0400 | [diff] [blame^] | 122 | def kibana_version |
| 123 | def kibana_pillar = salt.getPillar(master, "I@kibana:client", '_param:kibana_version') |
| 124 | if(!kibana_pillar['return'].isEmpty()) { |
| 125 | kibana_version = kibana_pillar['return'][0].values()[0] |
| 126 | } |
| 127 | if (kibana_version == '5') { |
| 128 | try { |
| 129 | common.infoMsg('Upgrade the Kibana package') |
| 130 | salt.runSaltProcessStep(master, 'I@kibana:server', command, ["systemctl stop kibana"], null, true) |
| 131 | salt.runSaltProcessStep(master, 'I@kibana:server', command, ["apt-get --only-upgrade install kibana"], null, true) |
| 132 | salt.runSaltProcessStep(master, 'I@kibana:server', command, ["systemctl start kibana"], null, true) |
| 133 | } catch (Exception er) { |
| 134 | errorOccured = true |
| 135 | common.errorMsg("[ERROR] Kibana upgrade failed. Please fix it manually.") |
| 136 | throw er |
| 137 | } |
| 138 | } else { |
| 139 | try { |
| 140 | salt.runSaltProcessStep(master, 'I@kibana:server', command, ["systemctl stop kibana"], null, true) |
| 141 | salt.enforceStateWithExclude(pepperEnv, "I@kibana:server", "kibana.server", "[{'id': 'kibana_service'}]") |
| 142 | salt.runSaltProcessStep(master, 'I@kibana:server', command, ["apt-get install -y -o Dpkg::Options::=\"--force-confold\" kibana"], null, true) |
| 143 | salt.enforceState(master, "I@kibana:server", 'kibana.server', true) |
| 144 | salt.enforceState(master, "I@kibana:client", 'kibana.client', true) |
| 145 | } catch (Exception er) { |
| 146 | errorOccured = true |
| 147 | common.errorMsg("[ERROR] Kibana upgrade failed. Please fix it manually.") |
| 148 | throw er |
| 149 | } |
vitalygusev | 2270137 | 2018-09-25 17:27:35 +0400 | [diff] [blame] | 150 | } |
vitalygusev | 2270137 | 2018-09-25 17:27:35 +0400 | [diff] [blame] | 151 | |
vitalygusev | 4b331fa | 2018-12-04 19:03:47 +0400 | [diff] [blame] | 152 | common.infoMsg("Check kibana status on the target nodes") |
| 153 | salt.runSaltProcessStep(master, "I@kibana:server", "service.status", ["kibana"], null, true) |
vitalygusev | 2270137 | 2018-09-25 17:27:35 +0400 | [diff] [blame] | 154 | } |
| 155 | } |
| 156 | timeout(time: 12, unit: 'HOURS') { |
| 157 | node("python") { |
| 158 | |
| 159 | stage('Setup virtualenv for Pepper') { |
| 160 | python.setupPepperVirtualenv(pepperEnv, SALT_MASTER_URL, SALT_MASTER_CREDENTIALS) |
| 161 | } |
| 162 | |
vitalygusev | 25872e1 | 2018-12-14 18:45:29 +0400 | [diff] [blame^] | 163 | salt.enforceState(pepperEnv, '*', 'salt.minion.grains') |
| 164 | salt.runSaltProcessStep(pepperEnv, '*', 'saltutil.refresh_modules') |
| 165 | salt.runSaltProcessStep(pepperEnv, '*', 'mine.update') |
| 166 | sleep(30) |
| 167 | |
| 168 | |
vitalygusev | 2270137 | 2018-09-25 17:27:35 +0400 | [diff] [blame] | 169 | if (STAGE_UPGRADE_SYSTEM_PART.toBoolean() == true && !errorOccured) { |
| 170 | upgrade(pepperEnv, "I@telegraf:agent or I@telegraf:remote_agent", "telegraf", "telegraf", "telegraf") |
vitalygusev | 4b331fa | 2018-12-04 19:03:47 +0400 | [diff] [blame] | 171 | upgrade(pepperEnv, "I@fluentd:agent", "td-agent", "td-agent td-agent-additional-plugins", "fluentd") |
vitalygusev | 2270137 | 2018-09-25 17:27:35 +0400 | [diff] [blame] | 172 | if (salt.testTarget(pepperEnv, "I@prometheus:relay")) { |
vitalygusev | 25872e1 | 2018-12-14 18:45:29 +0400 | [diff] [blame^] | 173 | upgrade(pepperEnv, "I@prometheus:relay", "prometheus prometheus-relay", "prometheus-bin prometheus-relay", "prometheus") |
| 174 | salt.runSaltProcessStep(pepperEnv, "I@prometheus:relay", "service.restart", "prometheus", null, true) |
vitalygusev | 2270137 | 2018-09-25 17:27:35 +0400 | [diff] [blame] | 175 | } |
| 176 | if (salt.testTarget(pepperEnv, "I@prometheus:exporters:libvirt")) { |
| 177 | upgrade(pepperEnv, "I@prometheus:exporters:libvirt", "libvirt-exporter", "libvirt-exporter", "prometheus") |
| 178 | } |
| 179 | if (salt.testTarget(pepperEnv, "I@prometheus:exporters:jmx")) { |
| 180 | upgrade(pepperEnv, "I@prometheus:exporters:jmx", "jmx-exporter", "jmx-exporter", "prometheus") |
| 181 | } |
vitalygusev | 2532889 | 2018-10-17 11:40:27 +0400 | [diff] [blame] | 182 | } |
| 183 | |
| 184 | if (STAGE_UPGRADE_ES_KIBANA.toBoolean() == true && !errorOccured) { |
| 185 | upgrade_es_kibana(pepperEnv) |
vitalygusev | 2270137 | 2018-09-25 17:27:35 +0400 | [diff] [blame] | 186 | } |
| 187 | |
| 188 | if (STAGE_UPGRADE_DOCKER_COMPONENTS.toBoolean() == true && !errorOccured) { |
| 189 | |
vitalygusev | 4b331fa | 2018-12-04 19:03:47 +0400 | [diff] [blame] | 190 | stage('Upgrade docker components') { |
vitalygusev | 2270137 | 2018-09-25 17:27:35 +0400 | [diff] [blame] | 191 | |
| 192 | try { |
vitalygusev | 4b331fa | 2018-12-04 19:03:47 +0400 | [diff] [blame] | 193 | common.infoMsg('Disable and remove the previous versions of monitoring services') |
| 194 | salt.runSaltProcessStep(pepperEnv, 'I@docker:swarm:role:master and I@prometheus:server', command, ["docker stack rm monitoring"], null, true) |
| 195 | common.infoMsg('Rebuild the Prometheus configuration') |
vitalygusev | 2270137 | 2018-09-25 17:27:35 +0400 | [diff] [blame] | 196 | salt.enforceState(pepperEnv, 'I@docker:swarm and I@prometheus:server', 'prometheus') |
vitalygusev | 4b331fa | 2018-12-04 19:03:47 +0400 | [diff] [blame] | 197 | common.infoMsg('Disable and remove the previous version of Grafana') |
| 198 | salt.runSaltProcessStep(pepperEnv, 'I@docker:swarm:role:master and I@prometheus:server', command, ["docker stack rm dashboard"], null, true) |
| 199 | common.infoMsg('Start the monitoring services') |
vitalygusev | 2270137 | 2018-09-25 17:27:35 +0400 | [diff] [blame] | 200 | salt.enforceState(pepperEnv, 'I@docker:swarm:role:master and I@prometheus:server', 'docker') |
| 201 | salt.runSaltProcessStep(pepperEnv, '*', 'saltutil.sync_all', [], null, true) |
vitalygusev | 4b331fa | 2018-12-04 19:03:47 +0400 | [diff] [blame] | 202 | common.infoMsg('Refresh the Grafana dashboards') |
vitalygusev | 2270137 | 2018-09-25 17:27:35 +0400 | [diff] [blame] | 203 | salt.enforceState(pepperEnv, 'I@grafana:client', 'grafana.client') |
| 204 | } catch (Exception er) { |
| 205 | errorOccured = true |
vitalygusev | 4b331fa | 2018-12-04 19:03:47 +0400 | [diff] [blame] | 206 | common.errorMsg("[ERROR] Upgrade of docker components failed. Please fix it manually.") |
vitalygusev | 25872e1 | 2018-12-14 18:45:29 +0400 | [diff] [blame^] | 207 | throw er |
vitalygusev | 2270137 | 2018-09-25 17:27:35 +0400 | [diff] [blame] | 208 | } |
| 209 | } |
| 210 | } |
| 211 | } |
| 212 | } |