blob: 5c90c72a15f1ecfce3a2acb0e8009fda9352b9b1 [file] [log] [blame]
Mateusz Losddfa8462019-03-11 14:31:14 +01001/**
2 *
Roman Lubianyied68efd2020-03-13 16:04:09 +02003 * Add Ceph OSD node to existing cluster using upmap mechanism
Mateusz Losddfa8462019-03-11 14:31:14 +01004 *
5 * Requred parameters:
6 * SALT_MASTER_URL URL of Salt master
7 * SALT_MASTER_CREDENTIALS Credentials to the Salt API
Roman Lubianyied68efd2020-03-13 16:04:09 +02008 * HOST OSD Host (minion id) to be added
Mateusz Losddfa8462019-03-11 14:31:14 +01009 *
10 */
11
Roman Lubianyib797adb2020-04-22 12:36:37 +030012common = new com.mirantis.mk.Common()
Mateusz Losddfa8462019-03-11 14:31:14 +010013salt = new com.mirantis.mk.Salt()
14def python = new com.mirantis.mk.Python()
Ivan Berezovskiy2325dcb2019-11-05 17:42:57 +040015def ceph = new com.mirantis.mk.Ceph()
Mateusz Losddfa8462019-03-11 14:31:14 +010016orchestrate = new com.mirantis.mk.Orchestrate()
Ivan Berezovskiy2325dcb2019-11-05 17:42:57 +040017pepperEnv = "pepperEnv"
Ivan Berezovskiy373e8a32019-11-19 20:04:12 +040018def flags = CLUSTER_FLAGS ? CLUSTER_FLAGS.tokenize(',') : []
Mateusz Losddfa8462019-03-11 14:31:14 +010019
20def runCephCommand(cmd) {
Ivan Berezovskiy2325dcb2019-11-05 17:42:57 +040021 return salt.cmdRun(pepperEnv, "I@ceph:mon and I@ceph:common:keyring:admin", cmd, checkResponse = true, batch = null, output = false)
Mateusz Losddfa8462019-03-11 14:31:14 +010022}
23
Ivan Berezovskiy2325dcb2019-11-05 17:42:57 +040024def getpgmap() {
25 return runCephCommand('ceph pg ls remapped --format=json')['return'][0].values()[0]
Mateusz Losddfa8462019-03-11 14:31:14 +010026}
27
28def generatemapping(master,pgmap,map) {
Ivan Berezovskiy2325dcb2019-11-05 17:42:57 +040029 def pg_new
30 def pg_old
31 for (pg in pgmap) {
32 pg_new = pg["up"].minus(pg["acting"])
33 pg_old = pg["acting"].minus(pg["up"])
34 for (i = 0; i < pg_new.size(); i++) {
35 def string = "ceph osd pg-upmap-items " + pg["pgid"].toString() + " " + pg_new[i] + " " + pg_old[i] + ";"
36 map.add(string)
37 }
Mateusz Losddfa8462019-03-11 14:31:14 +010038 }
Mateusz Losddfa8462019-03-11 14:31:14 +010039}
40
Mateusz Losddfa8462019-03-11 14:31:14 +010041timeout(time: 12, unit: 'HOURS') {
42 node("python") {
Roman Lubianyied68efd2020-03-13 16:04:09 +020043 try {
44 // create connection to salt master
45 python.setupPepperVirtualenv(pepperEnv, SALT_MASTER_URL, SALT_MASTER_CREDENTIALS)
Mateusz Losddfa8462019-03-11 14:31:14 +010046
Roman Lubianyied68efd2020-03-13 16:04:09 +020047 stage ("verify client versions")
48 {
49 // I@docker:swarm and I@prometheus:server - mon* nodes
50 def nodes = salt.getMinions(pepperEnv, "I@ceph:common and not ( I@docker:swarm and I@prometheus:server )")
51 for ( node in nodes )
52 {
53 def versions = salt.cmdRun(pepperEnv, node, "ceph features --format json", checkResponse=true, batch=null, output=false).values()[0]
54 versions = new groovy.json.JsonSlurperClassic().parseText(versions[0][node])
55 if ( versions['client']['group']['release'] != 'luminous' )
56 {
57 throw new Exception("client installed on " + node + " is not luminous. Update all clients to luminous before using this pipeline")
58 }
Ivan Berezovskiy2325dcb2019-11-05 17:42:57 +040059 }
Mateusz Losddfa8462019-03-11 14:31:14 +010060 }
Mateusz Losddfa8462019-03-11 14:31:14 +010061
Roman Lubianyied68efd2020-03-13 16:04:09 +020062 stage("enable luminous compat") {
63 runCephCommand('ceph osd set-require-min-compat-client luminous')['return'][0].values()[0]
64 }
65
66 stage("enable upmap balancer") {
67 runCephCommand('ceph balancer on')['return'][0].values()[0]
68 runCephCommand('ceph balancer mode upmap')['return'][0].values()[0]
69 }
70
71 stage("set norebalance") {
72 runCephCommand('ceph osd set norebalance')['return'][0].values()[0]
73 }
74
75 stage('Install infra') {
76 orchestrate.installFoundationInfraOnTarget(pepperEnv, HOST)
77 }
78
79 stage('Install Ceph OSD') {
80 orchestrate.installCephOsd(pepperEnv, HOST)
81 }
82
83 stage("Update/Install monitoring") {
84 def prometheusNodes = salt.getMinions(pepperEnv, 'I@prometheus:server')
85 if (!prometheusNodes.isEmpty()) {
86 //Collect Grains
87 salt.enforceState(pepperEnv, HOST, 'salt.minion.grains')
88 salt.runSaltProcessStep(pepperEnv, HOST, 'saltutil.refresh_modules')
89 salt.runSaltProcessStep(pepperEnv, HOST, 'mine.update')
90 sleep(5)
91 salt.enforceState(pepperEnv, HOST, ['fluentd', 'telegraf', 'prometheus'])
92 salt.enforceState(pepperEnv, 'I@prometheus:server', 'prometheus')
93 } else {
94 common.infoMsg('No Prometheus nodes in cluster. Nothing to do')
95 }
96 }
97
98 stage("Update host files") {
99 salt.enforceState(pepperEnv, '*', 'linux.network.host')
100 }
101
102 def mapping = []
103
104 stage("update mappings") {
105 def pgmap
106 for (int x = 1; x <= 3; x++) {
107 pgmap = getpgmap()
108 if (pgmap == '') {
109 return 1
110 } else {
111 pgmap = new groovy.json.JsonSlurperClassic().parseText(pgmap)
112 generatemapping(pepperEnv, pgmap, mapping)
113 mapping.each(this.&runCephCommand)
114 sleep(30)
115 }
116 }
117 }
118
119 stage("unset norebalance") {
120 runCephCommand('ceph osd unset norebalance')['return'][0].values()[0]
121 }
122
123 stage("wait for healthy cluster") {
124 ceph.waitForHealthy(pepperEnv, "I@ceph:mon and I@ceph:common:keyring:admin", flags)
125 }
126 }
127 catch (Throwable e) {
128 // There was an error or exception thrown. Unset norebalance.
Ivan Berezovskiy2325dcb2019-11-05 17:42:57 +0400129 runCephCommand('ceph osd unset norebalance')['return'][0].values()[0]
Roman Lubianyied68efd2020-03-13 16:04:09 +0200130 throw e
Mateusz Losddfa8462019-03-11 14:31:14 +0100131 }
Mateusz Losddfa8462019-03-11 14:31:14 +0100132 }
133}