From 5184a87097e3dd5b4073bc19f812dc9831f932bd Mon Sep 17 00:00:00 2001 From: Rajendra Kadam Date: Thu, 11 Jun 2020 14:44:12 +0530 Subject: [PATCH 01/10] Add getDistributor based on implementaion required --- .../config/DistributorOptions.java | 31 +++++++++++++++++++ .../grid/distributor/remote/BUILD.bazel | 2 ++ .../distributor/remote/RemoteDistributor.java | 2 ++ 3 files changed, 35 insertions(+) diff --git a/java/server/src/org/openqa/selenium/grid/distributor/config/DistributorOptions.java b/java/server/src/org/openqa/selenium/grid/distributor/config/DistributorOptions.java index eb8c6544bc797..52e67050ad22c 100644 --- a/java/server/src/org/openqa/selenium/grid/distributor/config/DistributorOptions.java +++ b/java/server/src/org/openqa/selenium/grid/distributor/config/DistributorOptions.java @@ -24,16 +24,21 @@ import org.openqa.selenium.remote.http.HttpClient; import org.openqa.selenium.remote.tracing.Tracer; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.Optional; +import java.util.logging.Logger; import static org.openqa.selenium.net.Urls.fromUri; public class DistributorOptions { private static final String DISTRIBUTOR_SECTION = "distributor"; + private static final String DEFAULT_DISTRIBUTOR_SERVER = "org.openqa.selenium.grid.distributor.RemoteDistributor"; + private static final Logger LOG = Logger.getLogger(DistributorOptions.class.getName()); private final Config config; @@ -85,4 +90,30 @@ public Distributor getDistributor(Tracer tracer, HttpClient.Factory clientFactor clientFactory, distributorUrl); } + + public Distributor getDistributor() { + String clazz = config.get(DISTRIBUTOR_SECTION, "implementation").orElse(DEFAULT_DISTRIBUTOR_SERVER); + LOG.info("Creating distributor server: " + clazz); + try { + Class busClazz = Class.forName(clazz); + Method create = busClazz.getMethod("create", Config.class); + + if (!Modifier.isStatic(create.getModifiers())) { + throw new IllegalArgumentException(String.format( + "Distributor class %s's `create(Config)` method must be static", clazz)); + } + + if (!Distributor.class.isAssignableFrom(create.getReturnType())) { + throw new IllegalArgumentException(String.format( + "Distributor class %s's `create(Config)` method must return a Distributor", clazz)); + } + + return (Distributor) create.invoke(null, config); + } catch (NoSuchMethodException e) { + throw new IllegalArgumentException(String.format( + "Distributor class %s must have a static `create(Config)` method", clazz)); + } catch (ReflectiveOperationException e) { + throw new IllegalArgumentException("Unable to find event bus class: " + clazz, e); + } + } } diff --git a/java/server/src/org/openqa/selenium/grid/distributor/remote/BUILD.bazel b/java/server/src/org/openqa/selenium/grid/distributor/remote/BUILD.bazel index c288537101026..ee0be6e7bf3c3 100644 --- a/java/server/src/org/openqa/selenium/grid/distributor/remote/BUILD.bazel +++ b/java/server/src/org/openqa/selenium/grid/distributor/remote/BUILD.bazel @@ -14,5 +14,7 @@ java_library( "//java/server/src/org/openqa/selenium/grid/distributor", "//java/server/src/org/openqa/selenium/grid/node", "//java/server/src/org/openqa/selenium/grid/web", + "//java/server/src/org/openqa/selenium/grid/config", + "//java/server/src/org/openqa/selenium/grid/log" ], ) diff --git a/java/server/src/org/openqa/selenium/grid/distributor/remote/RemoteDistributor.java b/java/server/src/org/openqa/selenium/grid/distributor/remote/RemoteDistributor.java index e25252b09571b..c327e2fc070e9 100644 --- a/java/server/src/org/openqa/selenium/grid/distributor/remote/RemoteDistributor.java +++ b/java/server/src/org/openqa/selenium/grid/distributor/remote/RemoteDistributor.java @@ -18,9 +18,11 @@ package org.openqa.selenium.grid.distributor.remote; import org.openqa.selenium.SessionNotCreatedException; +import org.openqa.selenium.grid.config.Config; import org.openqa.selenium.grid.data.CreateSessionResponse; import org.openqa.selenium.grid.data.DistributorStatus; import org.openqa.selenium.grid.distributor.Distributor; +import org.openqa.selenium.grid.log.LoggingOptions; import org.openqa.selenium.grid.node.Node; import org.openqa.selenium.grid.web.Values; import org.openqa.selenium.internal.Require; From a2622a6bf631237cfb58ebda579690acae57b3bf Mon Sep 17 00:00:00 2001 From: Rajendra Kadam Date: Thu, 11 Jun 2020 15:30:29 +0530 Subject: [PATCH 02/10] Resolve deps for new getDistributor method --- .../grid/distributor/httpd/BUILD.bazel | 1 + .../distributor/httpd/DistributorServer.java | 29 +++---------------- .../grid/distributor/local/BUILD.bazel | 5 ++++ .../distributor/local/LocalDistributor.java | 16 ++++++++++ 4 files changed, 26 insertions(+), 25 deletions(-) diff --git a/java/server/src/org/openqa/selenium/grid/distributor/httpd/BUILD.bazel b/java/server/src/org/openqa/selenium/grid/distributor/httpd/BUILD.bazel index 78a1063d9ad0b..7798dc2c450bf 100644 --- a/java/server/src/org/openqa/selenium/grid/distributor/httpd/BUILD.bazel +++ b/java/server/src/org/openqa/selenium/grid/distributor/httpd/BUILD.bazel @@ -23,6 +23,7 @@ java_library( "//java/server/src/org/openqa/selenium/grid/sessionmap/config", "//java/server/src/org/openqa/selenium/grid/web", "//java/server/src/org/openqa/selenium/netty/server", + "//java/server/src/org/openqa/selenium/grid/distributor/config", artifact("com.beust:jcommander"), artifact("com.google.guava:guava"), ], diff --git a/java/server/src/org/openqa/selenium/grid/distributor/httpd/DistributorServer.java b/java/server/src/org/openqa/selenium/grid/distributor/httpd/DistributorServer.java index dec4cfd644891..e913f885792ba 100644 --- a/java/server/src/org/openqa/selenium/grid/distributor/httpd/DistributorServer.java +++ b/java/server/src/org/openqa/selenium/grid/distributor/httpd/DistributorServer.java @@ -23,27 +23,19 @@ import com.google.common.net.MediaType; import org.openqa.selenium.BuildInfo; import org.openqa.selenium.cli.CliCommand; -import org.openqa.selenium.events.EventBus; import org.openqa.selenium.grid.TemplateGridCommand; import org.openqa.selenium.grid.config.Config; import org.openqa.selenium.grid.config.Role; import org.openqa.selenium.grid.data.DistributorStatus; import org.openqa.selenium.grid.distributor.Distributor; -import org.openqa.selenium.grid.distributor.local.LocalDistributor; -import org.openqa.selenium.grid.log.LoggingOptions; +import org.openqa.selenium.grid.distributor.config.DistributorOptions; import org.openqa.selenium.grid.server.BaseServerOptions; -import org.openqa.selenium.grid.server.EventBusOptions; -import org.openqa.selenium.grid.server.NetworkOptions; import org.openqa.selenium.grid.server.Server; -import org.openqa.selenium.grid.sessionmap.SessionMap; -import org.openqa.selenium.grid.sessionmap.config.SessionMapOptions; import org.openqa.selenium.netty.server.NettyServer; import org.openqa.selenium.remote.http.Contents; -import org.openqa.selenium.remote.http.HttpClient; import org.openqa.selenium.remote.http.HttpHandler; import org.openqa.selenium.remote.http.HttpResponse; import org.openqa.selenium.remote.http.Route; -import org.openqa.selenium.remote.tracing.Tracer; import java.util.Collections; import java.util.Set; @@ -94,25 +86,12 @@ protected Config getDefaultConfig() { @Override protected void execute(Config config) { - LoggingOptions loggingOptions = new LoggingOptions(config); - Tracer tracer = loggingOptions.getTracer(); - - EventBusOptions events = new EventBusOptions(config); - EventBus bus = events.getEventBus(); - - NetworkOptions networkOptions = new NetworkOptions(config); - HttpClient.Factory clientFactory = networkOptions.getHttpClientFactory(tracer); + BaseServerOptions serverOptions = new BaseServerOptions(config); + DistributorOptions distributorOptions = new DistributorOptions(config); - SessionMap sessions = new SessionMapOptions(config).getSessionMap(); - BaseServerOptions serverOptions = new BaseServerOptions(config); + Distributor distributor = distributorOptions.getDistributor(); - Distributor distributor = new LocalDistributor( - tracer, - bus, - clientFactory, - sessions, - serverOptions.getRegistrationSecret()); HttpHandler readinessCheck = req -> { DistributorStatus status = distributor.getStatus(); if (status.hasCapacity()) { diff --git a/java/server/src/org/openqa/selenium/grid/distributor/local/BUILD.bazel b/java/server/src/org/openqa/selenium/grid/distributor/local/BUILD.bazel index 300f571bcb2f4..c282f733d91f0 100644 --- a/java/server/src/org/openqa/selenium/grid/distributor/local/BUILD.bazel +++ b/java/server/src/org/openqa/selenium/grid/distributor/local/BUILD.bazel @@ -19,6 +19,11 @@ java_library( "//java/server/src/org/openqa/selenium/grid/node", "//java/server/src/org/openqa/selenium/grid/node/remote", "//java/server/src/org/openqa/selenium/grid/sessionmap", + "//java/server/src/org/openqa/selenium/grid/config", + "//java/server/src/org/openqa/selenium/grid/log", + "//java/server/src/org/openqa/selenium/grid/server", + "//java/server/src/org/openqa/selenium/grid/sessionmap/config", + artifact("com.google.guava:guava"), ], ) diff --git a/java/server/src/org/openqa/selenium/grid/distributor/local/LocalDistributor.java b/java/server/src/org/openqa/selenium/grid/distributor/local/LocalDistributor.java index fc38403a50a0d..b2068c4cbcb49 100644 --- a/java/server/src/org/openqa/selenium/grid/distributor/local/LocalDistributor.java +++ b/java/server/src/org/openqa/selenium/grid/distributor/local/LocalDistributor.java @@ -25,6 +25,7 @@ import org.openqa.selenium.SessionNotCreatedException; import org.openqa.selenium.concurrent.Regularly; import org.openqa.selenium.events.EventBus; +import org.openqa.selenium.grid.config.Config; import org.openqa.selenium.grid.data.CreateSessionRequest; import org.openqa.selenium.grid.data.CreateSessionResponse; import org.openqa.selenium.grid.data.DistributorStatus; @@ -33,9 +34,14 @@ import org.openqa.selenium.grid.data.NodeRemovedEvent; import org.openqa.selenium.grid.data.NodeStatus; import org.openqa.selenium.grid.distributor.Distributor; +import org.openqa.selenium.grid.log.LoggingOptions; import org.openqa.selenium.grid.node.Node; import org.openqa.selenium.grid.node.remote.RemoteNode; +import org.openqa.selenium.grid.server.BaseServerOptions; +import org.openqa.selenium.grid.server.EventBusOptions; +import org.openqa.selenium.grid.server.NetworkOptions; import org.openqa.selenium.grid.sessionmap.SessionMap; +import org.openqa.selenium.grid.sessionmap.config.SessionMapOptions; import org.openqa.selenium.internal.Require; import org.openqa.selenium.json.Json; import org.openqa.selenium.json.JsonOutput; @@ -109,6 +115,16 @@ public LocalDistributor( bus.addListener(NODE_STATUS, event -> refresh(event.getData(NodeStatus.class))); } + public static Distributor create(Config config) { + Tracer tracer = new LoggingOptions(config).getTracer(); + EventBus bus = new EventBusOptions(config).getEventBus(); + HttpClient.Factory clientFactory = new NetworkOptions(config).getHttpClientFactory(tracer); + SessionMap sessions = new SessionMapOptions(config).getSessionMap(); + BaseServerOptions serverOptions = new BaseServerOptions(config); + + return new LocalDistributor(tracer, bus, clientFactory, sessions, serverOptions.getRegistrationSecret()); + } + @Override public CreateSessionResponse newSession(HttpRequest request) throws SessionNotCreatedException { From c8f426647783950c5c1d81cdacc3bcee96a8974c Mon Sep 17 00:00:00 2001 From: Rajendra Kadam Date: Thu, 11 Jun 2020 16:16:04 +0530 Subject: [PATCH 03/10] Update deps --- .../selenium/grid/distributor/config/BUILD.bazel | 1 - .../distributor/config/DistributorOptions.java | 14 -------------- .../grid/distributor/httpd/DistributorServer.java | 1 - .../selenium/grid/distributor/remote/BUILD.bazel | 4 +++- .../grid/distributor/remote/RemoteDistributor.java | 11 +++++++++++ .../selenium/grid/router/httpd/RouterServer.java | 2 +- 6 files changed, 15 insertions(+), 18 deletions(-) diff --git a/java/server/src/org/openqa/selenium/grid/distributor/config/BUILD.bazel b/java/server/src/org/openqa/selenium/grid/distributor/config/BUILD.bazel index 3c23ec7016264..0ae290650af42 100644 --- a/java/server/src/org/openqa/selenium/grid/distributor/config/BUILD.bazel +++ b/java/server/src/org/openqa/selenium/grid/distributor/config/BUILD.bazel @@ -11,7 +11,6 @@ java_library( "//java/client/src/org/openqa/selenium/remote", "//java/server/src/org/openqa/selenium/grid/config", "//java/server/src/org/openqa/selenium/grid/distributor", - "//java/server/src/org/openqa/selenium/grid/distributor/remote", artifact("com.beust:jcommander"), ], ) diff --git a/java/server/src/org/openqa/selenium/grid/distributor/config/DistributorOptions.java b/java/server/src/org/openqa/selenium/grid/distributor/config/DistributorOptions.java index 52e67050ad22c..7e09d16c73090 100644 --- a/java/server/src/org/openqa/selenium/grid/distributor/config/DistributorOptions.java +++ b/java/server/src/org/openqa/selenium/grid/distributor/config/DistributorOptions.java @@ -20,20 +20,14 @@ import org.openqa.selenium.grid.config.Config; import org.openqa.selenium.grid.config.ConfigException; import org.openqa.selenium.grid.distributor.Distributor; -import org.openqa.selenium.grid.distributor.remote.RemoteDistributor; -import org.openqa.selenium.remote.http.HttpClient; -import org.openqa.selenium.remote.tracing.Tracer; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.net.URI; import java.net.URISyntaxException; -import java.net.URL; import java.util.Optional; import java.util.logging.Logger; -import static org.openqa.selenium.net.Urls.fromUri; - public class DistributorOptions { private static final String DISTRIBUTOR_SECTION = "distributor"; @@ -83,14 +77,6 @@ public URI getDistributorUri() { } } - public Distributor getDistributor(Tracer tracer, HttpClient.Factory clientFactory) { - URL distributorUrl = fromUri(getDistributorUri()); - return new RemoteDistributor( - tracer, - clientFactory, - distributorUrl); - } - public Distributor getDistributor() { String clazz = config.get(DISTRIBUTOR_SECTION, "implementation").orElse(DEFAULT_DISTRIBUTOR_SERVER); LOG.info("Creating distributor server: " + clazz); diff --git a/java/server/src/org/openqa/selenium/grid/distributor/httpd/DistributorServer.java b/java/server/src/org/openqa/selenium/grid/distributor/httpd/DistributorServer.java index e913f885792ba..0d3afe9e46912 100644 --- a/java/server/src/org/openqa/selenium/grid/distributor/httpd/DistributorServer.java +++ b/java/server/src/org/openqa/selenium/grid/distributor/httpd/DistributorServer.java @@ -89,7 +89,6 @@ protected void execute(Config config) { BaseServerOptions serverOptions = new BaseServerOptions(config); DistributorOptions distributorOptions = new DistributorOptions(config); - Distributor distributor = distributorOptions.getDistributor(); HttpHandler readinessCheck = req -> { diff --git a/java/server/src/org/openqa/selenium/grid/distributor/remote/BUILD.bazel b/java/server/src/org/openqa/selenium/grid/distributor/remote/BUILD.bazel index ee0be6e7bf3c3..ebb624a07d33b 100644 --- a/java/server/src/org/openqa/selenium/grid/distributor/remote/BUILD.bazel +++ b/java/server/src/org/openqa/selenium/grid/distributor/remote/BUILD.bazel @@ -12,9 +12,11 @@ java_library( "//java/client/src/org/openqa/selenium/remote", "//java/server/src/org/openqa/selenium/grid/data", "//java/server/src/org/openqa/selenium/grid/distributor", + "//java/server/src/org/openqa/selenium/grid/distributor/config", "//java/server/src/org/openqa/selenium/grid/node", "//java/server/src/org/openqa/selenium/grid/web", "//java/server/src/org/openqa/selenium/grid/config", - "//java/server/src/org/openqa/selenium/grid/log" + "//java/server/src/org/openqa/selenium/grid/log", + "//java/server/src/org/openqa/selenium/grid/server" ], ) diff --git a/java/server/src/org/openqa/selenium/grid/distributor/remote/RemoteDistributor.java b/java/server/src/org/openqa/selenium/grid/distributor/remote/RemoteDistributor.java index c327e2fc070e9..49fde0036cf8e 100644 --- a/java/server/src/org/openqa/selenium/grid/distributor/remote/RemoteDistributor.java +++ b/java/server/src/org/openqa/selenium/grid/distributor/remote/RemoteDistributor.java @@ -22,8 +22,10 @@ import org.openqa.selenium.grid.data.CreateSessionResponse; import org.openqa.selenium.grid.data.DistributorStatus; import org.openqa.selenium.grid.distributor.Distributor; +import org.openqa.selenium.grid.distributor.config.DistributorOptions; import org.openqa.selenium.grid.log.LoggingOptions; import org.openqa.selenium.grid.node.Node; +import org.openqa.selenium.grid.server.NetworkOptions; import org.openqa.selenium.grid.web.Values; import org.openqa.selenium.internal.Require; import org.openqa.selenium.remote.http.HttpClient; @@ -37,6 +39,7 @@ import java.util.UUID; import java.util.logging.Logger; +import static org.openqa.selenium.net.Urls.fromUri; import static org.openqa.selenium.remote.http.Contents.asJson; import static org.openqa.selenium.remote.http.HttpMethod.DELETE; import static org.openqa.selenium.remote.http.HttpMethod.GET; @@ -52,6 +55,14 @@ public RemoteDistributor(Tracer tracer, HttpClient.Factory factory, URL url) { this.client = factory.createClient(url); } + public static Distributor create(Config config) { + Tracer tracer = new LoggingOptions(config).getTracer(); + HttpClient.Factory clientFactory = new NetworkOptions(config).getHttpClientFactory(tracer); + URL distributorUrl = fromUri(new DistributorOptions(config).getDistributorUri()); + + return new RemoteDistributor(tracer, clientFactory, distributorUrl); + } + @Override public CreateSessionResponse newSession(HttpRequest request) throws SessionNotCreatedException { diff --git a/java/server/src/org/openqa/selenium/grid/router/httpd/RouterServer.java b/java/server/src/org/openqa/selenium/grid/router/httpd/RouterServer.java index 5e1b93860e5d3..ada8bef27dfc2 100644 --- a/java/server/src/org/openqa/selenium/grid/router/httpd/RouterServer.java +++ b/java/server/src/org/openqa/selenium/grid/router/httpd/RouterServer.java @@ -102,7 +102,7 @@ protected void execute(Config config) { BaseServerOptions serverOptions = new BaseServerOptions(config); DistributorOptions distributorOptions = new DistributorOptions(config); - Distributor distributor = distributorOptions.getDistributor(tracer, clientFactory); + Distributor distributor = distributorOptions.getDistributor(); GraphqlHandler graphqlHandler = new GraphqlHandler(distributor, serverOptions.getExternalUri().toString()); From a3f740e54e632cb5a302df641ba6f00a4b9084c8 Mon Sep 17 00:00:00 2001 From: Rajendra Kadam Date: Thu, 11 Jun 2020 18:42:04 +0530 Subject: [PATCH 04/10] Change variable class name --- .../grid/distributor/config/DistributorOptions.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/java/server/src/org/openqa/selenium/grid/distributor/config/DistributorOptions.java b/java/server/src/org/openqa/selenium/grid/distributor/config/DistributorOptions.java index 7e09d16c73090..cb2ef54485ee6 100644 --- a/java/server/src/org/openqa/selenium/grid/distributor/config/DistributorOptions.java +++ b/java/server/src/org/openqa/selenium/grid/distributor/config/DistributorOptions.java @@ -81,8 +81,8 @@ public Distributor getDistributor() { String clazz = config.get(DISTRIBUTOR_SECTION, "implementation").orElse(DEFAULT_DISTRIBUTOR_SERVER); LOG.info("Creating distributor server: " + clazz); try { - Class busClazz = Class.forName(clazz); - Method create = busClazz.getMethod("create", Config.class); + Class distributorClazz = Class.forName(clazz); + Method create = distributorClazz.getMethod("create", Config.class); if (!Modifier.isStatic(create.getModifiers())) { throw new IllegalArgumentException(String.format( @@ -99,7 +99,7 @@ public Distributor getDistributor() { throw new IllegalArgumentException(String.format( "Distributor class %s must have a static `create(Config)` method", clazz)); } catch (ReflectiveOperationException e) { - throw new IllegalArgumentException("Unable to find event bus class: " + clazz, e); + throw new IllegalArgumentException("Unable to find distributor class: " + clazz, e); } } } From 885bf691e81861fb220277c650eb99fdce8d22ea Mon Sep 17 00:00:00 2001 From: Rajendra Kadam Date: Fri, 12 Jun 2020 12:32:16 +0530 Subject: [PATCH 05/10] Add Remote Distributor as default class --- .../selenium/grid/distributor/config/DistributorOptions.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/server/src/org/openqa/selenium/grid/distributor/config/DistributorOptions.java b/java/server/src/org/openqa/selenium/grid/distributor/config/DistributorOptions.java index cb2ef54485ee6..2328d6a0e9327 100644 --- a/java/server/src/org/openqa/selenium/grid/distributor/config/DistributorOptions.java +++ b/java/server/src/org/openqa/selenium/grid/distributor/config/DistributorOptions.java @@ -31,7 +31,7 @@ public class DistributorOptions { private static final String DISTRIBUTOR_SECTION = "distributor"; - private static final String DEFAULT_DISTRIBUTOR_SERVER = "org.openqa.selenium.grid.distributor.RemoteDistributor"; + private static final String DEFAULT_DISTRIBUTOR_SERVER = "org.openqa.selenium.grid.distributor.remote.RemoteDistributor"; private static final Logger LOG = Logger.getLogger(DistributorOptions.class.getName()); private final Config config; From ae500032f7a6eb2a0a8092c33b113b478f4cc4a4 Mon Sep 17 00:00:00 2001 From: Rajendra Kadam Date: Mon, 15 Jun 2020 13:14:25 +0530 Subject: [PATCH 06/10] Add getClass method --- .../openqa/selenium/grid/config/Config.java | 28 +++++++++++++++++++ .../config/DistributorOptions.java | 26 ++--------------- .../sessionmap/config/SessionMapOptions.java | 28 ++----------------- 3 files changed, 34 insertions(+), 48 deletions(-) diff --git a/java/server/src/org/openqa/selenium/grid/config/Config.java b/java/server/src/org/openqa/selenium/grid/config/Config.java index 8b9c44898396b..f460d7b6d4409 100644 --- a/java/server/src/org/openqa/selenium/grid/config/Config.java +++ b/java/server/src/org/openqa/selenium/grid/config/Config.java @@ -17,6 +17,8 @@ package org.openqa.selenium.grid.config; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; import java.util.List; import java.util.Optional; import java.util.Set; @@ -40,4 +42,30 @@ default Optional getInt(String section, String option) { default Optional getBool(String section, String option) { return get(section, option).map(Boolean::parseBoolean); } + + default Optional> getClass(String section, String option, Class typeOfClass, String defaultClazz) { + String clazz = get(section, option).orElse(defaultClazz); + + try { + Class ClassClazz = Class.forName(clazz); + Method create = ClassClazz.getMethod("create", Config.class); + + if (!Modifier.isStatic(create.getModifiers())) { + throw new IllegalArgumentException(String.format( + "Class %s's `create(Config)` method must be static", clazz)); + } + + if (!typeOfClass.isAssignableFrom(create.getReturnType())) { + throw new IllegalArgumentException(String.format( + "Class %s's `create(Config)` method must be static", clazz)); + } + + return (Optional>) create.invoke(null, this); + } catch (NoSuchMethodException e) { + throw new IllegalArgumentException(String.format( + "Class %s must have a static `create(Config)` method", clazz)); + } catch (ReflectiveOperationException e) { + throw new IllegalArgumentException("Unable to find class: " + clazz, e); + } + } } diff --git a/java/server/src/org/openqa/selenium/grid/distributor/config/DistributorOptions.java b/java/server/src/org/openqa/selenium/grid/distributor/config/DistributorOptions.java index 2328d6a0e9327..409ab7fa21710 100644 --- a/java/server/src/org/openqa/selenium/grid/distributor/config/DistributorOptions.java +++ b/java/server/src/org/openqa/selenium/grid/distributor/config/DistributorOptions.java @@ -78,28 +78,8 @@ public URI getDistributorUri() { } public Distributor getDistributor() { - String clazz = config.get(DISTRIBUTOR_SECTION, "implementation").orElse(DEFAULT_DISTRIBUTOR_SERVER); - LOG.info("Creating distributor server: " + clazz); - try { - Class distributorClazz = Class.forName(clazz); - Method create = distributorClazz.getMethod("create", Config.class); - - if (!Modifier.isStatic(create.getModifiers())) { - throw new IllegalArgumentException(String.format( - "Distributor class %s's `create(Config)` method must be static", clazz)); - } - - if (!Distributor.class.isAssignableFrom(create.getReturnType())) { - throw new IllegalArgumentException(String.format( - "Distributor class %s's `create(Config)` method must return a Distributor", clazz)); - } - - return (Distributor) create.invoke(null, config); - } catch (NoSuchMethodException e) { - throw new IllegalArgumentException(String.format( - "Distributor class %s must have a static `create(Config)` method", clazz)); - } catch (ReflectiveOperationException e) { - throw new IllegalArgumentException("Unable to find distributor class: " + clazz, e); - } + return config.getClass(DISTRIBUTOR_SECTION, "implementation", Distributor.class, DEFAULT_DISTRIBUTOR_SERVER) + .get() + .cast(Distributor.class); } } diff --git a/java/server/src/org/openqa/selenium/grid/sessionmap/config/SessionMapOptions.java b/java/server/src/org/openqa/selenium/grid/sessionmap/config/SessionMapOptions.java index 6682cdc5c5e14..4673ef22002b2 100644 --- a/java/server/src/org/openqa/selenium/grid/sessionmap/config/SessionMapOptions.java +++ b/java/server/src/org/openqa/selenium/grid/sessionmap/config/SessionMapOptions.java @@ -21,8 +21,6 @@ import org.openqa.selenium.grid.config.ConfigException; import org.openqa.selenium.grid.sessionmap.SessionMap; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; import java.net.URI; import java.net.URISyntaxException; import java.util.Optional; @@ -78,28 +76,8 @@ public URI getSessionMapUri() { } public SessionMap getSessionMap() { - String clazz = config.get(SESSIONS_SECTION, "implementation").orElse(DEFAULT_SESSION_MAP); - LOG.info("Creating session map: " + clazz); - try { - Class busClazz = Class.forName(clazz); - Method create = busClazz.getMethod("create", Config.class); - - if (!Modifier.isStatic(create.getModifiers())) { - throw new IllegalArgumentException(String.format( - "Session map class %s's `create(Config)` method must be static", clazz)); - } - - if (!SessionMap.class.isAssignableFrom(create.getReturnType())) { - throw new IllegalArgumentException(String.format( - "Session map class %s's `create(Config)` method must return a SessionMap", clazz)); - } - - return (SessionMap) create.invoke(null, config); - } catch (NoSuchMethodException e) { - throw new IllegalArgumentException(String.format( - "Session map class %s must have a static `create(Config)` method", clazz)); - } catch (ReflectiveOperationException e) { - throw new IllegalArgumentException("Unable to find event bus class: " + clazz, e); - } + return config.getClass(SESSIONS_SECTION, "implementation", SessionMap.class, DEFAULT_SESSION_MAP) + .get() + .cast(SessionMap.class); } } From d9fb4658f7ad4419dcc561791ab1781263550d75 Mon Sep 17 00:00:00 2001 From: Rajendra Kadam Date: Mon, 15 Jun 2020 13:27:28 +0530 Subject: [PATCH 07/10] Remove unused imports --- .../selenium/grid/distributor/config/DistributorOptions.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/java/server/src/org/openqa/selenium/grid/distributor/config/DistributorOptions.java b/java/server/src/org/openqa/selenium/grid/distributor/config/DistributorOptions.java index 409ab7fa21710..671e09e957ace 100644 --- a/java/server/src/org/openqa/selenium/grid/distributor/config/DistributorOptions.java +++ b/java/server/src/org/openqa/selenium/grid/distributor/config/DistributorOptions.java @@ -21,8 +21,6 @@ import org.openqa.selenium.grid.config.ConfigException; import org.openqa.selenium.grid.distributor.Distributor; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; import java.net.URI; import java.net.URISyntaxException; import java.util.Optional; From ba1b5e1a25120b271ed355ab2847b8fe1f174ee3 Mon Sep 17 00:00:00 2001 From: Rajendra Kadam Date: Tue, 16 Jun 2020 12:32:23 +0530 Subject: [PATCH 08/10] Update getClass method --- java/server/src/org/openqa/selenium/grid/config/Config.java | 4 ++-- .../selenium/grid/distributor/config/DistributorOptions.java | 4 +--- .../selenium/grid/sessionmap/config/SessionMapOptions.java | 4 +--- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/java/server/src/org/openqa/selenium/grid/config/Config.java b/java/server/src/org/openqa/selenium/grid/config/Config.java index f460d7b6d4409..a294bcc0e891e 100644 --- a/java/server/src/org/openqa/selenium/grid/config/Config.java +++ b/java/server/src/org/openqa/selenium/grid/config/Config.java @@ -43,7 +43,7 @@ default Optional getBool(String section, String option) { return get(section, option).map(Boolean::parseBoolean); } - default Optional> getClass(String section, String option, Class typeOfClass, String defaultClazz) { + default Object getClass(String section, String option, Class typeOfClass, String defaultClazz) { String clazz = get(section, option).orElse(defaultClazz); try { @@ -60,7 +60,7 @@ default Optional> getClass(String section, String option, Class "Class %s's `create(Config)` method must be static", clazz)); } - return (Optional>) create.invoke(null, this); + return create.invoke(null, this); } catch (NoSuchMethodException e) { throw new IllegalArgumentException(String.format( "Class %s must have a static `create(Config)` method", clazz)); diff --git a/java/server/src/org/openqa/selenium/grid/distributor/config/DistributorOptions.java b/java/server/src/org/openqa/selenium/grid/distributor/config/DistributorOptions.java index 671e09e957ace..2244c2a32d2d0 100644 --- a/java/server/src/org/openqa/selenium/grid/distributor/config/DistributorOptions.java +++ b/java/server/src/org/openqa/selenium/grid/distributor/config/DistributorOptions.java @@ -76,8 +76,6 @@ public URI getDistributorUri() { } public Distributor getDistributor() { - return config.getClass(DISTRIBUTOR_SECTION, "implementation", Distributor.class, DEFAULT_DISTRIBUTOR_SERVER) - .get() - .cast(Distributor.class); + return (Distributor) config.getClass(DISTRIBUTOR_SECTION, "implementation", Distributor.class, DEFAULT_DISTRIBUTOR_SERVER); } } diff --git a/java/server/src/org/openqa/selenium/grid/sessionmap/config/SessionMapOptions.java b/java/server/src/org/openqa/selenium/grid/sessionmap/config/SessionMapOptions.java index 4673ef22002b2..efa5f43ca63d6 100644 --- a/java/server/src/org/openqa/selenium/grid/sessionmap/config/SessionMapOptions.java +++ b/java/server/src/org/openqa/selenium/grid/sessionmap/config/SessionMapOptions.java @@ -76,8 +76,6 @@ public URI getSessionMapUri() { } public SessionMap getSessionMap() { - return config.getClass(SESSIONS_SECTION, "implementation", SessionMap.class, DEFAULT_SESSION_MAP) - .get() - .cast(SessionMap.class); + return (SessionMap) config.getClass(SESSIONS_SECTION, "implementation", SessionMap.class, DEFAULT_SESSION_MAP); } } From 1890820418444a60bfeead6386bf844df4cf390d Mon Sep 17 00:00:00 2001 From: Rajendra Kadam Date: Tue, 16 Jun 2020 15:16:44 +0530 Subject: [PATCH 09/10] Use getClass for EventBus implementation --- .../selenium/grid/server/EventBusOptions.java | 24 +------------------ 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/java/server/src/org/openqa/selenium/grid/server/EventBusOptions.java b/java/server/src/org/openqa/selenium/grid/server/EventBusOptions.java index 392bef2135e9f..ac7456662af25 100644 --- a/java/server/src/org/openqa/selenium/grid/server/EventBusOptions.java +++ b/java/server/src/org/openqa/selenium/grid/server/EventBusOptions.java @@ -50,28 +50,6 @@ public EventBus getEventBus() { } private EventBus createBus() { - String clazzName = config.get("events", "implementation").orElse(DEFAULT_CLASS); - LOG.info("Creating event bus: " + clazzName); - try { - Class busClazz = Class.forName(clazzName); - Method create = busClazz.getMethod("create", Config.class); - - if (!Modifier.isStatic(create.getModifiers())) { - throw new IllegalArgumentException(String.format( - "Event bus class %s's `create(Config)` method must be static", clazzName)); - } - - if (!EventBus.class.isAssignableFrom(create.getReturnType())) { - throw new IllegalArgumentException(String.format( - "Event bus class %s's `create(Config)` method must return an EventBus", clazzName)); - } - - return (EventBus) create.invoke(null, config); - } catch (NoSuchMethodException e) { - throw new IllegalArgumentException(String.format( - "Event bus class %s must have a static `create(Config)` method", clazzName)); - } catch (ReflectiveOperationException e) { - throw new IllegalArgumentException("Unable to find event bus class: " + clazzName, e); - } + return (EventBus) config.getClass("events", "implementation", EventBus.class, DEFAULT_CLASS); } } From 52fa1130486c08949940cd8ac61ca1a2f9b4d174 Mon Sep 17 00:00:00 2001 From: Rajendra Kadam Date: Tue, 16 Jun 2020 20:12:28 +0530 Subject: [PATCH 10/10] Create RemoteDistributor inline for RouterServer --- .../grid/distributor/config/DistributorOptions.java | 5 ++--- .../grid/distributor/httpd/DistributorServer.java | 3 ++- .../selenium/grid/distributor/remote/BUILD.bazel | 1 - .../grid/distributor/remote/RemoteDistributor.java | 12 ------------ .../openqa/selenium/grid/router/httpd/BUILD.bazel | 1 + .../selenium/grid/router/httpd/RouterServer.java | 11 ++++++++++- 6 files changed, 15 insertions(+), 18 deletions(-) diff --git a/java/server/src/org/openqa/selenium/grid/distributor/config/DistributorOptions.java b/java/server/src/org/openqa/selenium/grid/distributor/config/DistributorOptions.java index 2244c2a32d2d0..dc21cb87cbf95 100644 --- a/java/server/src/org/openqa/selenium/grid/distributor/config/DistributorOptions.java +++ b/java/server/src/org/openqa/selenium/grid/distributor/config/DistributorOptions.java @@ -29,7 +29,6 @@ public class DistributorOptions { private static final String DISTRIBUTOR_SECTION = "distributor"; - private static final String DEFAULT_DISTRIBUTOR_SERVER = "org.openqa.selenium.grid.distributor.remote.RemoteDistributor"; private static final Logger LOG = Logger.getLogger(DistributorOptions.class.getName()); private final Config config; @@ -75,7 +74,7 @@ public URI getDistributorUri() { } } - public Distributor getDistributor() { - return (Distributor) config.getClass(DISTRIBUTOR_SECTION, "implementation", Distributor.class, DEFAULT_DISTRIBUTOR_SERVER); + public Distributor getDistributor(String defaultClass) { + return (Distributor) config.getClass(DISTRIBUTOR_SECTION, "implementation", Distributor.class, defaultClass); } } diff --git a/java/server/src/org/openqa/selenium/grid/distributor/httpd/DistributorServer.java b/java/server/src/org/openqa/selenium/grid/distributor/httpd/DistributorServer.java index 0d3afe9e46912..78989ed0ac77a 100644 --- a/java/server/src/org/openqa/selenium/grid/distributor/httpd/DistributorServer.java +++ b/java/server/src/org/openqa/selenium/grid/distributor/httpd/DistributorServer.java @@ -53,6 +53,7 @@ public class DistributorServer extends TemplateGridCommand { private static final Logger LOG = Logger.getLogger(DistributorServer.class.getName()); + private static final String LOCAL_DISTRIBUTOR_SERVER = "org.openqa.selenium.grid.distributor.local.LocalDistributor"; @Override public String getName() { @@ -89,7 +90,7 @@ protected void execute(Config config) { BaseServerOptions serverOptions = new BaseServerOptions(config); DistributorOptions distributorOptions = new DistributorOptions(config); - Distributor distributor = distributorOptions.getDistributor(); + Distributor distributor = distributorOptions.getDistributor(LOCAL_DISTRIBUTOR_SERVER); HttpHandler readinessCheck = req -> { DistributorStatus status = distributor.getStatus(); diff --git a/java/server/src/org/openqa/selenium/grid/distributor/remote/BUILD.bazel b/java/server/src/org/openqa/selenium/grid/distributor/remote/BUILD.bazel index ebb624a07d33b..c4b78cbb47bb7 100644 --- a/java/server/src/org/openqa/selenium/grid/distributor/remote/BUILD.bazel +++ b/java/server/src/org/openqa/selenium/grid/distributor/remote/BUILD.bazel @@ -12,7 +12,6 @@ java_library( "//java/client/src/org/openqa/selenium/remote", "//java/server/src/org/openqa/selenium/grid/data", "//java/server/src/org/openqa/selenium/grid/distributor", - "//java/server/src/org/openqa/selenium/grid/distributor/config", "//java/server/src/org/openqa/selenium/grid/node", "//java/server/src/org/openqa/selenium/grid/web", "//java/server/src/org/openqa/selenium/grid/config", diff --git a/java/server/src/org/openqa/selenium/grid/distributor/remote/RemoteDistributor.java b/java/server/src/org/openqa/selenium/grid/distributor/remote/RemoteDistributor.java index 49fde0036cf8e..baf24290ef763 100644 --- a/java/server/src/org/openqa/selenium/grid/distributor/remote/RemoteDistributor.java +++ b/java/server/src/org/openqa/selenium/grid/distributor/remote/RemoteDistributor.java @@ -18,14 +18,10 @@ package org.openqa.selenium.grid.distributor.remote; import org.openqa.selenium.SessionNotCreatedException; -import org.openqa.selenium.grid.config.Config; import org.openqa.selenium.grid.data.CreateSessionResponse; import org.openqa.selenium.grid.data.DistributorStatus; import org.openqa.selenium.grid.distributor.Distributor; -import org.openqa.selenium.grid.distributor.config.DistributorOptions; -import org.openqa.selenium.grid.log.LoggingOptions; import org.openqa.selenium.grid.node.Node; -import org.openqa.selenium.grid.server.NetworkOptions; import org.openqa.selenium.grid.web.Values; import org.openqa.selenium.internal.Require; import org.openqa.selenium.remote.http.HttpClient; @@ -55,14 +51,6 @@ public RemoteDistributor(Tracer tracer, HttpClient.Factory factory, URL url) { this.client = factory.createClient(url); } - public static Distributor create(Config config) { - Tracer tracer = new LoggingOptions(config).getTracer(); - HttpClient.Factory clientFactory = new NetworkOptions(config).getHttpClientFactory(tracer); - URL distributorUrl = fromUri(new DistributorOptions(config).getDistributorUri()); - - return new RemoteDistributor(tracer, clientFactory, distributorUrl); - } - @Override public CreateSessionResponse newSession(HttpRequest request) throws SessionNotCreatedException { diff --git a/java/server/src/org/openqa/selenium/grid/router/httpd/BUILD.bazel b/java/server/src/org/openqa/selenium/grid/router/httpd/BUILD.bazel index fe33685460e8e..51e6785079d66 100644 --- a/java/server/src/org/openqa/selenium/grid/router/httpd/BUILD.bazel +++ b/java/server/src/org/openqa/selenium/grid/router/httpd/BUILD.bazel @@ -16,6 +16,7 @@ java_library( "//java/server/src/org/openqa/selenium/grid/data", "//java/server/src/org/openqa/selenium/grid/distributor", "//java/server/src/org/openqa/selenium/grid/distributor/config", + "//java/server/src/org/openqa/selenium/grid/distributor/remote", "//java/server/src/org/openqa/selenium/grid/graphql", "//java/server/src/org/openqa/selenium/grid/log", "//java/server/src/org/openqa/selenium/grid/node", diff --git a/java/server/src/org/openqa/selenium/grid/router/httpd/RouterServer.java b/java/server/src/org/openqa/selenium/grid/router/httpd/RouterServer.java index ada8bef27dfc2..630430780930f 100644 --- a/java/server/src/org/openqa/selenium/grid/router/httpd/RouterServer.java +++ b/java/server/src/org/openqa/selenium/grid/router/httpd/RouterServer.java @@ -28,6 +28,7 @@ import org.openqa.selenium.grid.config.Role; import org.openqa.selenium.grid.distributor.Distributor; import org.openqa.selenium.grid.distributor.config.DistributorOptions; +import org.openqa.selenium.grid.distributor.remote.RemoteDistributor; import org.openqa.selenium.grid.graphql.GraphqlHandler; import org.openqa.selenium.grid.log.LoggingOptions; import org.openqa.selenium.grid.router.ProxyCdpIntoGrid; @@ -43,6 +44,8 @@ import org.openqa.selenium.remote.http.Route; import org.openqa.selenium.remote.tracing.Tracer; +import java.net.URI; +import java.net.URL; import java.util.Collections; import java.util.Set; import java.util.logging.Logger; @@ -51,6 +54,7 @@ import static org.openqa.selenium.grid.config.StandardGridRoles.DISTRIBUTOR_ROLE; import static org.openqa.selenium.grid.config.StandardGridRoles.HTTPD_ROLE; import static org.openqa.selenium.grid.config.StandardGridRoles.SESSION_MAP_ROLE; +import static org.openqa.selenium.net.Urls.fromUri; import static org.openqa.selenium.remote.http.Route.get; @AutoService(CliCommand.class) @@ -102,7 +106,12 @@ protected void execute(Config config) { BaseServerOptions serverOptions = new BaseServerOptions(config); DistributorOptions distributorOptions = new DistributorOptions(config); - Distributor distributor = distributorOptions.getDistributor(); + URL distributorUrl = fromUri(distributorOptions.getDistributorUri()); + Distributor distributor = new RemoteDistributor( + tracer, + clientFactory, + distributorUrl + ); GraphqlHandler graphqlHandler = new GraphqlHandler(distributor, serverOptions.getExternalUri().toString());