blob: 07fc66214f0272141b9c19056d3b959d3621d004 [file] [log] [blame]
Mateusz Los36e64e02019-03-11 14:31:14 +01001/**
2 *
Roman Lubianyiaf11e532020-03-13 16:04:09 +02003 * Add Ceph OSD node to existing cluster using upmap mechanism
Mateusz Los36e64e02019-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 Lubianyiaf11e532020-03-13 16:04:09 +02008 * HOST OSD Host (minion id) to be added
Mateusz Los36e64e02019-03-11 14:31:14 +01009 *
10 */
11
Roman Lubianyi75f63162020-04-22 12:36:37 +030012common = new com.mirantis.mk.Common()
Mateusz Los36e64e02019-03-11 14:31:14 +010013salt = new com.mirantis.mk.Salt()
14def python = new com.mirantis.mk.Python()
Ivan Berezovskiy19c685a2019-11-05 17:42:57 +040015def ceph = new com.mirantis.mk.Ceph()
Mateusz Los36e64e02019-03-11 14:31:14 +010016orchestrate = new com.mirantis.mk.Orchestrate()
Ivan Berezovskiy19c685a2019-11-05 17:42:57 +040017pepperEnv = "pepperEnv"
Ivan Berezovskiy4c39c7d2019-11-19 20:04:12 +040018def flags = CLUSTER_FLAGS ? CLUSTER_FLAGS.tokenize(',') : []
Mateusz Los36e64e02019-03-11 14:31:14 +010019
20def runCephCommand(cmd) {
Ivan Berezovskiy19c685a2019-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 Los36e64e02019-03-11 14:31:14 +010022}
23
Ivan Berezovskiy19c685a2019-11-05 17:42:57 +040024def getpgmap() {
25 return runCephCommand('ceph pg ls remapped --format=json')['return'][0].values()[0]
Mateusz Los36e64e02019-03-11 14:31:14 +010026}
27
28def generatemapping(master,pgmap,map) {
Ivan Berezovskiy19c685a2019-11-05 17:42:57 +040029 def pg_new
30 def pg_old
Tomek Jaroszyk8f976f42020-08-21 18:40:59 +020031 for (pg in pgmap.get('pg_stats',[])) {
Ivan Berezovskiy19c685a2019-11-05 17:42:57 +040032 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 Los36e64e02019-03-11 14:31:14 +010038 }
Mateusz Los36e64e02019-03-11 14:31:14 +010039}
40
Mateusz Los36e64e02019-03-11 14:31:14 +010041timeout(time: 12, unit: 'HOURS') {
42 node("python") {
Roman Lubianyiaf11e532020-03-13 16:04:09 +020043 try {
44 // create connection to salt master
45 python.setupPepperVirtualenv(pepperEnv, SALT_MASTER_URL, SALT_MASTER_CREDENTIALS)
Mateusz Los36e64e02019-03-11 14:31:14 +010046
Tomek Jaroszyk2c19b7a2020-04-30 14:13:49 +020047 stage ("verification of supported features") {
Mateusz Los350e1d22020-05-12 14:33:50 +020048 def checknode = salt.runSaltProcessStep(pepperEnv, HOST, 'test.ping')
49 if (checknode['return'][0].values().isEmpty()) {
50 common.errorMsg("Host not found")
51 throw new InterruptedException()
52 }
Tomek Jaroszyk8f976f42020-08-21 18:40:59 +020053 def cmn = salt.getFirstMinion(pepperEnv, "I@ceph:mon")
54 def features = salt.cmdRun(pepperEnv, cmn, "ceph features --format json", checkResponse=true, batch=null, output=false).values()[0]
55
56 features = new groovy.json.JsonSlurperClassic().parseText(features[0][cmn])
57 for ( group in features['client'] ) {
58 if ( group['release'] != 'luminous' ) {
59 throw new Exception("Some of installed clients does not support upmap. Update all clients to luminous or newer before using this pipeline")
Roman Lubianyiaf11e532020-03-13 16:04:09 +020060 }
Ivan Berezovskiy19c685a2019-11-05 17:42:57 +040061 }
Mateusz Los36e64e02019-03-11 14:31:14 +010062 }
Mateusz Los36e64e02019-03-11 14:31:14 +010063
Roman Lubianyiaf11e532020-03-13 16:04:09 +020064 stage("enable luminous compat") {
65 runCephCommand('ceph osd set-require-min-compat-client luminous')['return'][0].values()[0]
66 }
67
68 stage("enable upmap balancer") {
69 runCephCommand('ceph balancer on')['return'][0].values()[0]
70 runCephCommand('ceph balancer mode upmap')['return'][0].values()[0]
71 }
72
73 stage("set norebalance") {
74 runCephCommand('ceph osd set norebalance')['return'][0].values()[0]
75 }
76
77 stage('Install infra') {
78 orchestrate.installFoundationInfraOnTarget(pepperEnv, HOST)
79 }
80
81 stage('Install Ceph OSD') {
Tomek Jaroszyk8f976f42020-08-21 18:40:59 +020082 salt.enforceState(pepperEnv, HOST, 'linux.storage')
Roman Lubianyiaf11e532020-03-13 16:04:09 +020083 orchestrate.installCephOsd(pepperEnv, HOST)
84 }
85
86 stage("Update/Install monitoring") {
87 def prometheusNodes = salt.getMinions(pepperEnv, 'I@prometheus:server')
88 if (!prometheusNodes.isEmpty()) {
89 //Collect Grains
90 salt.enforceState(pepperEnv, HOST, 'salt.minion.grains')
91 salt.runSaltProcessStep(pepperEnv, HOST, 'saltutil.refresh_modules')
92 salt.runSaltProcessStep(pepperEnv, HOST, 'mine.update')
93 sleep(5)
94 salt.enforceState(pepperEnv, HOST, ['fluentd', 'telegraf', 'prometheus'])
95 salt.enforceState(pepperEnv, 'I@prometheus:server', 'prometheus')
96 } else {
97 common.infoMsg('No Prometheus nodes in cluster. Nothing to do')
98 }
99 }
100
101 stage("Update host files") {
102 salt.enforceState(pepperEnv, '*', 'linux.network.host')
103 }
104
Roman Lubianyiaf11e532020-03-13 16:04:09 +0200105
106 stage("update mappings") {
107 def pgmap
108 for (int x = 1; x <= 3; x++) {
109 pgmap = getpgmap()
110 if (pgmap == '') {
111 return 1
112 } else {
Tomek Jaroszyk8f976f42020-08-21 18:40:59 +0200113 def mapping = []
Roman Lubianyiaf11e532020-03-13 16:04:09 +0200114 pgmap = new groovy.json.JsonSlurperClassic().parseText(pgmap)
115 generatemapping(pepperEnv, pgmap, mapping)
116 mapping.each(this.&runCephCommand)
117 sleep(30)
118 }
119 }
120 }
121
122 stage("unset norebalance") {
123 runCephCommand('ceph osd unset norebalance')['return'][0].values()[0]
124 }
125
126 stage("wait for healthy cluster") {
127 ceph.waitForHealthy(pepperEnv, "I@ceph:mon and I@ceph:common:keyring:admin", flags)
128 }
129 }
Tomek Jaroszyk6d8a3aa2020-07-07 12:07:40 +0200130 finally {
Ivan Berezovskiy19c685a2019-11-05 17:42:57 +0400131 runCephCommand('ceph osd unset norebalance')['return'][0].values()[0]
Mateusz Los36e64e02019-03-11 14:31:14 +0100132 }
Mateusz Los36e64e02019-03-11 14:31:14 +0100133 }
134}