Skip to content

Commit 58d52e8

Browse files
committed
Test fixtures krb5 (#40297)
Replaces the vagrant based kerberos fixtures with docker based test fixtures plugin. The configuration is now entirely static on the docker side and no longer driven by Gradle, also two different services are being configured since there are two different consumers of the fixture that can run in parallel and require different configurations.
1 parent f2d221d commit 58d52e8

File tree

16 files changed

+184
-330
lines changed

16 files changed

+184
-330
lines changed

buildSrc/src/main/java/org/elasticsearch/gradle/testfixtures/TestFixturesPlugin.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import org.gradle.api.Task;
3131
import org.gradle.api.plugins.BasePlugin;
3232
import org.gradle.api.plugins.ExtraPropertiesExtension;
33-
import org.gradle.api.tasks.Input;
3433
import org.gradle.api.tasks.TaskContainer;
3534
import org.gradle.internal.os.OperatingSystem;
3635

@@ -104,6 +103,7 @@ public void apply(Project project) {
104103
"but none could be found so these will be skipped", project.getPath()
105104
);
106105
disableTaskByType(tasks, getTaskClass("com.carrotsearch.gradle.junit4.RandomizedTestingTask"));
106+
disableTaskByType(tasks, getTaskClass("org.elasticsearch.gradle.test.RestIntegTestTask"));
107107
// conventions are not honored when the tasks are disabled
108108
disableTaskByType(tasks, TestingConventionsTasks.class);
109109
disableTaskByType(tasks, ComposeUp.class);
@@ -122,6 +122,7 @@ public void apply(Project project) {
122122
fixtureProject,
123123
(name, port) -> setSystemProperty(task, name, port)
124124
);
125+
task.dependsOn(fixtureProject.getTasks().getByName("postProcessFixture"));
125126
})
126127
);
127128

@@ -155,7 +156,6 @@ private void configureServiceInfoForTask(Task task, Project fixtureProject, BiCo
155156
);
156157
}
157158

158-
@Input
159159
public boolean dockerComposeSupported(Project project) {
160160
if (OperatingSystem.current().isWindows()) {
161161
return false;

plugins/repository-hdfs/build.gradle

+35-86
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,19 @@ import org.elasticsearch.gradle.test.RestIntegTestTask
2424
import java.nio.file.Files
2525
import java.nio.file.Path
2626
import java.nio.file.Paths
27-
27+
apply plugin: 'elasticsearch.test.fixtures'
28+
2829
esplugin {
2930
description 'The HDFS repository plugin adds support for Hadoop Distributed File-System (HDFS) repositories.'
3031
classname 'org.elasticsearch.repositories.hdfs.HdfsPlugin'
3132
}
3233

33-
apply plugin: 'elasticsearch.vagrantsupport'
34-
3534
versions << [
3635
'hadoop2': '2.8.1'
3736
]
3837

38+
testFixtures.useFixture ":test:fixtures:krb5kdc-fixture"
39+
3940
configurations {
4041
hdfsFixture
4142
}
@@ -68,67 +69,27 @@ dependencyLicenses {
6869
mapping from: /hadoop-.*/, to: 'hadoop'
6970
}
7071

71-
// MIT Kerberos Vagrant Testing Fixture
72-
String box = "krb5kdc"
73-
Map<String,String> vagrantEnvVars = [
74-
'VAGRANT_CWD' : "${project(':test:fixtures:krb5kdc-fixture').projectDir}",
75-
'VAGRANT_VAGRANTFILE' : 'Vagrantfile',
76-
'VAGRANT_PROJECT_DIR' : "${project(':test:fixtures:krb5kdc-fixture').projectDir}"
77-
]
78-
79-
task krb5kdcUpdate(type: org.elasticsearch.gradle.vagrant.VagrantCommandTask) {
80-
command 'box'
81-
subcommand 'update'
82-
boxName box
83-
environmentVars vagrantEnvVars
84-
dependsOn "vagrantCheckVersion", "virtualboxCheckVersion"
85-
}
86-
87-
task krb5kdcFixture(type: org.elasticsearch.gradle.test.VagrantFixture) {
88-
command 'up'
89-
args '--provision', '--provider', 'virtualbox'
90-
boxName box
91-
environmentVars vagrantEnvVars
92-
dependsOn krb5kdcUpdate
93-
}
94-
95-
task krb5AddPrincipals {
96-
dependsOn krb5kdcFixture
97-
}
9872

99-
List<String> principals = [ "elasticsearch", "hdfs/hdfs.build.elastic.co" ]
10073
String realm = "BUILD.ELASTIC.CO"
10174

102-
for (String principal : principals) {
103-
Task create = project.tasks.create("addPrincipal#${principal}".replace('/', '_'), org.elasticsearch.gradle.vagrant.VagrantCommandTask) {
104-
command 'ssh'
105-
args '--command', "sudo bash /vagrant/src/main/resources/provision/addprinc.sh $principal"
106-
boxName box
107-
environmentVars vagrantEnvVars
108-
dependsOn krb5kdcFixture
109-
}
110-
krb5AddPrincipals.dependsOn(create)
111-
}
11275

11376
// Create HDFS File System Testing Fixtures for HA/Secure combinations
11477
for (String fixtureName : ['hdfsFixture', 'haHdfsFixture', 'secureHdfsFixture', 'secureHaHdfsFixture']) {
11578
project.tasks.create(fixtureName, org.elasticsearch.gradle.test.AntFixture) {
116-
dependsOn project.configurations.hdfsFixture
79+
dependsOn project.configurations.hdfsFixture, project(':test:fixtures:krb5kdc-fixture').tasks.postProcessFixture
11780
executable = new File(project.runtimeJavaHome, 'bin/java')
11881
env 'CLASSPATH', "${ -> project.configurations.hdfsFixture.asPath }"
11982
waitCondition = { fixture, ant ->
12083
// the hdfs.MiniHDFS fixture writes the ports file when
12184
// it's ready, so we can just wait for the file to exist
12285
return fixture.portsFile.exists()
123-
}
86+
}
12487

12588
final List<String> miniHDFSArgs = []
12689

12790
// If it's a secure fixture, then depend on Kerberos Fixture and principals + add the krb5conf to the JVM options
12891
if (fixtureName.equals('secureHdfsFixture') || fixtureName.equals('secureHaHdfsFixture')) {
129-
dependsOn krb5kdcFixture, krb5AddPrincipals
130-
Path krb5Config = project(':test:fixtures:krb5kdc-fixture').buildDir.toPath().resolve("conf").resolve("krb5.conf")
131-
miniHDFSArgs.add("-Djava.security.krb5.conf=${krb5Config}");
92+
miniHDFSArgs.add("-Djava.security.krb5.conf=${project(':test:fixtures:krb5kdc-fixture').ext.krb5Conf("hdfs")}");
13293
if (project.runtimeJavaVersion == JavaVersion.VERSION_1_9) {
13394
miniHDFSArgs.add('--add-opens=java.security.jgss/sun.security.krb5=ALL-UNNAMED')
13495
}
@@ -145,9 +106,11 @@ for (String fixtureName : ['hdfsFixture', 'haHdfsFixture', 'secureHdfsFixture',
145106

146107
// If it's a secure fixture, then set the principal name and keytab locations to use for auth.
147108
if (fixtureName.equals('secureHdfsFixture') || fixtureName.equals('secureHaHdfsFixture')) {
148-
Path keytabPath = project(':test:fixtures:krb5kdc-fixture').buildDir.toPath().resolve("keytabs").resolve("hdfs_hdfs.build.elastic.co.keytab")
149109
miniHDFSArgs.add("hdfs/hdfs.build.elastic.co@${realm}")
150-
miniHDFSArgs.add("${keytabPath}")
110+
miniHDFSArgs.add(
111+
project(':test:fixtures:krb5kdc-fixture')
112+
.ext.krb5Keytabs("hdfs", "hdfs_hdfs.build.elastic.co.keytab")
113+
)
151114
}
152115

153116
args miniHDFSArgs.toArray()
@@ -171,10 +134,11 @@ project.afterEvaluate {
171134

172135
// If it's a secure cluster, add the keytab as an extra config, and set the krb5 conf in the JVM options.
173136
if (integTestTaskName.equals('integTestSecure') || integTestTaskName.equals('integTestSecureHa')) {
174-
Path elasticsearchKT = project(':test:fixtures:krb5kdc-fixture').buildDir.toPath().resolve("keytabs").resolve("elasticsearch.keytab").toAbsolutePath()
175-
Path krb5conf = project(':test:fixtures:krb5kdc-fixture').buildDir.toPath().resolve("conf").resolve("krb5.conf").toAbsolutePath()
176-
177-
restIntegTestTask.clusterConfig.extraConfigFile("repository-hdfs/krb5.keytab", "${elasticsearchKT}")
137+
String krb5conf = project(':test:fixtures:krb5kdc-fixture').ext.krb5Conf("hdfs")
138+
restIntegTestTask.clusterConfig.extraConfigFile(
139+
"repository-hdfs/krb5.keytab",
140+
"${project(':test:fixtures:krb5kdc-fixture').ext.krb5Keytabs("hdfs", "elasticsearch.keytab")}"
141+
)
178142
jvmArgs = jvmArgs + " " + "-Djava.security.krb5.conf=${krb5conf}"
179143
if (project.runtimeJavaVersion == JavaVersion.VERSION_1_9) {
180144
jvmArgs = jvmArgs + " " + '--add-opens=java.security.jgss/sun.security.krb5=ALL-UNNAMED'
@@ -190,9 +154,10 @@ project.afterEvaluate {
190154
if (project.runtimeJavaVersion == JavaVersion.VERSION_1_9) {
191155
restIntegTestTaskRunner.jvmArg '--add-opens=java.security.jgss/sun.security.krb5=ALL-UNNAMED'
192156
}
193-
194-
Path hdfsKT = project(':test:fixtures:krb5kdc-fixture').buildDir.toPath().resolve("keytabs").resolve("hdfs_hdfs.build.elastic.co.keytab").toAbsolutePath()
195-
restIntegTestTaskRunner.systemProperty "test.krb5.keytab.hdfs", "${hdfsKT}"
157+
restIntegTestTaskRunner.systemProperty (
158+
"test.krb5.keytab.hdfs",
159+
project(':test:fixtures:krb5kdc-fixture').ext.krb5Keytabs("hdfs","hdfs_hdfs.build.elastic.co.keytab")
160+
)
196161
}
197162
}
198163

@@ -270,41 +235,25 @@ if (fixtureSupported) {
270235
integTestHa.setEnabled(false)
271236
}
272237

273-
// Secure HDFS testing relies on the Vagrant based Kerberos fixture.
274-
boolean secureFixtureSupported = false
275-
if (fixtureSupported) {
276-
secureFixtureSupported = project.rootProject.vagrantSupported
277-
}
278-
279-
if (secureFixtureSupported) {
280-
project.check.dependsOn(integTestSecure)
281-
project.check.dependsOn(integTestSecureHa)
238+
check.dependsOn(integTestSecure, integTestSecureHa)
282239

283-
// Fixture dependencies
284-
integTestSecureCluster.dependsOn secureHdfsFixture, krb5kdcFixture
285-
integTestSecureHaCluster.dependsOn secureHaHdfsFixture, krb5kdcFixture
240+
// Fixture dependencies
241+
integTestSecureCluster.dependsOn secureHdfsFixture
242+
integTestSecureHaCluster.dependsOn secureHaHdfsFixture
286243

287-
// Set the keytab files in the classpath so that we can access them from test code without the security manager
288-
// freaking out.
289-
Path hdfsKeytabPath = project(':test:fixtures:krb5kdc-fixture').buildDir.toPath().resolve("keytabs")
290-
project.dependencies {
291-
testRuntime fileTree(dir: hdfsKeytabPath.toString(), include: ['*.keytab'])
292-
}
293-
294-
// Run just the secure hdfs rest test suite.
295-
integTestSecureRunner.systemProperty 'tests.rest.suite', 'secure_hdfs_repository'
296-
// Ignore HA integration Tests. They are included below as part of integTestSecureHa test runner.
297-
integTestSecureRunner.exclude('**/Ha*TestSuiteIT.class')
298-
299-
// Only include the HA integration tests for the HA test task
300-
integTestSecureHaRunner.patternSet.setIncludes(['**/Ha*TestSuiteIT.class'])
301-
} else {
302-
// Security tests unsupported. Don't run these tests.
303-
integTestSecure.enabled = false
304-
integTestSecureHa.enabled = false
305-
testingConventions.enabled = false
244+
// Set the keytab files in the classpath so that we can access them from test code without the security manager
245+
// freaking out.
246+
project.dependencies {
247+
testRuntime fileTree(dir: project(':test:fixtures:krb5kdc-fixture').ext.krb5Keytabs("hdfs","hdfs_hdfs.build.elastic.co.keytab").parent, include: ['*.keytab'])
306248
}
307249

250+
// Run just the secure hdfs rest test suite.
251+
integTestSecureRunner.systemProperty 'tests.rest.suite', 'secure_hdfs_repository'
252+
// Ignore HA integration Tests. They are included below as part of integTestSecureHa test runner.
253+
integTestSecureRunner.exclude('**/Ha*TestSuiteIT.class')
254+
// Only include the HA integration tests for the HA test task
255+
integTestSecureHaRunner.patternSet.setIncludes(['**/Ha*TestSuiteIT.class'])
256+
308257
thirdPartyAudit {
309258
ignoreMissingClasses()
310259
ignoreViolations (

test/fixtures/hdfs-fixture/Dockerfile

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
FROM java:8-jre
2+
3+
RUN apt-get update && apt-get install net-tools
4+
5+
EXPOSE 9998
6+
EXPOSE 9999
7+
8+
CMD java -cp "/fixture:/fixture/*" hdfs.MiniHDFS /data

test/fixtures/hdfs-fixture/build.gradle

+13-15
Original file line numberDiff line numberDiff line change
@@ -18,25 +18,23 @@
1818
*/
1919

2020
apply plugin: 'elasticsearch.build'
21+
apply plugin: 'elasticsearch.test.fixtures'
2122

22-
versions << [
23-
'hadoop2': '2.8.1'
24-
]
25-
26-
// we create MiniHdfsCluster with the hadoop artifact
2723
dependencies {
28-
compile "org.apache.hadoop:hadoop-minicluster:${versions.hadoop2}"
24+
compile "org.apache.hadoop:hadoop-minicluster:2.8.1"
25+
}
26+
27+
task syncClasses(type: Sync) {
28+
from sourceSets.test.runtimeClasspath
29+
into "${buildDir}/fixture"
2930
}
3031

31-
// for testing, until fixtures are actually debuggable.
32-
// gradle hides *EVERYTHING* so you have no clue what went wrong.
33-
task hdfs(type: JavaExec) {
34-
classpath = sourceSets.test.compileClasspath + sourceSets.test.output
35-
main = "hdfs.MiniHDFS"
36-
args = [ 'build/fixtures/hdfsFixture' ]
32+
preProcessFixture {
33+
dependsOn syncClasses
34+
35+
doLast {
36+
file("${buildDir}/shared").mkdirs()
37+
}
3738
}
3839

39-
// just a test fixture: we aren't using jars in releases
40-
thirdPartyAudit.enabled = false
41-
// TODO: add a simple HDFS client test for this fixture
4240
unitTest.enabled = false
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
version: '3'
2+
services:
3+
hdfs:
4+
hostname: hdfs.build.elastic.co
5+
build:
6+
context: .
7+
dockerfile: Dockerfile
8+
volumes:
9+
- ./build/fixture:/fixture
10+
ports:
11+
- "9999:9999"

test/fixtures/hdfs-fixture/src/main/java/hdfs/MiniHDFS.java

-1
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,6 @@ public static void main(String[] args) throws Exception {
9898

9999
UserGroupInformation.setConfiguration(cfg);
100100

101-
// TODO: remove hardcoded port!
102101
MiniDFSCluster.Builder builder = new MiniDFSCluster.Builder(cfg);
103102
if (secure) {
104103
builder.nameNodePort(9998);
+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
FROM ubuntu:14.04
2+
ADD . /fixture
3+
RUN echo kerberos.build.elastic.co > /etc/hostname && echo "127.0.0.1 kerberos.build.elastic.co" >> /etc/hosts
4+
RUN bash /fixture/src/main/resources/provision/installkdc.sh
5+
6+
EXPOSE 88
7+
EXPOSE 88/udp
8+
9+
CMD sleep infinity

test/fixtures/krb5kdc-fixture/Vagrantfile

-53
This file was deleted.

0 commit comments

Comments
 (0)