Skip to content

Commit 034cb57

Browse files
authored
Adding a readiness check before using services in tests (#2099)
1 parent 92e298c commit 034cb57

File tree

7 files changed

+88
-3
lines changed

7 files changed

+88
-3
lines changed

buildSrc/src/main/groovy/org/elasticsearch/hadoop/gradle/fixture/hadoop/HadoopClusterFormationTasks.groovy

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -485,12 +485,17 @@ class HadoopClusterFormationTasks {
485485
resourceexists {
486486
file(file: instance.pidFile.toString())
487487
}
488+
or {
489+
instance.readinessCheckSocketAddress == null
490+
socket(server: instance.readinessCheckSocketAddress.hostName, port: instance.readinessCheckSocketAddress.port)
491+
}
488492
}
489493
}
490494
}
491495
// Timed out waiting for pidfiles or failures
492496
if (project.ant.properties.containsKey("failed${name}".toString())) {
493-
waitFailed(project, instance, project.logger, "Failed to start hadoop cluster: timed out after ${waitSeconds} seconds")
497+
waitFailed(project, instance, project.logger, "Failed to start ${instance.config.roleDescriptor.roleName()}: timed out " +
498+
"after ${waitSeconds} seconds")
494499
}
495500

496501
// Check to see if there were any failed markers

buildSrc/src/main/groovy/org/elasticsearch/hadoop/gradle/fixture/hadoop/InstanceInfo.groovy

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ class InstanceInfo {
6363
/** the pid file the node will use */
6464
File pidFile
6565

66+
InetSocketAddress readinessCheckSocketAddress
67+
6668
/** service home dir */
6769
File homeDir
6870

@@ -151,6 +153,7 @@ class InstanceInfo {
151153
pidFile = new File(baseDir, config.getServiceDescriptor().pidFileName(config))
152154
homeDir = new File(baseDir, config.getServiceDescriptor().homeDirName(config))
153155
confDir = new File(homeDir, config.getServiceDescriptor().confDirName(config))
156+
readinessCheckSocketAddress = config.serviceDescriptor.readinessCheckHostAndPort(config)
154157

155158
configFiles = config.getServiceDescriptor().configFiles(config).collect { name -> new File(confDir, name) }
156159
configContents = config.getServiceDescriptor().collectConfigFilesContents(config)

buildSrc/src/main/groovy/org/elasticsearch/hadoop/gradle/fixture/hadoop/ServiceDescriptor.groovy

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,4 +149,11 @@ interface ServiceDescriptor {
149149
* home directory. If you need to perform set up operations with Gradle tasks, use configureSetupTasks.
150150
*/
151151
Map<String, Object[]> defaultSetupCommands(InstanceConfiguration configuration)
152+
153+
/**
154+
* This is a host/port that can be used to check if an instance of the service is ready to be used.
155+
* @param configuration The configuration of the instance we want to get the socket address for
156+
* @return An InetSocketAddress that can be used to check if the instance whose configuration is given is ready to be used
157+
*/
158+
InetSocketAddress readinessCheckHostAndPort(InstanceConfiguration configuration)
152159
}

buildSrc/src/main/groovy/org/elasticsearch/hadoop/gradle/fixture/hadoop/services/HadoopServiceDescriptor.groovy

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -207,9 +207,9 @@ class HadoopServiceDescriptor implements ServiceDescriptor {
207207
} else if (RESOURCEMANAGER.equals(role)) {
208208
FileSettings yarnSite = configFileContents.get('yarn-site.xml')
209209
if ('HTTPS_ONLY' == yarnSite.get('yarn.http.policy')) {
210-
return "https://${yarnSite.getOrDefault('yarn.resourcemanager.webapp.address', 'localhost:8090')}"
210+
return "https://${yarnSite.getOrDefault('yarn.resourcemanager.webapp.https.address', 'localhost:8090')}"
211211
} else {
212-
return "http://${yarnSite.getOrDefault('yarn.resourcemanager.webapp.https.address', 'localhost:8088')}"
212+
return "http://${yarnSite.getOrDefault('yarn.resourcemanager.webapp.address', 'localhost:8088')}"
213213
}
214214
} else if (NODEMANAGER.equals(role)) {
215215
FileSettings yarnSite = configFileContents.get('yarn-site.xml')
@@ -227,6 +227,48 @@ class HadoopServiceDescriptor implements ServiceDescriptor {
227227
throw new UnsupportedOperationException("Unknown instance [${role.roleName()}]")
228228
}
229229

230+
@Override
231+
InetSocketAddress readinessCheckHostAndPort(InstanceConfiguration configuration) {
232+
RoleDescriptor role = configuration.roleDescriptor
233+
SettingsContainer settingsContainer = configuration.getSettingsContainer()
234+
if (NAMENODE.equals(role)) {
235+
FileSettings hdfsSite = settingsContainer.getFile('hdfs-site.xml')
236+
if ('HTTPS_ONLY' == hdfsSite.get('dfs.http.policy')) {
237+
return getInetAddress(hdfsSite.getOrDefault('dfs.namenode.https-address', 'localhost:50470'))
238+
} else {
239+
return getInetAddress(hdfsSite.getOrDefault('dfs.namenode.http-address', 'localhost:50070'))
240+
}
241+
} else if (DATANODE.equals(role)) {
242+
FileSettings hdfsSite = settingsContainer.getFile('hdfs-site.xml')
243+
if ('HTTPS_ONLY' == hdfsSite.get('dfs.http.policy')) {
244+
return getInetAddress(hdfsSite.getOrDefault('dfs.datanode.https-address', 'localhost:50475'))
245+
} else {
246+
return getInetAddress(hdfsSite.getOrDefault('dfs.datanode.http-address', 'localhost:50075'))
247+
}
248+
} else if (RESOURCEMANAGER.equals(role)) {
249+
FileSettings yarnSite = settingsContainer.getFile('yarn-site.xml')
250+
if ('HTTPS_ONLY' == yarnSite.get('yarn.http.policy')) {
251+
return getInetAddress(yarnSite.getOrDefault('yarn.resourcemanager.webapp.https.address', 'localhost:8090'))
252+
} else {
253+
return getInetAddress(yarnSite.getOrDefault('yarn.resourcemanager.webapp.address', 'localhost:8088'))
254+
}
255+
} else if (NODEMANAGER.equals(role)) {
256+
FileSettings yarnSite = settingsContainer.getFile('yarn-site.xml')
257+
return getInetAddress(yarnSite.getOrDefault('yarn.nodemanager.webapp.address', 'localhost:8042'))
258+
} else if (HISTORYSERVER.equals(role)) {
259+
FileSettings mapredSite = settingsContainer.getFile('mapred-site.xml')
260+
return getInetAddress(mapredSite.getOrDefault('mapreduce.jobhistory.webapp.address', 'localhost:19888'))
261+
} else if (GATEWAY.equals(role)) {
262+
return null // No web interface for Gateway
263+
}
264+
throw new UnsupportedOperationException("Unknown instance [${role.roleName()}]")
265+
}
266+
267+
private static InetSocketAddress getInetAddress(String hostAndPort) {
268+
String[] hostAndPortArray = hostAndPort.split(":")
269+
return new InetSocketAddress(hostAndPortArray[0], Integer.valueOf(hostAndPortArray[1]))
270+
}
271+
230272
@Override
231273
List<String> startCommand(InstanceConfiguration configuration) {
232274
RoleDescriptor role = configuration.roleDescriptor

buildSrc/src/main/groovy/org/elasticsearch/hadoop/gradle/fixture/hadoop/services/HiveServiceDescriptor.groovy

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import org.elasticsearch.hadoop.gradle.fixture.hadoop.RoleDescriptor
2727
import org.elasticsearch.hadoop.gradle.fixture.hadoop.ServiceDescriptor
2828
import org.elasticsearch.hadoop.gradle.fixture.hadoop.conf.InstanceConfiguration
2929
import org.elasticsearch.hadoop.gradle.fixture.hadoop.conf.ServiceConfiguration
30+
import org.elasticsearch.hadoop.gradle.fixture.hadoop.conf.SettingsContainer
3031
import org.gradle.api.file.DuplicatesStrategy
3132
import org.gradle.api.tasks.Copy
3233
import org.gradle.api.tasks.Delete
@@ -124,6 +125,17 @@ class HiveServiceDescriptor implements ServiceDescriptor {
124125
throw new UnsupportedOperationException("Unknown instance [${configuration.roleDescriptor.roleName()}]")
125126
}
126127

128+
@Override
129+
InetSocketAddress readinessCheckHostAndPort(InstanceConfiguration configuration) {
130+
if (HIVESERVER.equals(configuration.roleDescriptor)) {
131+
FileSettings fileSettings = configuration.getSettingsContainer().getFile('hive-site.xml')
132+
String host = fileSettings.getOrDefault('hive.server2.thrift.bind.host', 'localhost')
133+
String port = fileSettings.getOrDefault('hive.server2.thrift.port', '10000')
134+
return new InetSocketAddress(host, Integer.valueOf(port))
135+
}
136+
throw new UnsupportedOperationException("Unknown instance [${configuration.roleDescriptor.roleName()}]")
137+
}
138+
127139
@Override
128140
List<String> startCommand(InstanceConfiguration configuration) {
129141
// We specify the hive root logger to print to console via the hiveconf override.

buildSrc/src/main/groovy/org/elasticsearch/hadoop/gradle/fixture/hadoop/services/PigServiceDescriptor.groovy

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,14 @@ class PigServiceDescriptor implements ServiceDescriptor {
119119
throw new UnsupportedOperationException("Unknown instance [${configuration.roleDescriptor.roleName()}]")
120120
}
121121

122+
@Override
123+
InetSocketAddress readinessCheckHostAndPort(InstanceConfiguration configuration) {
124+
if (GATEWAY.equals(configuration.roleDescriptor)) {
125+
return null
126+
}
127+
throw new UnsupportedOperationException("Unknown instance [${configuration.roleDescriptor.roleName()}]")
128+
}
129+
122130
@Override
123131
List<String> startCommand(InstanceConfiguration configuration) {
124132
return ['']

buildSrc/src/main/groovy/org/elasticsearch/hadoop/gradle/fixture/hadoop/services/SparkYarnServiceDescriptor.groovy

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,14 @@ class SparkYarnServiceDescriptor implements ServiceDescriptor {
127127
throw new UnsupportedOperationException("Unknown instance [${configuration.roleDescriptor.roleName()}]")
128128
}
129129

130+
@Override
131+
InetSocketAddress readinessCheckHostAndPort(InstanceConfiguration configuration) {
132+
if (GATEWAY.equals(configuration.roleDescriptor)) {
133+
return null
134+
}
135+
throw new UnsupportedOperationException("Unknown instance [${configuration.roleDescriptor.roleName()}]")
136+
}
137+
130138
@Override
131139
List<String> startCommand(InstanceConfiguration configuration) {
132140
// No start command for gateway services

0 commit comments

Comments
 (0)