blob: a4dd8f2a8d676ecadef37681862d1a3066cd2724 [file] [log] [blame]
Mateusz Losddfa8462019-03-11 14:31:14 +01001/**
2 *
3 * Add Ceph node to existing cluster using upmap mechanism
4 *
5 * Requred parameters:
6 * SALT_MASTER_URL URL of Salt master
7 * SALT_MASTER_CREDENTIALS Credentials to the Salt API
8 * HOST Host (minion id) to be added
9 *
10 */
11
Mateusz Losddfa8462019-03-11 14:31:14 +010012salt = new com.mirantis.mk.Salt()
13def python = new com.mirantis.mk.Python()
Ivan Berezovskiy2325dcb2019-11-05 17:42:57 +040014def ceph = new com.mirantis.mk.Ceph()
Mateusz Losddfa8462019-03-11 14:31:14 +010015orchestrate = new com.mirantis.mk.Orchestrate()
Ivan Berezovskiy2325dcb2019-11-05 17:42:57 +040016pepperEnv = "pepperEnv"
Mateusz Losddfa8462019-03-11 14:31:14 +010017
18def runCephCommand(cmd) {
Ivan Berezovskiy2325dcb2019-11-05 17:42:57 +040019 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 +010020}
21
Ivan Berezovskiy2325dcb2019-11-05 17:42:57 +040022def getpgmap() {
23 return runCephCommand('ceph pg ls remapped --format=json')['return'][0].values()[0]
Mateusz Losddfa8462019-03-11 14:31:14 +010024}
25
26def generatemapping(master,pgmap,map) {
Ivan Berezovskiy2325dcb2019-11-05 17:42:57 +040027 def pg_new
28 def pg_old
29 for (pg in pgmap) {
30 pg_new = pg["up"].minus(pg["acting"])
31 pg_old = pg["acting"].minus(pg["up"])
32 for (i = 0; i < pg_new.size(); i++) {
33 def string = "ceph osd pg-upmap-items " + pg["pgid"].toString() + " " + pg_new[i] + " " + pg_old[i] + ";"
34 map.add(string)
35 }
Mateusz Losddfa8462019-03-11 14:31:14 +010036 }
Mateusz Losddfa8462019-03-11 14:31:14 +010037}
38
Mateusz Losddfa8462019-03-11 14:31:14 +010039timeout(time: 12, unit: 'HOURS') {
40 node("python") {
Mateusz Losddfa8462019-03-11 14:31:14 +010041 // create connection to salt master
42 python.setupPepperVirtualenv(pepperEnv, SALT_MASTER_URL, SALT_MASTER_CREDENTIALS)
43
Ivan Berezovskiy2325dcb2019-11-05 17:42:57 +040044 stage("verify client versions") {
45 def admin = salt.getMinions(pepperEnv, "I@ceph:mon and I@ceph:common:keyring:admin")[0]
46 def versions = salt.cmdRun(pepperEnv, admin, "ceph features", checkResponse = true, batch = null, output = false).values()[0]
Mateusz Los0e183112019-04-04 20:10:05 +020047
Ivan Berezovskiy2325dcb2019-11-05 17:42:57 +040048 if (versions[0][admin].contains('jewel')) {
49 throw new Exception("Update all clients to luminous before using this pipeline")
50 }
Mateusz Losddfa8462019-03-11 14:31:14 +010051 }
52
Ivan Berezovskiy2325dcb2019-11-05 17:42:57 +040053 stage("enable luminous compat") {
54 runCephCommand('ceph osd set-require-min-compat-client luminous')['return'][0].values()[0]
Mateusz Losddfa8462019-03-11 14:31:14 +010055 }
56
Ivan Berezovskiy2325dcb2019-11-05 17:42:57 +040057 stage("enable upmap balancer") {
58 runCephCommand('ceph balancer on')['return'][0].values()[0]
59 runCephCommand('ceph balancer mode upmap')['return'][0].values()[0]
Mateusz Losddfa8462019-03-11 14:31:14 +010060 }
61
62
Ivan Berezovskiy2325dcb2019-11-05 17:42:57 +040063 stage("set norebalance") {
64 runCephCommand('ceph osd set norebalance')['return'][0].values()[0]
Mateusz Losddfa8462019-03-11 14:31:14 +010065 }
66
67 stage('Install Ceph OSD') {
68 orchestrate.installCephOsd(pepperEnv, HOST)
69 }
70
71 def mapping = []
72
Ivan Berezovskiy2325dcb2019-11-05 17:42:57 +040073 stage("update mappings") {
74 def pgmap
75 for (int x = 1; x <= 3; x++) {
76 pgmap = getpgmap()
77 if (pgmap == '') {
78 return 1
79 } else {
80 pgmap = new groovy.json.JsonSlurperClassic().parseText(pgmap)
81 generatemapping(pepperEnv, pgmap, mapping)
82 mapping.each(this.&runCephCommand)
83 }
Mateusz Losddfa8462019-03-11 14:31:14 +010084 }
Mateusz Losddfa8462019-03-11 14:31:14 +010085 }
86
Ivan Berezovskiy2325dcb2019-11-05 17:42:57 +040087 stage("unset norebalance") {
88 runCephCommand('ceph osd unset norebalance')['return'][0].values()[0]
Mateusz Losddfa8462019-03-11 14:31:14 +010089 }
90
Ivan Berezovskiy2325dcb2019-11-05 17:42:57 +040091 stage("wait for healthy cluster") {
92 ceph.waitForHealthy(pepperEnv, "I@ceph:mon and I@ceph:common:keyring:admin")
Mateusz Losddfa8462019-03-11 14:31:14 +010093 }
Mateusz Losddfa8462019-03-11 14:31:14 +010094 }
95}