blob: f7cb469d74194fa40dd9f14d27c035b986c309d8 [file] [log] [blame]
Mateusz Los36e64e02019-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 Los36e64e02019-03-11 14:31:14 +010012salt = new com.mirantis.mk.Salt()
13def python = new com.mirantis.mk.Python()
Ivan Berezovskiy19c685a2019-11-05 17:42:57 +040014def ceph = new com.mirantis.mk.Ceph()
Mateusz Los36e64e02019-03-11 14:31:14 +010015orchestrate = new com.mirantis.mk.Orchestrate()
Ivan Berezovskiy19c685a2019-11-05 17:42:57 +040016pepperEnv = "pepperEnv"
Mateusz Los36e64e02019-03-11 14:31:14 +010017
18def runCephCommand(cmd) {
Ivan Berezovskiy19c685a2019-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 Los36e64e02019-03-11 14:31:14 +010020}
21
Ivan Berezovskiy19c685a2019-11-05 17:42:57 +040022def getpgmap() {
23 return runCephCommand('ceph pg ls remapped --format=json')['return'][0].values()[0]
Mateusz Los36e64e02019-03-11 14:31:14 +010024}
25
26def generatemapping(master,pgmap,map) {
Ivan Berezovskiy19c685a2019-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 Los36e64e02019-03-11 14:31:14 +010036 }
Mateusz Los36e64e02019-03-11 14:31:14 +010037}
38
Mateusz Los36e64e02019-03-11 14:31:14 +010039timeout(time: 12, unit: 'HOURS') {
40 node("python") {
Mateusz Los36e64e02019-03-11 14:31:14 +010041 // create connection to salt master
42 python.setupPepperVirtualenv(pepperEnv, SALT_MASTER_URL, SALT_MASTER_CREDENTIALS)
43
44 stage ("verify client versions")
45 {
Denis Egorenkoe983d452019-08-23 14:29:34 +040046 // I@docker:swarm and I@prometheus:server - mon* nodes
47 def nodes = salt.getMinions("pepperEnv", "I@ceph:common and not ( I@docker:swarm and I@prometheus:server )")
Mateusz Los36e64e02019-03-11 14:31:14 +010048 for ( node in nodes )
49 {
50 def versions = salt.cmdRun("pepperEnv", node, "ceph features --format json", checkResponse=true, batch=null, output=false).values()[0]
51 versions = new groovy.json.JsonSlurperClassic().parseText(versions[0][node])
52 if ( versions['client']['group']['release'] != 'luminous' )
53 {
54 throw new Exception("client installed on " + node + " is not luminous. Update all clients to luminous before using this pipeline")
55 }
56 }
57 }
58
Ivan Berezovskiy19c685a2019-11-05 17:42:57 +040059 stage("enable luminous compat") {
60 runCephCommand('ceph osd set-require-min-compat-client luminous')['return'][0].values()[0]
Mateusz Los36e64e02019-03-11 14:31:14 +010061 }
62
Ivan Berezovskiy19c685a2019-11-05 17:42:57 +040063 stage("enable upmap balancer") {
64 runCephCommand('ceph balancer on')['return'][0].values()[0]
65 runCephCommand('ceph balancer mode upmap')['return'][0].values()[0]
Mateusz Los36e64e02019-03-11 14:31:14 +010066 }
67
68
Ivan Berezovskiy19c685a2019-11-05 17:42:57 +040069 stage("set norebalance") {
70 runCephCommand('ceph osd set norebalance')['return'][0].values()[0]
Mateusz Los36e64e02019-03-11 14:31:14 +010071 }
72
73 stage('Install Ceph OSD') {
74 orchestrate.installCephOsd(pepperEnv, HOST)
75 }
76
77 def mapping = []
78
Ivan Berezovskiy19c685a2019-11-05 17:42:57 +040079 stage("update mappings") {
80 def pgmap
81 for (int x = 1; x <= 3; x++) {
82 pgmap = getpgmap()
83 if (pgmap == '') {
84 return 1
85 } else {
86 pgmap = new groovy.json.JsonSlurperClassic().parseText(pgmap)
87 generatemapping(pepperEnv, pgmap, mapping)
88 mapping.each(this.&runCephCommand)
89 sleep(30)
90 }
Mateusz Los36e64e02019-03-11 14:31:14 +010091 }
Mateusz Los36e64e02019-03-11 14:31:14 +010092 }
93
Ivan Berezovskiy19c685a2019-11-05 17:42:57 +040094 stage("unset norebalance") {
95 runCephCommand('ceph osd unset norebalance')['return'][0].values()[0]
Mateusz Los36e64e02019-03-11 14:31:14 +010096 }
97
Ivan Berezovskiy19c685a2019-11-05 17:42:57 +040098 stage("wait for healthy cluster") {
99 ceph.waitForHealthy(pepperEnv, "I@ceph:mon and I@ceph:common:keyring:admin")
Mateusz Los36e64e02019-03-11 14:31:14 +0100100 }
Mateusz Los36e64e02019-03-11 14:31:14 +0100101 }
102}