Skip to content

Commit 2194392

Browse files
mach6lukeis
authored andcommitted
Fix/Add support for node servlets (#2683)
Support for node -servlets bound to '/extra/ and '/resources/' was broken when the pre-existing (2.x/rc) SeleniumServer code was removed. This change set adds support back. * Updated interface GridNodeServer * Updated (new) SeleniumServer class to accept/process extra servlets * Updated SelfRegisteringRemote to process nodeConfig.servlets that are passed. * Update tests in this area Misc Other; * Unrelated fixes to GridLauncherV3 (unused import, code path correction)
1 parent 17637fa commit 2194392

5 files changed

Lines changed: 137 additions & 17 deletions

File tree

java/server/src/org/openqa/grid/internal/utils/SelfRegisteringRemote.java

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
import org.openqa.grid.internal.utils.configuration.GridHubConfiguration;
3333
import org.openqa.grid.internal.utils.configuration.GridNodeConfiguration;
3434
import org.openqa.grid.shared.GridNodeServer;
35+
import org.openqa.grid.web.servlet.ResourceServlet;
36+
import org.openqa.grid.web.utils.ExtraServletUtil;
3537
import org.openqa.selenium.Platform;
3638
import org.openqa.selenium.remote.DesiredCapabilities;
3739
import org.openqa.selenium.remote.internal.HttpClientFactory;
@@ -43,19 +45,27 @@
4345
import java.net.MalformedURLException;
4446
import java.net.URL;
4547
import java.security.InvalidParameterException;
48+
import java.util.HashMap;
49+
import java.util.List;
50+
import java.util.Map;
4651
import java.util.logging.Logger;
4752

53+
import javax.servlet.Servlet;
54+
4855
public class SelfRegisteringRemote {
4956

5057
private static final Logger LOG = Logger.getLogger(SelfRegisteringRemote.class.getName());
5158

52-
private RegistrationRequest nodeConfig;
59+
private final RegistrationRequest nodeConfig;
5360

5461
private final HttpClientFactory httpClientFactory;
5562

63+
private final Map<String, Class<? extends Servlet>> nodeServlets;
64+
5665
public SelfRegisteringRemote(RegistrationRequest config) {
5766
this.nodeConfig = config;
5867
this.httpClientFactory = new HttpClientFactory();
68+
this.nodeServlets = new HashMap<>();
5969

6070
nodeConfig.validate();
6171

@@ -72,6 +82,13 @@ public SelfRegisteringRemote(RegistrationRequest config) {
7282
"error getting the parameters from the hub. The node may end up with wrong timeouts." + e
7383
.getMessage());
7484
}
85+
86+
// add the resource servlet for nodes
87+
nodeServlets.put("/resources/*", ResourceServlet.class);
88+
89+
// add the user supplied servlet(s) for nodes
90+
addExtraServlets(nodeConfig.getConfiguration().servlets);
91+
7592
}
7693

7794
public URL getRemoteURL() {
@@ -96,6 +113,7 @@ public void startRemoteServer() throws Exception {
96113
if (server == null) {
97114
throw new GridConfigurationException("no server set to register to the hub");
98115
}
116+
server.setExtraServlets(nodeServlets);
99117
server.boot();
100118
}
101119

@@ -200,6 +218,20 @@ public GridNodeConfiguration getConfiguration() {
200218
return nodeConfig.getConfiguration();
201219
}
202220

221+
/**
222+
* @return the {@link GridNodeServer} for this remote
223+
*/
224+
protected GridNodeServer getServer() {
225+
return server;
226+
}
227+
228+
/**
229+
* @return the list of {@link Servlet}s that this remote will bind
230+
*/
231+
protected Map<String, Class <? extends Servlet>> getNodeServlets() {
232+
return nodeServlets;
233+
}
234+
203235
private void registerToHub(boolean checkPresenceFirst) {
204236
if (!checkPresenceFirst || !isAlreadyRegistered(nodeConfig)) {
205237
String tmp =
@@ -234,6 +266,21 @@ private void registerToHub(boolean checkPresenceFirst) {
234266

235267
}
236268

269+
private void addExtraServlets(List<String> servlets) {
270+
if (servlets == null || servlets.size() == 0) {
271+
return;
272+
}
273+
274+
for (String s : servlets) {
275+
Class<? extends Servlet> servletClass = ExtraServletUtil.createServlet(s);
276+
if (servletClass != null) {
277+
String path = "/extra/" + servletClass.getSimpleName() + "/*";
278+
LOG.info("binding " + servletClass.getCanonicalName() + " to " + path);
279+
nodeServlets.put(path, servletClass);
280+
}
281+
}
282+
}
283+
237284
void updateConfigWithRealPort() throws MalformedURLException {
238285
if (nodeConfig.getConfiguration().port != 0) {
239286
return;

java/server/src/org/openqa/grid/selenium/GridLauncherV3.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import com.beust.jcommander.JCommander;
2323

2424
import org.openqa.grid.common.GridRole;
25-
import org.openqa.grid.common.JSONConfigurationUtils;
2625
import org.openqa.grid.common.RegistrationRequest;
2726
import org.openqa.grid.internal.utils.SelfRegisteringRemote;
2827
import org.openqa.grid.internal.utils.configuration.CoreRunnerConfiguration;
@@ -227,8 +226,8 @@ public void setConfiguration(String[] args) {
227226
//re-parse the args using any -hubConfig specified to init
228227
if (pending.hubConfig != null) {
229228
configuration = GridHubConfiguration.loadFromJSON(pending.hubConfig);
229+
new JCommander(configuration, args); //args take precedence
230230
}
231-
new JCommander(configuration, args); //args take precedence
232231
helpRequested = configuration.help;
233232
}
234233

@@ -248,8 +247,8 @@ public void setConfiguration(String[] args) {
248247
//re-parse the args using any -nodeConfig specified to init
249248
if (pending.nodeConfigFile != null) {
250249
configuration = GridNodeConfiguration.loadFromJSON(pending.nodeConfigFile);
250+
new JCommander(configuration, args); //args take precedence
251251
}
252-
new JCommander(configuration, args); //args take precedence
253252
helpRequested = configuration.help;
254253
if (configuration.port == null) {
255254
configuration.port = 5555;

java/server/src/org/openqa/grid/shared/GridNodeServer.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,16 @@
1717

1818
package org.openqa.grid.shared;
1919

20+
import org.openqa.grid.internal.utils.configuration.StandaloneConfiguration;
21+
22+
import java.util.Map;
23+
24+
import javax.servlet.Servlet;
25+
2026
public interface GridNodeServer {
2127
void boot() throws Exception;
2228
void stop();
2329
int getRealPort();
30+
void setExtraServlets(Map<String, Class<? extends Servlet>> extraServlets);
31+
void setConfiguration(StandaloneConfiguration configuration);
2432
}

java/server/src/org/openqa/selenium/remote/server/SeleniumServer.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
import org.seleniumhq.jetty9.servlet.ServletContextHandler;
3232
import org.seleniumhq.jetty9.util.thread.QueuedThreadPool;
3333

34+
import java.util.Map;
35+
3436
import javax.servlet.Servlet;
3537

3638
/**
@@ -41,6 +43,7 @@ public class SeleniumServer implements GridNodeServer {
4143
private Server server;
4244
private DefaultDriverSessions driverSessions;
4345
private StandaloneConfiguration configuration;
46+
private Map<String, Class<? extends Servlet>> extraServlets;
4447

4548
private Thread shutDownHook;
4649
/**
@@ -79,10 +82,22 @@ private void addRcSupport(ServletContextHandler handler) {
7982
}
8083
}
8184

85+
private void addExtraServlets(ServletContextHandler handler) {
86+
if (extraServlets != null && extraServlets.size() > 0) {
87+
for (String path : extraServlets.keySet()) {
88+
handler.addServlet(extraServlets.get(path), path);
89+
}
90+
}
91+
}
92+
8293
public void setConfiguration(StandaloneConfiguration configuration) {
8394
this.configuration = configuration;
8495
}
8596

97+
public void setExtraServlets(Map<String, Class<? extends Servlet>> extraServlets) {
98+
this.extraServlets = extraServlets;
99+
}
100+
86101
public void boot() {
87102
if (configuration.jettyThreads != null && configuration.jettyThreads > 0) {
88103
server = new Server(new QueuedThreadPool(configuration.jettyThreads));
@@ -107,6 +122,7 @@ public void boot() {
107122
}
108123

109124
addRcSupport(handler);
125+
addExtraServlets(handler);
110126

111127
server.setHandler(handler);
112128

java/server/test/org/openqa/grid/internal/utils/SelfRegisteringRemoteTest.java

Lines changed: 63 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,37 +22,87 @@
2222
import org.junit.Test;
2323
import org.openqa.grid.common.GridRole;
2424
import org.openqa.grid.common.RegistrationRequest;
25+
import org.openqa.grid.internal.utils.configuration.GridNodeConfiguration;
26+
import org.openqa.grid.internal.utils.configuration.StandaloneConfiguration;
2527
import org.openqa.grid.shared.GridNodeServer;
28+
import org.openqa.grid.web.servlet.DisplayHelpServlet;
29+
import org.openqa.grid.web.servlet.ResourceServlet;
2630

2731
import java.net.MalformedURLException;
32+
import java.util.ArrayList;
33+
import java.util.Map;
34+
35+
import javax.servlet.Servlet;
2836

2937
public class SelfRegisteringRemoteTest {
3038

39+
private final class DummyGridNodeServer implements GridNodeServer {
40+
public Map<String, Class<? extends Servlet>> extraServlets;
41+
42+
@Override
43+
public void boot() throws Exception { }
44+
45+
@Override
46+
public void stop() { }
47+
48+
@Override
49+
public int getRealPort() {
50+
return 1234;
51+
}
52+
53+
@Override
54+
public void setConfiguration(StandaloneConfiguration configuration) { }
55+
56+
@Override
57+
public void setExtraServlets(Map<String, Class<? extends Servlet>> extraServlets) {
58+
this.extraServlets = extraServlets;
59+
}
60+
}
61+
62+
3163
@Test
3264
public void testHubRegistrationWhenPortExplicitlyZeroedOut() throws MalformedURLException {
33-
GridNodeServer server = new GridNodeServer() {
34-
@Override
35-
public void boot() throws Exception {}
36-
37-
@Override
38-
public void stop() {}
39-
40-
@Override
41-
public int getRealPort() {
42-
return 1234;
43-
}
44-
};
65+
GridNodeServer server = new DummyGridNodeServer();
4566
RegistrationRequest config = new RegistrationRequest();
4667
config.setRole(GridRole.NODE);
4768
config.getConfiguration().port = 0;
4869
config.getConfiguration().hub = "http://locahost:4444";
4970
SelfRegisteringRemote remote = new SelfRegisteringRemote(config);
5071
remote.setRemoteServer(server);
5172
remote.updateConfigWithRealPort();
52-
String host = (String) remote.getConfiguration().getRemoteHost();
73+
String host = remote.getConfiguration().getRemoteHost();
5374
assertEquals("Ensure that the remote host is updated properly",
5475
"http://localhost:" + server.getRealPort(), host);
5576

5677
}
5778

79+
@Test
80+
public void testSetExtraServlets() throws Exception {
81+
GridNodeServer server = new DummyGridNodeServer();
82+
83+
GridNodeConfiguration configuration = new GridNodeConfiguration();
84+
configuration.servlets = new ArrayList<>();
85+
configuration.servlets.add("org.openqa.grid.web.servlet.DisplayHelpServlet");
86+
87+
RegistrationRequest registrationRequest = RegistrationRequest.build(configuration);
88+
SelfRegisteringRemote remote = new SelfRegisteringRemote(registrationRequest);
89+
90+
// there should be two servlets on the remote's map -- The resource servlet, and the one
91+
// we added above.
92+
assertEquals(2, remote.getNodeServlets().size());
93+
assertEquals(ResourceServlet.class, remote.getNodeServlets().get("/resources/*"));
94+
assertEquals(DisplayHelpServlet.class,
95+
remote.getNodeServlets().get("/extra/DisplayHelpServlet/*"));
96+
97+
// set the sever and make sure it gets the extra servlets
98+
remote.setRemoteServer(server);
99+
remote.startRemoteServer(); // does not actually start anything.
100+
101+
// verify the expected extra servlets also made it to the server instance
102+
assertEquals(2, ((DummyGridNodeServer) server).extraServlets.size());
103+
assertEquals(ResourceServlet.class,
104+
((DummyGridNodeServer) server).extraServlets.get("/resources/*"));
105+
assertEquals(DisplayHelpServlet.class,
106+
((DummyGridNodeServer) server).extraServlets.get("/extra/DisplayHelpServlet/*"));
107+
}
58108
}

0 commit comments

Comments
 (0)