1
1
import org.opensearch.gradle.test.RestIntegTestTask
2
2
3
+ import java.util.concurrent.Callable
3
4
import java.util.regex.Matcher
4
5
import java.util.regex.Pattern
5
6
@@ -36,6 +37,12 @@ buildscript {
36
37
" opensearch" : opensearch_version,
37
38
" prometheus" : " 0.16.0"
38
39
]
40
+
41
+ bwcPluginDownloadLink = ' https://github.com/Aiven-Open/prometheus-exporter-plugin-for-opensearch/releases/download/' +
42
+ project.BWCPluginVersion + ' /prometheus-exporter-' + project.BWCPluginVersion + ' .zip'
43
+ baseName = " bwcCluster"
44
+ bwcFilePath = " src/test/resources/org/opensearch/prometheus-exporter/bwc/"
45
+ bwcPrometheusExporterPath = bwcFilePath + " prometheus-exporter/"
39
46
}
40
47
41
48
repositories {
@@ -46,7 +53,12 @@ buildscript {
46
53
maven { url " https://plugins.gradle.org/m2/" }
47
54
}
48
55
56
+ configurations {
57
+ zipArchive
58
+ }
59
+
49
60
dependencies {
61
+ zipArchive group : ' org.opensearch.plugin.prometheus' , name :' prometheus-exporter' , version : " ${ versions.opensearch} "
50
62
classpath " org.opensearch.gradle:build-tools:${ versions.opensearch} "
51
63
}
52
64
}
@@ -56,6 +68,7 @@ apply plugin: 'idea'
56
68
apply plugin : ' opensearch.opensearchplugin'
57
69
apply plugin : ' opensearch.yaml-rest-test'
58
70
// apply plugin: 'checkstyle'
71
+ apply plugin : ' opensearch.pluginzip'
59
72
60
73
def pluginName = pluginName
61
74
def pluginDescription = pluginDescription
@@ -118,6 +131,9 @@ task integTest(type: RestIntegTestTask) {
118
131
description = " Run tests against a cluster"
119
132
testClassesDirs = sourceSets. test. output. classesDirs
120
133
classpath = sourceSets. test. runtimeClasspath
134
+ filter {
135
+ excludeTestsMatching " org.opensearch.plugin.bwc.*IT"
136
+ }
121
137
}
122
138
tasks. named(" check" ). configure { dependsOn(integTest) }
123
139
@@ -146,6 +162,187 @@ testClusters.integTest {
146
162
plugin(project. tasks. bundlePlugin. archiveFile)
147
163
}
148
164
165
+ task copyZIPBundle {
166
+ dependsOn(bundlePlugin)
167
+
168
+ // doFirst {
169
+ // if (new File("$bwcPrometheusExporterPath/$project.version").exists()) {
170
+ // project.delete(files("$bwcPrometheusExporterPath/$project.version"))
171
+ // }
172
+ // project.mkdir bwcPrometheusExporterPath + project.version
173
+ // }
174
+
175
+ // from 'build/distributions/prometheus-exporter-' + project.version + '.zip'
176
+ // into bwcPrometheusExporterPath + project.version
177
+ doLast {
178
+ // By using ant.copy we can "hack" around gradle check for other task's resources modification.
179
+ // It seems like a dirty hack but some official plugins seem to use this practice;
180
+ // for instance see https://github.com/opensearch-project/anomaly-detection/
181
+ ant. copy(todir : bwcPrometheusExporterPath + project. version) {
182
+ ant. fileset(dir : ' build/distributions/' , includes : ' prometheus-exporter-' + project. version + ' .zip' )
183
+ }
184
+ }
185
+ }
186
+
187
+ // Clusters for BWC tests
188
+ 2. times { i ->
189
+ testClusters {
190
+ " ${ baseName} $i " {
191
+ versions = [project.BWCversion , " 2.17.1" ]
192
+ numberOfNodes = 3
193
+ plugin(provider(new Callable<RegularFile > () {
194
+ @Override
195
+ RegularFile call () throws Exception {
196
+ return new RegularFile () {
197
+ @Override
198
+ File getAsFile () {
199
+ if (new File (" $project . rootDir /$bwcFilePath /prometheus-exporter/$project . BWCPluginVersion " ). exists()) {
200
+ project. delete(files(" $project . rootDir /$bwcFilePath /prometheus-exporter/$project . BWCPluginVersion " ))
201
+ }
202
+ project. mkdir bwcPrometheusExporterPath + project.BWCPluginVersion
203
+ ant. get(src : bwcPluginDownloadLink,
204
+ dest : bwcPrometheusExporterPath + project.BWCPluginVersion ,
205
+ httpusecaches : false )
206
+ return fileTree(bwcPrometheusExporterPath + project.BWCPluginVersion ). getSingleFile()
207
+ }
208
+ }
209
+ }
210
+ }))
211
+ setting ' path.repo' , " ${ buildDir} /cluster/shared/repo/${ baseName} "
212
+ setting ' http.content_type.required' , ' true'
213
+ }
214
+ }
215
+ }
216
+
217
+ List<Provider<RegularFile > > plugins = [
218
+ provider(new Callable<RegularFile > (){
219
+ @Override
220
+ RegularFile call () throws Exception {
221
+ return new RegularFile () {
222
+ @Override
223
+ File getAsFile () {
224
+ return fileTree(bwcPrometheusExporterPath + project. version). getSingleFile()
225
+ }
226
+ }
227
+ }
228
+ })
229
+ ]
230
+
231
+ // Creates 2 test clusters with 3 nodes of the old version.
232
+ 2. times {i ->
233
+ task " ${ baseName} #oldVersionClusterTask$i " (type : RestIntegTestTask ) {
234
+ useCluster testClusters. " ${ baseName} $i "
235
+ filter {
236
+ includeTestsMatching " org.opensearch.plugin.bwc.*IT"
237
+ }
238
+ systemProperty ' tests.rest.bwcsuite' , ' old_cluster'
239
+ systemProperty ' tests.rest.bwcsuite_round' , ' old'
240
+ systemProperty ' tests.plugin_bwc_version' , project.BWCPluginVersion
241
+ nonInputProperties. systemProperty(' tests.rest.cluster' , " ${ -> testClusters."${baseName}$i".allHttpSocketURI.join(",")} " )
242
+ nonInputProperties. systemProperty(' tests.clustername' , " ${ -> testClusters."${baseName}$i".getName()} " )
243
+ }
244
+ }
245
+
246
+ // Upgrades one node of the old cluster to new OpenSearch version with upgraded plugin version
247
+ // This results in a mixed cluster with 2 nodes on the old version and 1 upgraded node.
248
+ // This is also used as a one third upgraded cluster for a rolling upgrade.
249
+ task " ${ baseName} #mixedClusterTask" (type : RestIntegTestTask ) {
250
+ dependsOn tasks. named(" copyZIPBundle" )
251
+ useCluster testClusters. " ${ baseName} 0"
252
+ dependsOn " ${ baseName} #oldVersionClusterTask0"
253
+ doFirst {
254
+ testClusters. " ${ baseName} 0" . upgradeNodeAndPluginToNextVersion(plugins)
255
+ }
256
+ filter {
257
+ includeTestsMatching " org.opensearch.plugin.bwc.*IT"
258
+ }
259
+ systemProperty ' tests.rest.bwcsuite' , ' mixed_cluster'
260
+ systemProperty ' tests.rest.bwcsuite_round' , ' first'
261
+ systemProperty ' tests.plugin_bwc_version' , project.BWCPluginVersion
262
+ nonInputProperties. systemProperty(' tests.rest.cluster' , " ${ -> testClusters."${baseName}0".allHttpSocketURI.join(",")} " )
263
+ nonInputProperties. systemProperty(' tests.clustername' , " ${ -> testClusters."${baseName}0".getName()} " )
264
+ }
265
+
266
+ // Upgrades the second node to new OpenSearch version with upgraded plugin version after the first node is upgraded.
267
+ // This results in a mixed cluster with 1 node on the old version and 2 upgraded nodes.
268
+ // This is used for rolling upgrade.
269
+ task " ${ baseName} #twoThirdsUpgradedClusterTask" (type : RestIntegTestTask ) {
270
+ dependsOn tasks. named(" copyZIPBundle" )
271
+ dependsOn " ${ baseName} #mixedClusterTask"
272
+ useCluster testClusters. " ${ baseName} 0"
273
+ doFirst {
274
+ testClusters. " ${ baseName} 0" . upgradeNodeAndPluginToNextVersion(plugins)
275
+ }
276
+ filter {
277
+ includeTestsMatching " org.opensearch.plugin.bwc.*IT"
278
+ }
279
+ systemProperty ' tests.rest.bwcsuite' , ' mixed_cluster'
280
+ systemProperty ' tests.rest.bwcsuite_round' , ' second'
281
+ systemProperty ' tests.plugin_bwc_version' , project.BWCPluginVersion
282
+ nonInputProperties. systemProperty(' tests.rest.cluster' , " ${ -> testClusters."${baseName}0".allHttpSocketURI.join(",")} " )
283
+ nonInputProperties. systemProperty(' tests.clustername' , " ${ -> testClusters."${baseName}0".getName()} " )
284
+ }
285
+
286
+ // Upgrades the third node to new OpenSearch version with upgraded plugin version after the second node is upgraded.
287
+ // This results in a fully upgraded cluster.
288
+ // This is used for rolling upgrade.
289
+ task " ${ baseName} #rollingUpgradeClusterTask" (type : RestIntegTestTask ) {
290
+ dependsOn tasks. named(" copyZIPBundle" )
291
+ dependsOn " ${ baseName} #twoThirdsUpgradedClusterTask"
292
+ useCluster testClusters. " ${ baseName} 0"
293
+ doFirst {
294
+ testClusters. " ${ baseName} 0" . upgradeNodeAndPluginToNextVersion(plugins)
295
+ }
296
+ filter {
297
+ includeTestsMatching " org.opensearch.plugin.bwc.*IT"
298
+ }
299
+ mustRunAfter " ${ baseName} #mixedClusterTask"
300
+ systemProperty ' tests.rest.bwcsuite' , ' mixed_cluster'
301
+ systemProperty ' tests.rest.bwcsuite_round' , ' third'
302
+ systemProperty ' tests.plugin_bwc_version' , project.BWCPluginVersion
303
+ nonInputProperties. systemProperty(' tests.rest.cluster' , " ${ -> testClusters."${baseName}0".allHttpSocketURI.join(",")} " )
304
+ nonInputProperties. systemProperty(' tests.clustername' , " ${ -> testClusters."${baseName}0".getName()} " )
305
+ }
306
+
307
+ // Upgrades all the nodes of the old cluster to new OpenSearch version with upgraded plugin version
308
+ // at the same time resulting in a fully upgraded cluster.
309
+ task " ${ baseName} #fullRestartClusterTask" (type : RestIntegTestTask ) {
310
+ dependsOn tasks. named(" copyZIPBundle" )
311
+ dependsOn " ${ baseName} #oldVersionClusterTask1"
312
+ useCluster testClusters. " ${ baseName} 1"
313
+ doFirst {
314
+ testClusters. " ${ baseName} 1" . upgradeAllNodesAndPluginsToNextVersion(plugins)
315
+ }
316
+ filter {
317
+ includeTestsMatching " org.opensearch.plugin.bwc.*IT"
318
+ }
319
+ systemProperty ' tests.rest.bwcsuite' , ' upgraded_cluster'
320
+ systemProperty ' tests.plugin_bwc_version' , project.BWCPluginVersion
321
+ nonInputProperties. systemProperty(' tests.rest.cluster' , " ${ -> testClusters."${baseName}1".allHttpSocketURI.join(",")} " )
322
+ nonInputProperties. systemProperty(' tests.clustername' , " ${ -> testClusters."${baseName}1".getName()} " )
323
+ }
324
+
325
+ // A BWC test suite which runs all the bwc tasks combined.
326
+ task bwcTestSuite (type : RestIntegTestTask ) {
327
+
328
+ // Delete all downloaded and built plugin ZIP files.
329
+ // Again – we are using ant task to workaround gradle resources modification alert.
330
+ doFirst {
331
+ ant. delete(includeEmptyDirs : true , verbose : true , removeNotFollowedSymlinks : true ) {
332
+ ant. fileset(
333
+ dir : ' src/test/resources/org/opensearch/prometheus-exporter/bwc/prometheus-exporter'
334
+ )
335
+ }
336
+ }
337
+
338
+ exclude ' **/*Test*'
339
+ exclude ' **/*IT*'
340
+
341
+ dependsOn tasks. named(" ${ baseName} #mixedClusterTask" )
342
+ dependsOn tasks. named(" ${ baseName} #rollingUpgradeClusterTask" )
343
+ dependsOn tasks. named(" ${ baseName} #fullRestartClusterTask" )
344
+ }
345
+
149
346
run {
150
347
useCluster testClusters. integTest
151
348
}
0 commit comments