...29import org.openqa.selenium.grid.distributor.remote.RemoteDistributor;30import org.openqa.selenium.grid.graphql.GraphqlHandler;31import org.openqa.selenium.grid.log.LoggingOptions;32import org.openqa.selenium.grid.router.ProxyCdpIntoGrid;33import org.openqa.selenium.grid.router.Router;34import org.openqa.selenium.grid.server.BaseServerOptions;35import org.openqa.selenium.grid.server.NetworkOptions;36import org.openqa.selenium.grid.server.Server;37import org.openqa.selenium.grid.sessionmap.SessionMap;38import org.openqa.selenium.grid.sessionmap.config.SessionMapOptions;39import org.openqa.selenium.netty.server.NettyServer;40import org.openqa.selenium.remote.http.HttpClient;41import org.openqa.selenium.remote.http.HttpResponse;42import org.openqa.selenium.remote.http.Route;43import org.openqa.selenium.remote.tracing.Tracer;44import java.net.URL;45import java.util.Collections;46import java.util.Set;47import java.util.logging.Logger;48import static java.net.HttpURLConnection.HTTP_NO_CONTENT;49import static org.openqa.selenium.grid.config.StandardGridRoles.DISTRIBUTOR_ROLE;50import static org.openqa.selenium.grid.config.StandardGridRoles.HTTPD_ROLE;51import static org.openqa.selenium.grid.config.StandardGridRoles.ROUTER_ROLE;52import static org.openqa.selenium.grid.config.StandardGridRoles.SESSION_MAP_ROLE;53import static org.openqa.selenium.net.Urls.fromUri;54import static org.openqa.selenium.remote.http.Route.get;55@AutoService(CliCommand.class)56public class RouterServer extends TemplateGridCommand {57 private static final Logger LOG = Logger.getLogger(RouterServer.class.getName());58 @Override59 public String getName() {60 return "router";61 }62 @Override63 public String getDescription() {64 return "Creates a router to front the selenium grid.";65 }66 @Override67 public Set<Role> getConfigurableRoles() {68 return ImmutableSet.of(DISTRIBUTOR_ROLE, HTTPD_ROLE, ROUTER_ROLE, SESSION_MAP_ROLE);69 }70 @Override71 public Set<Object> getFlagObjects() {72 return Collections.emptySet();73 }74 @Override75 protected String getSystemPropertiesConfigPrefix() {76 return "router";77 }78 @Override79 protected Config getDefaultConfig() {80 return new MapConfig(ImmutableMap.of("server", ImmutableMap.of("port", 4444)));81 }82 @Override83 protected void execute(Config config) {84 LoggingOptions loggingOptions = new LoggingOptions(config);85 Tracer tracer = loggingOptions.getTracer();86 NetworkOptions networkOptions = new NetworkOptions(config);87 HttpClient.Factory clientFactory = networkOptions.getHttpClientFactory(tracer);88 SessionMapOptions sessionsOptions = new SessionMapOptions(config);89 SessionMap sessions = sessionsOptions.getSessionMap();90 BaseServerOptions serverOptions = new BaseServerOptions(config);91 DistributorOptions distributorOptions = new DistributorOptions(config);92 URL distributorUrl = fromUri(distributorOptions.getDistributorUri());93 Distributor distributor = new RemoteDistributor(94 tracer,95 clientFactory,96 distributorUrl,97 serverOptions.getRegistrationSecret());98 GraphqlHandler graphqlHandler = new GraphqlHandler(distributor, serverOptions.getExternalUri());99 Route handler = Route.combine(100 new Router(tracer, clientFactory, sessions, distributor).with(networkOptions.getSpecComplianceChecks()),101 Route.post("/graphql").to(() -> graphqlHandler),102 get("/readyz").to(() -> req -> new HttpResponse().setStatus(HTTP_NO_CONTENT)));103 Server<?> server = new NettyServer(serverOptions, handler, new ProxyCdpIntoGrid(clientFactory, sessions));104 server.start();105 BuildInfo info = new BuildInfo();106 LOG.info(String.format(107 "Started Selenium router %s (revision %s): %s",108 info.getReleaseLabel(),109 info.getBuildRevision(),110 server.getUrl()));111 }112}...