Skip to content

Commit d791e08

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 482d980 commit d791e08

File tree

16 files changed

+184
-329
lines changed

16 files changed

+184
-329
lines changed

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import org.gradle.api.Task;
3232
import org.gradle.api.plugins.BasePlugin;
3333
import org.gradle.api.plugins.ExtraPropertiesExtension;
34-
import org.gradle.api.tasks.Input;
3534
import org.gradle.api.tasks.TaskContainer;
3635

3736
import java.lang.reflect.InvocationTargetException;
@@ -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 (OS.current().equals(OS.WINDOWS)) {
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()
@@ -170,10 +133,11 @@ project.afterEvaluate {
170133

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

@@ -269,41 +234,25 @@ if (fixtureSupported) {
269234
integTestHa.setEnabled(false)
270235
}
271236

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

282-
// Fixture dependencies
283-
integTestSecureCluster.dependsOn secureHdfsFixture, krb5kdcFixture
284-
integTestSecureHaCluster.dependsOn secureHaHdfsFixture, krb5kdcFixture
239+
// Fixture dependencies
240+
integTestSecureCluster.dependsOn secureHdfsFixture
241+
integTestSecureHaCluster.dependsOn secureHaHdfsFixture
285242

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

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