Build: introduce keystoreFile for cluster config (#29491)
This commit introduces built in support for adding files to the keystore when configuring the integration test cluster for a project. In order to use this support, simply add `keystoreFile` followed by the secure setting name and the path to the source file inside the integTestCluster closure for a project. The built in support will handle the creation of the keystore and the addition of the file to the keystore.
This commit is contained in:
parent
fac009630d
commit
e0ec8571ea
|
@ -141,6 +141,8 @@ class ClusterConfiguration {
|
||||||
|
|
||||||
Map<String, String> keystoreSettings = new HashMap<>()
|
Map<String, String> keystoreSettings = new HashMap<>()
|
||||||
|
|
||||||
|
Map<String, Object> keystoreFiles = new HashMap<>()
|
||||||
|
|
||||||
// map from destination path, to source file
|
// map from destination path, to source file
|
||||||
Map<String, Object> extraConfigFiles = new HashMap<>()
|
Map<String, Object> extraConfigFiles = new HashMap<>()
|
||||||
|
|
||||||
|
@ -167,6 +169,15 @@ class ClusterConfiguration {
|
||||||
keystoreSettings.put(name, value)
|
keystoreSettings.put(name, value)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a file to the keystore. The name is the secure setting name, and the sourceFile
|
||||||
|
* is anything accepted by project.file()
|
||||||
|
*/
|
||||||
|
@Input
|
||||||
|
void keystoreFile(String name, Object sourceFile) {
|
||||||
|
keystoreFiles.put(name, sourceFile)
|
||||||
|
}
|
||||||
|
|
||||||
@Input
|
@Input
|
||||||
void plugin(String path) {
|
void plugin(String path) {
|
||||||
Project pluginProject = project.project(path)
|
Project pluginProject = project.project(path)
|
||||||
|
|
|
@ -180,6 +180,7 @@ class ClusterFormationTasks {
|
||||||
setup = configureWriteConfigTask(taskName(prefix, node, 'configure'), project, setup, node, seedNode)
|
setup = configureWriteConfigTask(taskName(prefix, node, 'configure'), project, setup, node, seedNode)
|
||||||
setup = configureCreateKeystoreTask(taskName(prefix, node, 'createKeystore'), project, setup, node)
|
setup = configureCreateKeystoreTask(taskName(prefix, node, 'createKeystore'), project, setup, node)
|
||||||
setup = configureAddKeystoreSettingTasks(prefix, project, setup, node)
|
setup = configureAddKeystoreSettingTasks(prefix, project, setup, node)
|
||||||
|
setup = configureAddKeystoreFileTasks(prefix, project, setup, node)
|
||||||
|
|
||||||
if (node.config.plugins.isEmpty() == false) {
|
if (node.config.plugins.isEmpty() == false) {
|
||||||
if (node.nodeVersion == VersionProperties.elasticsearch) {
|
if (node.nodeVersion == VersionProperties.elasticsearch) {
|
||||||
|
@ -323,7 +324,7 @@ class ClusterFormationTasks {
|
||||||
|
|
||||||
/** Adds a task to create keystore */
|
/** Adds a task to create keystore */
|
||||||
static Task configureCreateKeystoreTask(String name, Project project, Task setup, NodeInfo node) {
|
static Task configureCreateKeystoreTask(String name, Project project, Task setup, NodeInfo node) {
|
||||||
if (node.config.keystoreSettings.isEmpty()) {
|
if (node.config.keystoreSettings.isEmpty() && node.config.keystoreFiles.isEmpty()) {
|
||||||
return setup
|
return setup
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
|
@ -357,6 +358,37 @@ class ClusterFormationTasks {
|
||||||
return parentTask
|
return parentTask
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Adds tasks to add files to the keystore */
|
||||||
|
static Task configureAddKeystoreFileTasks(String parent, Project project, Task setup, NodeInfo node) {
|
||||||
|
Map<String, Object> kvs = node.config.keystoreFiles
|
||||||
|
if (kvs.isEmpty()) {
|
||||||
|
return setup
|
||||||
|
}
|
||||||
|
Task parentTask = setup
|
||||||
|
/*
|
||||||
|
* We have to delay building the string as the path will not exist during configuration which will fail on Windows due to getting
|
||||||
|
* the short name requiring the path to already exist.
|
||||||
|
*/
|
||||||
|
final Object esKeystoreUtil = "${-> node.binPath().resolve('elasticsearch-keystore').toString()}"
|
||||||
|
for (Map.Entry<String, Object> entry in kvs) {
|
||||||
|
String key = entry.getKey()
|
||||||
|
String name = taskName(parent, node, 'addToKeystore#' + key)
|
||||||
|
String srcFileName = entry.getValue()
|
||||||
|
Task t = configureExecTask(name, project, parentTask, node, esKeystoreUtil, 'add-file', key, srcFileName)
|
||||||
|
t.doFirst {
|
||||||
|
File srcFile = project.file(srcFileName)
|
||||||
|
if (srcFile.isDirectory()) {
|
||||||
|
throw new GradleException("Source for keystoreFile must be a file: ${srcFile}")
|
||||||
|
}
|
||||||
|
if (srcFile.exists() == false) {
|
||||||
|
throw new GradleException("Source file for keystoreFile does not exist: ${srcFile}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
parentTask = t
|
||||||
|
}
|
||||||
|
return parentTask
|
||||||
|
}
|
||||||
|
|
||||||
static Task configureExtraConfigFilesTask(String name, Project project, Task setup, NodeInfo node) {
|
static Task configureExtraConfigFilesTask(String name, Project project, Task setup, NodeInfo node) {
|
||||||
if (node.config.extraConfigFiles.isEmpty()) {
|
if (node.config.extraConfigFiles.isEmpty()) {
|
||||||
return setup
|
return setup
|
||||||
|
|
|
@ -100,9 +100,7 @@ task createServiceAccountFile() {
|
||||||
|
|
||||||
integTestCluster {
|
integTestCluster {
|
||||||
dependsOn createServiceAccountFile, googleCloudStorageFixture
|
dependsOn createServiceAccountFile, googleCloudStorageFixture
|
||||||
setupCommand 'create-elasticsearch-keystore', 'bin/elasticsearch-keystore', 'create'
|
keystoreFile 'gcs.client.integration_test.credentials_file', "${serviceAccountFile.absolutePath}"
|
||||||
setupCommand 'add-credentials-to-elasticsearch-keystore',
|
|
||||||
'bin/elasticsearch-keystore', 'add-file', 'gcs.client.integration_test.credentials_file', "${serviceAccountFile.absolutePath}"
|
|
||||||
|
|
||||||
/* Use a closure on the string to delay evaluation until tests are executed */
|
/* Use a closure on the string to delay evaluation until tests are executed */
|
||||||
setting 'gcs.client.integration_test.endpoint', "http://${ -> googleCloudStorageFixture.addressAndPort }"
|
setting 'gcs.client.integration_test.endpoint', "http://${ -> googleCloudStorageFixture.addressAndPort }"
|
||||||
|
|
Loading…
Reference in New Issue