[grid] ensure the NodeRestartedEvent does not kill recently started sessions
diff --git a/java/src/org/openqa/selenium/grid/data/Session.java b/java/src/org/openqa/selenium/grid/data/Session.java index 1cf20ec..e00a7b1 100644 --- a/java/src/org/openqa/selenium/grid/data/Session.java +++ b/java/src/org/openqa/selenium/grid/data/Session.java
@@ -39,6 +39,7 @@ public class Session implements Serializable { private final SessionId id; + private final NodeId nodeId; private final URI uri; private final Capabilities stereotype; private final Capabilities capabilities; @@ -46,11 +47,13 @@ public class Session implements Serializable { public Session( SessionId id, + NodeId nodeId, URI uri, Capabilities stereotype, Capabilities capabilities, Instant startTime) { this.id = Require.nonNull("Session ID", id); + this.nodeId = Require.nonNull("Node ID", nodeId); this.uri = Require.nonNull("Where the session is running", uri); this.startTime = Require.nonNull("Start time", startTime); @@ -63,6 +66,10 @@ public SessionId getId() { return id; } + public NodeId getNodeId() { + return nodeId; + } + public URI getUri() { return uri; } @@ -92,6 +99,7 @@ private Map<String, Object> toJson() { private static Session fromJson(JsonInput input) { SessionId id = null; + NodeId nodeId = null; URI uri = null; Capabilities caps = null; Capabilities stereotype = null; @@ -108,6 +116,10 @@ private static Session fromJson(JsonInput input) { id = input.read(SessionId.class); break; + case "nodeId": + nodeId = input.read(NodeId.class); + break; + case "start": start = input.read(Instant.class); break; @@ -127,7 +139,7 @@ private static Session fromJson(JsonInput input) { } input.endObject(); - return new Session(id, uri, stereotype, caps, start); + return new Session(id, nodeId, uri, stereotype, caps, start); } @Override
diff --git a/java/src/org/openqa/selenium/grid/distributor/GridModel.java b/java/src/org/openqa/selenium/grid/distributor/GridModel.java index 3aa2708..fde1c38 100644 --- a/java/src/org/openqa/selenium/grid/distributor/GridModel.java +++ b/java/src/org/openqa/selenium/grid/distributor/GridModel.java
@@ -410,6 +410,7 @@ public void reserve(NodeStatus status, Slot slot) { now, new Session( RESERVED, + status.getNodeId(), status.getExternalUri(), slot.getStereotype(), slot.getStereotype(),
diff --git a/java/src/org/openqa/selenium/grid/node/ActiveSession.java b/java/src/org/openqa/selenium/grid/node/ActiveSession.java index f6476a6..7880964 100644 --- a/java/src/org/openqa/selenium/grid/node/ActiveSession.java +++ b/java/src/org/openqa/selenium/grid/node/ActiveSession.java
@@ -20,6 +20,7 @@ import java.net.URI; import java.time.Instant; import org.openqa.selenium.Capabilities; +import org.openqa.selenium.grid.data.NodeId; import org.openqa.selenium.remote.Dialect; import org.openqa.selenium.remote.SessionId; import org.openqa.selenium.remote.http.HttpHandler; @@ -28,6 +29,8 @@ public interface ActiveSession extends HttpHandler { SessionId getId(); + NodeId getNodeId(); + Capabilities getStereotype(); Capabilities getCapabilities();
diff --git a/java/src/org/openqa/selenium/grid/node/BaseActiveSession.java b/java/src/org/openqa/selenium/grid/node/BaseActiveSession.java index 0eb826ea..c72fb7e 100644 --- a/java/src/org/openqa/selenium/grid/node/BaseActiveSession.java +++ b/java/src/org/openqa/selenium/grid/node/BaseActiveSession.java
@@ -23,6 +23,7 @@ import java.time.Instant; import org.openqa.selenium.Capabilities; import org.openqa.selenium.ImmutableCapabilities; +import org.openqa.selenium.grid.data.NodeId; import org.openqa.selenium.grid.data.Session; import org.openqa.selenium.internal.Require; import org.openqa.selenium.remote.Dialect; @@ -36,6 +37,7 @@ public abstract class BaseActiveSession implements ActiveSession { protected BaseActiveSession( SessionId id, + NodeId nodeId, URL url, Dialect downstream, Dialect upstream, @@ -52,6 +54,7 @@ protected BaseActiveSession( this.session = new Session( Require.nonNull("Session id", id), + nodeId, uri, ImmutableCapabilities.copyOf(Require.nonNull("Stereotype", stereotype)), ImmutableCapabilities.copyOf(Require.nonNull("Capabilities", capabilities)), @@ -67,6 +70,11 @@ public SessionId getId() { } @Override + public NodeId getNodeId() { + return session.getNodeId(); + } + + @Override public Capabilities getStereotype() { return session.getStereotype(); }
diff --git a/java/src/org/openqa/selenium/grid/node/DefaultActiveSession.java b/java/src/org/openqa/selenium/grid/node/DefaultActiveSession.java index 94fc774..e204294 100644 --- a/java/src/org/openqa/selenium/grid/node/DefaultActiveSession.java +++ b/java/src/org/openqa/selenium/grid/node/DefaultActiveSession.java
@@ -23,6 +23,7 @@ import java.net.URL; import java.time.Instant; import org.openqa.selenium.Capabilities; +import org.openqa.selenium.grid.data.NodeId; import org.openqa.selenium.grid.web.ReverseProxyHandler; import org.openqa.selenium.internal.Require; import org.openqa.selenium.remote.Dialect; @@ -42,13 +43,14 @@ protected DefaultActiveSession( Tracer tracer, HttpClient client, SessionId id, + NodeId nodeId, URL url, Dialect downstream, Dialect upstream, Capabilities stereotype, Capabilities capabilities, Instant startTime) { - super(id, url, downstream, upstream, stereotype, capabilities, startTime); + super(id, nodeId, url, downstream, upstream, stereotype, capabilities, startTime); Require.nonNull("HTTP client", client);
diff --git a/java/src/org/openqa/selenium/grid/node/SessionFactory.java b/java/src/org/openqa/selenium/grid/node/SessionFactory.java index 2d7e486..e783b25 100644 --- a/java/src/org/openqa/selenium/grid/node/SessionFactory.java +++ b/java/src/org/openqa/selenium/grid/node/SessionFactory.java
@@ -17,15 +17,16 @@ package org.openqa.selenium.grid.node; -import java.util.function.Function; +import java.util.function.BiFunction; import java.util.function.Predicate; import org.openqa.selenium.Capabilities; import org.openqa.selenium.WebDriverException; import org.openqa.selenium.grid.data.CreateSessionRequest; +import org.openqa.selenium.grid.data.NodeId; import org.openqa.selenium.internal.Either; public interface SessionFactory - extends Function<CreateSessionRequest, Either<WebDriverException, ActiveSession>>, + extends BiFunction<NodeId, CreateSessionRequest, Either<WebDriverException, ActiveSession>>, Predicate<Capabilities> { Capabilities getStereotype();
diff --git a/java/src/org/openqa/selenium/grid/node/config/DriverServiceSessionFactory.java b/java/src/org/openqa/selenium/grid/node/config/DriverServiceSessionFactory.java index 5b06243..5415ffb 100644 --- a/java/src/org/openqa/selenium/grid/node/config/DriverServiceSessionFactory.java +++ b/java/src/org/openqa/selenium/grid/node/config/DriverServiceSessionFactory.java
@@ -45,6 +45,7 @@ import org.openqa.selenium.WebDriverException; import org.openqa.selenium.devtools.CdpEndpointFinder; import org.openqa.selenium.grid.data.CreateSessionRequest; +import org.openqa.selenium.grid.data.NodeId; import org.openqa.selenium.grid.node.ActiveSession; import org.openqa.selenium.grid.node.DefaultActiveSession; import org.openqa.selenium.grid.node.SessionFactory; @@ -107,7 +108,8 @@ public boolean test(Capabilities capabilities) { } @Override - public Either<WebDriverException, ActiveSession> apply(CreateSessionRequest sessionRequest) { + public Either<WebDriverException, ActiveSession> apply( + NodeId nodeId, CreateSessionRequest sessionRequest) { if (sessionRequest.getDownstreamDialects().isEmpty()) { return Either.left(new SessionNotCreatedException("No downstream dialects were found.")); } @@ -196,6 +198,7 @@ public Either<WebDriverException, ActiveSession> apply(CreateSessionRequest sess tracer, client, new SessionId(response.getSessionId()), + nodeId, service.getUrl(), downstream, upstream,
diff --git a/java/src/org/openqa/selenium/grid/node/docker/DockerSession.java b/java/src/org/openqa/selenium/grid/node/docker/DockerSession.java index 3851347..7fd30d9 100644 --- a/java/src/org/openqa/selenium/grid/node/docker/DockerSession.java +++ b/java/src/org/openqa/selenium/grid/node/docker/DockerSession.java
@@ -27,6 +27,7 @@ import java.util.logging.Logger; import org.openqa.selenium.Capabilities; import org.openqa.selenium.docker.Container; +import org.openqa.selenium.grid.data.NodeId; import org.openqa.selenium.grid.node.DefaultActiveSession; import org.openqa.selenium.internal.Require; import org.openqa.selenium.remote.Dialect; @@ -47,6 +48,7 @@ public class DockerSession extends DefaultActiveSession { Tracer tracer, HttpClient client, SessionId id, + NodeId nodeId, URL url, Capabilities stereotype, Capabilities capabilities, @@ -54,7 +56,8 @@ public class DockerSession extends DefaultActiveSession { Dialect upstream, Instant startTime, DockerAssetsPath assetsPath) { - super(tracer, client, id, url, downstream, upstream, stereotype, capabilities, startTime); + super( + tracer, client, id, nodeId, url, downstream, upstream, stereotype, capabilities, startTime); this.container = Require.nonNull("Container", container); this.videoContainer = videoContainer; this.assetsPath = Require.nonNull("Assets path", assetsPath);
diff --git a/java/src/org/openqa/selenium/grid/node/docker/DockerSessionFactory.java b/java/src/org/openqa/selenium/grid/node/docker/DockerSessionFactory.java index 3cc1d4a..42623ce 100644 --- a/java/src/org/openqa/selenium/grid/node/docker/DockerSessionFactory.java +++ b/java/src/org/openqa/selenium/grid/node/docker/DockerSessionFactory.java
@@ -60,6 +60,7 @@ import org.openqa.selenium.docker.Image; import org.openqa.selenium.docker.Port; import org.openqa.selenium.grid.data.CreateSessionRequest; +import org.openqa.selenium.grid.data.NodeId; import org.openqa.selenium.grid.node.ActiveSession; import org.openqa.selenium.grid.node.SessionFactory; import org.openqa.selenium.internal.Either; @@ -148,7 +149,8 @@ public boolean test(Capabilities capabilities) { } @Override - public Either<WebDriverException, ActiveSession> apply(CreateSessionRequest sessionRequest) { + public Either<WebDriverException, ActiveSession> apply( + NodeId nodeId, CreateSessionRequest sessionRequest) { LOG.info("Starting session for " + sessionRequest.getDesiredCapabilities()); int port = runningInDocker ? 4444 : PortProber.findFreePort(); @@ -262,6 +264,7 @@ public Either<WebDriverException, ActiveSession> apply(CreateSessionRequest sess tracer, client, id, + nodeId, remoteAddress, stereotype, mergedCapabilities,
diff --git a/java/src/org/openqa/selenium/grid/node/k8s/OneShotNode.java b/java/src/org/openqa/selenium/grid/node/k8s/OneShotNode.java index 77cfbb4..3f8a04c 100644 --- a/java/src/org/openqa/selenium/grid/node/k8s/OneShotNode.java +++ b/java/src/org/openqa/selenium/grid/node/k8s/OneShotNode.java
@@ -325,7 +325,7 @@ public Session getSession(SessionId id) throws NoSuchSessionException { throw new NoSuchSessionException("Unable to find session with id: " + id); } - return new Session(sessionId, getUri(), stereotype, capabilities, sessionStart); + return new Session(sessionId, getId(), getUri(), stereotype, capabilities, sessionStart); } @Override @@ -404,7 +404,8 @@ public NodeStatus getStatus() { Instant.EPOCH, driver == null ? null - : new Session(sessionId, getUri(), stereotype, capabilities, Instant.now()))), + : new Session( + sessionId, getId(), getUri(), stereotype, capabilities, Instant.now()))), isDraining() ? DRAINING : UP, heartbeatPeriod, getSessionTimeout(),
diff --git a/java/src/org/openqa/selenium/grid/node/local/LocalNode.java b/java/src/org/openqa/selenium/grid/node/local/LocalNode.java index 49d5af6..2ed803b 100644 --- a/java/src/org/openqa/selenium/grid/node/local/LocalNode.java +++ b/java/src/org/openqa/selenium/grid/node/local/LocalNode.java
@@ -500,7 +500,8 @@ public Either<WebDriverException, CreateSessionResponse> newSession( sessionRequest.getDownstreamDialects(), enhanced, sessionRequest.getMetadata()); } - Either<WebDriverException, ActiveSession> possibleSession = slotToUse.apply(sessionRequest); + Either<WebDriverException, ActiveSession> possibleSession = + slotToUse.apply(this.getId(), sessionRequest); if (possibleSession.isRight()) { ActiveSession session = possibleSession.right(); @@ -931,7 +932,8 @@ private Session createExternalSession( toUse = new PersistentCapabilities(toUse).setCapability("se:vnc", rewrite(vncPath)); } - return new Session(other.getId(), externalUri, other.getStereotype(), toUse, Instant.now()); + return new Session( + other.getId(), this.getId(), externalUri, other.getStereotype(), toUse, Instant.now()); } private URI rewrite(String path) { @@ -960,6 +962,7 @@ public NodeStatus getStatus() { session = new Session( activeSession.getId(), + activeSession.getNodeId(), activeSession.getUri(), slot.getStereotype(), activeSession.getCapabilities(),
diff --git a/java/src/org/openqa/selenium/grid/node/local/SessionSlot.java b/java/src/org/openqa/selenium/grid/node/local/SessionSlot.java index 3c51b78..babc0b65 100644 --- a/java/src/org/openqa/selenium/grid/node/local/SessionSlot.java +++ b/java/src/org/openqa/selenium/grid/node/local/SessionSlot.java
@@ -22,7 +22,7 @@ import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; -import java.util.function.Function; +import java.util.function.BiFunction; import java.util.function.Predicate; import java.util.logging.Level; import java.util.logging.Logger; @@ -36,6 +36,7 @@ import org.openqa.selenium.WebDriverInfo; import org.openqa.selenium.events.EventBus; import org.openqa.selenium.grid.data.CreateSessionRequest; +import org.openqa.selenium.grid.data.NodeId; import org.openqa.selenium.grid.data.SessionClosedEvent; import org.openqa.selenium.grid.node.ActiveSession; import org.openqa.selenium.grid.node.SessionFactory; @@ -49,7 +50,7 @@ public class SessionSlot implements HttpHandler, - Function<CreateSessionRequest, Either<WebDriverException, ActiveSession>>, + BiFunction<NodeId, CreateSessionRequest, Either<WebDriverException, ActiveSession>>, Predicate<Capabilities> { private static final Logger LOG = Logger.getLogger(SessionSlot.class.getName()); @@ -136,7 +137,8 @@ public boolean test(Capabilities capabilities) { } @Override - public Either<WebDriverException, ActiveSession> apply(CreateSessionRequest sessionRequest) { + public Either<WebDriverException, ActiveSession> apply( + NodeId nodeId, CreateSessionRequest sessionRequest) { if (currentSession != null) { return Either.left(new RetrySessionRequestException("Slot is busy. Try another slot.")); } @@ -148,7 +150,8 @@ public Either<WebDriverException, ActiveSession> apply(CreateSessionRequest sess } try { - Either<WebDriverException, ActiveSession> possibleSession = factory.apply(sessionRequest); + Either<WebDriverException, ActiveSession> possibleSession = + factory.apply(nodeId, sessionRequest); if (possibleSession.isRight()) { ActiveSession session = possibleSession.right(); currentSession = session;
diff --git a/java/src/org/openqa/selenium/grid/node/relay/RelaySessionFactory.java b/java/src/org/openqa/selenium/grid/node/relay/RelaySessionFactory.java index fc0c984..a24565f 100644 --- a/java/src/org/openqa/selenium/grid/node/relay/RelaySessionFactory.java +++ b/java/src/org/openqa/selenium/grid/node/relay/RelaySessionFactory.java
@@ -44,6 +44,7 @@ import org.openqa.selenium.SessionNotCreatedException; import org.openqa.selenium.WebDriverException; import org.openqa.selenium.grid.data.CreateSessionRequest; +import org.openqa.selenium.grid.data.NodeId; import org.openqa.selenium.grid.node.ActiveSession; import org.openqa.selenium.grid.node.DefaultActiveSession; import org.openqa.selenium.grid.node.SessionFactory; @@ -141,7 +142,8 @@ public boolean test(Capabilities capabilities) { } @Override - public Either<WebDriverException, ActiveSession> apply(CreateSessionRequest sessionRequest) { + public Either<WebDriverException, ActiveSession> apply( + NodeId nodeId, CreateSessionRequest sessionRequest) { Capabilities capabilities = sessionRequest.getDesiredCapabilities(); if (!test(capabilities)) { return Either.left( @@ -200,6 +202,7 @@ public Either<WebDriverException, ActiveSession> apply(CreateSessionRequest sess tracer, client, new SessionId(response.getSessionId()), + nodeId, serviceUrl, downstream, upstream,
diff --git a/java/src/org/openqa/selenium/grid/sessionmap/jdbc/JdbcBackedSessionMap.java b/java/src/org/openqa/selenium/grid/sessionmap/jdbc/JdbcBackedSessionMap.java index aeab49a..29b02b9 100644 --- a/java/src/org/openqa/selenium/grid/sessionmap/jdbc/JdbcBackedSessionMap.java +++ b/java/src/org/openqa/selenium/grid/sessionmap/jdbc/JdbcBackedSessionMap.java
@@ -31,6 +31,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.time.Instant; +import java.util.UUID; import java.util.logging.Logger; import org.openqa.selenium.Capabilities; import org.openqa.selenium.ImmutableCapabilities; @@ -38,6 +39,7 @@ import org.openqa.selenium.events.EventBus; import org.openqa.selenium.grid.config.Config; import org.openqa.selenium.grid.config.ConfigException; +import org.openqa.selenium.grid.data.NodeId; import org.openqa.selenium.grid.data.NodeRemovedEvent; import org.openqa.selenium.grid.data.NodeRestartedEvent; import org.openqa.selenium.grid.data.Session; @@ -60,6 +62,7 @@ public class JdbcBackedSessionMap extends SessionMap implements Closeable { private static final Logger LOG = Logger.getLogger(JdbcBackedSessionMap.class.getName()); private static final String TABLE_NAME = "sessions_map"; private static final String SESSION_ID_COL = "session_ids"; + private static final String NODE_ID_COL = "node_id"; private static final String SESSION_CAPS_COL = "session_caps"; private static final String SESSION_STEREOTYPE_COL = "session_stereotype"; private static final String SESSION_URI_COL = "session_uri"; @@ -92,7 +95,8 @@ public JdbcBackedSessionMap(Tracer tracer, Connection jdbcConnection, EventBus b .forEach(this::remove))); bus.addListener( - NodeRestartedEvent.listener(nodeStatus -> this.removeByUri(nodeStatus.getExternalUri()))); + NodeRestartedEvent.listener( + nodeStatus -> this.removeByUri(nodeStatus.getNodeId(), nodeStatus.getExternalUri()))); } public static SessionMap create(Config config) { @@ -145,19 +149,21 @@ public boolean add(Session session) { try (PreparedStatement statement = connection.prepareStatement( String.format( - "insert into %1$s (%2$s, %3$s, %4$s, %5$s, %6$s) values (?, ?, ?, ?, ?)", + "insert into %1$s (%2$s, %3$s, %4$s, %5$s, %6$s, %7$s) values (?, ?, ?, ?, ?, ?)", TABLE_NAME, SESSION_ID_COL, + NODE_ID_COL, SESSION_URI_COL, SESSION_STEREOTYPE_COL, SESSION_CAPS_COL, SESSION_START_COL))) { statement.setString(1, session.getId().toString()); - statement.setString(2, session.getUri().toString()); - statement.setString(3, JSON.toJson(session.getStereotype())); - statement.setString(4, JSON.toJson(session.getCapabilities())); - statement.setString(5, JSON.toJson(session.getStartTime())); + statement.setString(2, session.getNodeId().toString()); + statement.setString(3, session.getUri().toString()); + statement.setString(4, JSON.toJson(session.getStereotype())); + statement.setString(5, JSON.toJson(session.getCapabilities())); + statement.setString(6, JSON.toJson(session.getStartTime())); String statementStr = statement.toString(); span.setAttribute(DATABASE_STATEMENT, statementStr); @@ -188,6 +194,7 @@ public Session get(SessionId id) throws NoSuchSessionException { Require.nonNull("Session ID", id); URI uri = null; + NodeId nodeId; Capabilities stereotype = null; Capabilities caps = null; Instant start = null; @@ -231,6 +238,7 @@ public Session get(SessionId id) throws NoSuchSessionException { throw exception; } + nodeId = new NodeId(UUID.fromString(sessions.getString(NODE_ID_COL))); rawUri = sessions.getString(SESSION_URI_COL); String rawStereotype = sessions.getString(SESSION_STEREOTYPE_COL); @@ -270,7 +278,7 @@ public Session get(SessionId id) throws NoSuchSessionException { } span.addEvent("Retrieved session from the database", attributeMap); - return new Session(id, uri, stereotype, caps, start); + return new Session(id, nodeId, uri, stereotype, caps, start); } catch (SQLException e) { span.setAttribute("error", true); span.setStatus(Status.CANCELLED); @@ -323,17 +331,22 @@ public void remove(SessionId id) { } } - public void removeByUri(URI sessionUri) { + public void removeByUri(NodeId keep, URI sessionUri) { Require.nonNull("Session URI", sessionUri); try (Span span = - tracer.getCurrentContext().createSpan("DELETE from sessions_map where session_uri = ?")) { + tracer + .getCurrentContext() + .createSpan("DELETE from sessions_map where node_id != ? and session_uri = ?")) { AttributeMap attributeMap = tracer.createAttributeMap(); try (PreparedStatement statement = connection.prepareStatement( - String.format("delete from %1$s where %2$s = ?", TABLE_NAME, SESSION_URI_COL))) { + String.format( + "delete from %1$s where %2$s != ? and %3$s = ?", + TABLE_NAME, NODE_ID_COL, SESSION_URI_COL))) { - statement.setString(1, sessionUri.toString()); + statement.setString(1, keep.toString()); + statement.setString(2, sessionUri.toString()); String statementStr = statement.toString(); span.setAttribute(DATABASE_STATEMENT, statementStr); span.setAttribute(DATABASE_OPERATION, "delete");
diff --git a/java/src/org/openqa/selenium/grid/sessionmap/local/LocalSessionMap.java b/java/src/org/openqa/selenium/grid/sessionmap/local/LocalSessionMap.java index 6e2ff03..65868fb 100644 --- a/java/src/org/openqa/selenium/grid/sessionmap/local/LocalSessionMap.java +++ b/java/src/org/openqa/selenium/grid/sessionmap/local/LocalSessionMap.java
@@ -71,6 +71,14 @@ public LocalSessionMap(Tracer tracer, EventBus bus) { List<SessionId> toRemove = knownSessions.entrySet().stream() .filter((e) -> e.getValue().getUri().equals(nodeStatus.getExternalUri())) + .filter( + (e) -> { + if (e.getValue().getNodeId().equals(nodeStatus.getNodeId())) { + LOG.warning("BUG BUG BUG"); + return false; + } + return true; + }) .map(Map.Entry::getKey) .collect(Collectors.toList());
diff --git a/java/src/org/openqa/selenium/grid/sessionmap/redis/RedisBackedSessionMap.java b/java/src/org/openqa/selenium/grid/sessionmap/redis/RedisBackedSessionMap.java index 3e3278c..b46e15a 100644 --- a/java/src/org/openqa/selenium/grid/sessionmap/redis/RedisBackedSessionMap.java +++ b/java/src/org/openqa/selenium/grid/sessionmap/redis/RedisBackedSessionMap.java
@@ -29,12 +29,14 @@ import java.net.URISyntaxException; import java.time.Instant; import java.util.List; +import java.util.UUID; import java.util.logging.Logger; import org.openqa.selenium.Capabilities; import org.openqa.selenium.ImmutableCapabilities; import org.openqa.selenium.NoSuchSessionException; import org.openqa.selenium.events.EventBus; import org.openqa.selenium.grid.config.Config; +import org.openqa.selenium.grid.data.NodeId; import org.openqa.selenium.grid.data.NodeRemovedEvent; import org.openqa.selenium.grid.data.NodeRestartedEvent; import org.openqa.selenium.grid.data.Session; @@ -87,7 +89,7 @@ public RedisBackedSessionMap(Tracer tracer, URI serverUri, EventBus bus) { .forEach(this::remove))); bus.addListener( - NodeRestartedEvent.listener(nodeStatus -> this.removeByUri(nodeStatus.getExternalUri()))); + NodeRestartedEvent.listener(nodeStatus -> this.removeByUri(nodeStatus.getNodeId(), nodeStatus.getExternalUri()))); } public static SessionMap create(Config config) { @@ -114,6 +116,8 @@ public boolean add(Session session) { setCommonSpanAttributes(span); setCommonEventAttributes(attributeMap); + String nodeIdKey = nodeIdKey(session.getId()); + String nodeIdValue = session.getNodeId().toString(); String uriKey = uriKey(session.getId()); String uriValue = session.getUri().toString(); String stereotypeKey = stereotypeKey(session.getId()); @@ -139,6 +143,7 @@ public boolean add(Session session) { span.addEvent("Inserted into the database", attributeMap); connection.mset( ImmutableMap.of( + nodeIdKey, nodeIdValue, uriKey, uriValue, stereotypeKey, stereotypeJson, capabilitiesKey, capabilitiesJson, @@ -161,6 +166,9 @@ public Session get(SessionId id) throws NoSuchSessionException { span.setAttribute(DATABASE_OPERATION, "GET"); attributeMap.put(DATABASE_OPERATION, "GET"); + String nodeIdKey = nodeIdKey(id); + NodeId nodeId = new NodeId(UUID.fromString(connection.get(nodeIdKey))); + URI uri = getUri(id); attributeMap.put(REDIS_URI_KEY, uriKey(id)); @@ -196,7 +204,7 @@ public Session get(SessionId id) throws NoSuchSessionException { CAPABILITIES_EVENT.accept(attributeMap, caps); span.addEvent("Retrieved session from the database", attributeMap); - return new Session(id, uri, stereotype, caps, start); + return new Session(id, nodeId, uri, stereotype, caps, start); } } @@ -286,7 +294,38 @@ public void remove(SessionId id) { } } - public void removeByUri(URI uri) { + public void removeByUri(NodeId keep, URI uri) { + //TODO handle keep argument + //TODO handle keep argument + //TODO handle keep argument + //TODO handle keep argument + //TODO handle keep argument + //TODO handle keep argument + //TODO handle keep argument + //TODO handle keep argument + //TODO handle keep argument + //TODO handle keep argument + //TODO handle keep argument + //TODO handle keep argument + //TODO handle keep argument + //TODO handle keep argument + //TODO handle keep argument + //TODO handle keep argument + //TODO handle keep argument + //TODO handle keep argument + //TODO handle keep argument + //TODO handle keep argument + //TODO handle keep argument + //TODO handle keep argument + //TODO handle keep argument + //TODO handle keep argument + //TODO handle keep argument + //TODO handle keep argument + //TODO handle keep argument + //TODO handle keep argument + //TODO handle keep argument + //TODO handle keep argument + List<String> uriKeys = connection.getKeysByPattern("session:*:uri"); if (uriKeys.isEmpty()) { @@ -298,7 +337,7 @@ public void removeByUri(URI uri) { List<KeyValue<String, String>> keyValues = connection.mget(keys); keyValues.stream() - .filter(entry -> entry.getValue().equals(uri.toString())) + .filter(entry -> entry.getValue().equals(uri.toString())) .map(KeyValue::getKey) .map( key -> { @@ -313,6 +352,12 @@ public boolean isReady() { return connection.isOpen(); } + private String nodeIdKey(SessionId id) { + Require.nonNull("Session ID", id); + + return "session:" + id + ":nodeId"; + } + private String uriKey(SessionId id) { Require.nonNull("Session ID", id);
diff --git a/java/test/org/openqa/selenium/grid/data/NodeStatusTest.java b/java/test/org/openqa/selenium/grid/data/NodeStatusTest.java index 4926f08..0c16bad 100644 --- a/java/test/org/openqa/selenium/grid/data/NodeStatusTest.java +++ b/java/test/org/openqa/selenium/grid/data/NodeStatusTest.java
@@ -50,6 +50,7 @@ void ensureRoundTripWorks() throws URISyntaxException { Instant.EPOCH, new Session( new SessionId(UUID.randomUUID()), + new NodeId(UUID.randomUUID()), new URI("http://localhost:1235"), stereotype, new ImmutableCapabilities("peas", "sausages"),
diff --git a/java/test/org/openqa/selenium/grid/distributor/AddingNodesTest.java b/java/test/org/openqa/selenium/grid/distributor/AddingNodesTest.java index 2ed1ab9..6c1744c 100644 --- a/java/test/org/openqa/selenium/grid/distributor/AddingNodesTest.java +++ b/java/test/org/openqa/selenium/grid/distributor/AddingNodesTest.java
@@ -127,7 +127,8 @@ void shouldBeAbleToRegisterALocalNode() throws URISyntaxException { .add( CAPS, new TestSessionFactory( - (id, caps) -> new Session(id, sessionUri, stereotype, caps, Instant.now()))) + (id, nodeId, caps) -> + new Session(id, nodeId, sessionUri, stereotype, caps, Instant.now()))) .build(); Distributor local = @@ -159,6 +160,7 @@ void shouldBeAbleToRegisterALocalNode() throws URISyntaxException { @Test void shouldBeAbleToRegisterACustomNode() throws URISyntaxException { + NodeId nodeId = new NodeId(UUID.randomUUID()); URI sessionUri = new URI("http://example:1234"); Node node = new CustomNode( @@ -168,7 +170,12 @@ void shouldBeAbleToRegisterACustomNode() throws URISyntaxException { Duration.ofSeconds(300), c -> new Session( - new SessionId(UUID.randomUUID()), sessionUri, stereotype, c, Instant.now())); + new SessionId(UUID.randomUUID()), + nodeId, + sessionUri, + stereotype, + c, + Instant.now())); try (LocalDistributor local = new LocalDistributor( @@ -207,7 +214,8 @@ void shouldBeAbleToRegisterNodesByListeningForEvents() throws URISyntaxException .add( CAPS, new TestSessionFactory( - (id, caps) -> new Session(id, sessionUri, stereotype, caps, Instant.now()))) + (id, nodeId, caps) -> + new Session(id, nodeId, sessionUri, stereotype, caps, Instant.now()))) .build(); try (LocalDistributor local = @@ -247,14 +255,16 @@ void shouldKeepOnlyOneNodeWhenTwoRegistrationsHaveTheSameUriByListeningForEvents .add( CAPS, new TestSessionFactory( - (id, caps) -> new Session(id, sessionUri, stereotype, caps, Instant.now()))) + (id, nodeId, caps) -> + new Session(id, nodeId, sessionUri, stereotype, caps, Instant.now()))) .build(); Node secondNode = LocalNode.builder(tracer, bus, externalUrl.toURI(), externalUrl.toURI(), registrationSecret) .add( CAPS, new TestSessionFactory( - (id, caps) -> new Session(id, sessionUri, stereotype, caps, Instant.now()))) + (id, nodeId, caps) -> + new Session(id, nodeId, sessionUri, stereotype, caps, Instant.now()))) .build(); handler.addHandler(firstNode); handler.addHandler(secondNode); @@ -298,7 +308,8 @@ void distributorShouldUpdateStateOfExistingNodeWhenNodePublishesStateChange() .add( CAPS, new TestSessionFactory( - (id, caps) -> new Session(id, sessionUri, stereotype, caps, Instant.now()))) + (id, nodeId, caps) -> + new Session(id, nodeId, sessionUri, stereotype, caps, Instant.now()))) .build(); try (LocalDistributor local = @@ -342,6 +353,7 @@ void distributorShouldUpdateStateOfExistingNodeWhenNodePublishesStateChange() Instant.now(), new Session( new SessionId(UUID.randomUUID()), + new NodeId(UUID.randomUUID()), sessionUri, CAPS, CAPS, @@ -467,6 +479,7 @@ public NodeStatus getStatus() { sess = new Session( running.getId(), + new NodeId(UUID.randomUUID()), new URI("http://localhost:14568"), CAPS, running.getCapabilities(),
diff --git a/java/test/org/openqa/selenium/grid/distributor/DistributorDrainingTest.java b/java/test/org/openqa/selenium/grid/distributor/DistributorDrainingTest.java index 1170c1e..6e2c006 100644 --- a/java/test/org/openqa/selenium/grid/distributor/DistributorDrainingTest.java +++ b/java/test/org/openqa/selenium/grid/distributor/DistributorDrainingTest.java
@@ -62,7 +62,8 @@ void drainedNodeDoesNotShutDownIfNotEmpty() throws InterruptedException { .add( caps, new TestSessionFactory( - (id, c) -> new Session(id, nodeUri, stereotype, c, Instant.now()))) + (id, nodeId, c) -> + new Session(id, nodeId, nodeUri, stereotype, c, Instant.now()))) .build(); CountDownLatch latch = new CountDownLatch(1); @@ -115,11 +116,13 @@ void drainedNodeShutsDownAfterSessionsFinish() throws InterruptedException { .add( caps, new TestSessionFactory( - (id, c) -> new Session(id, nodeUri, stereotype, c, Instant.now()))) + (id, nodeId, c) -> + new Session(id, nodeId, nodeUri, stereotype, c, Instant.now()))) .add( caps, new TestSessionFactory( - (id, c) -> new Session(id, nodeUri, stereotype, c, Instant.now()))) + (id, nodeId, c) -> + new Session(id, nodeId, nodeUri, stereotype, c, Instant.now()))) .maximumConcurrentSessions(5) .build(); @@ -192,7 +195,8 @@ void testDrainedNodeShutsDownOnceEmpty() throws InterruptedException { .add( caps, new TestSessionFactory( - (id, c) -> new Session(id, nodeUri, stereotype, c, Instant.now()))) + (id, nodeId, c) -> + new Session(id, nodeId, nodeUri, stereotype, c, Instant.now()))) .build(); CountDownLatch latch = new CountDownLatch(1); @@ -245,7 +249,8 @@ void drainingNodeDoesNotAcceptNewSessions() { .add( caps, new TestSessionFactory( - (id, c) -> new Session(id, nodeUri, stereotype, c, Instant.now()))) + (id, nodeId, c) -> + new Session(id, nodeId, nodeUri, stereotype, c, Instant.now()))) .build(); local =
diff --git a/java/test/org/openqa/selenium/grid/distributor/DistributorNodeAvailabilityTest.java b/java/test/org/openqa/selenium/grid/distributor/DistributorNodeAvailabilityTest.java index 97dddc4..008f425 100644 --- a/java/test/org/openqa/selenium/grid/distributor/DistributorNodeAvailabilityTest.java +++ b/java/test/org/openqa/selenium/grid/distributor/DistributorNodeAvailabilityTest.java
@@ -62,7 +62,8 @@ void registeringTheSameNodeMultipleTimesOnlyCountsTheFirstTime() { .add( caps, new TestSessionFactory( - (id, c) -> new Session(id, nodeUri, stereotype, c, Instant.now()))) + (id, nodeId, c) -> + new Session(id, nodeId, nodeUri, stereotype, c, Instant.now()))) .build(); local = @@ -106,7 +107,8 @@ void shouldBeAbleToRemoveANode() throws MalformedURLException { .add( caps, new TestSessionFactory( - (id, c) -> new Session(id, nodeUri, stereotype, c, Instant.now()))) + (id, nodeId, c) -> + new Session(id, nodeId, nodeUri, stereotype, c, Instant.now()))) .build(); local = @@ -159,7 +161,7 @@ void shouldIncludeHostsThatAreUpInHostList() { .add( caps, new TestSessionFactory( - (id, c) -> new Session(id, uri, stereotype, c, Instant.now()))) + (id, nodeId, c) -> new Session(id, nodeId, uri, stereotype, c, Instant.now()))) .advanced() .healthCheck(() -> new HealthCheck.Result(DOWN, "Boo!")) .build(); @@ -193,7 +195,7 @@ void shouldIncludeHostsThatAreUpInHostList() { .add( caps, new TestSessionFactory( - (id, c) -> new Session(id, uri, stereotype, c, Instant.now()))) + (id, nodeId, c) -> new Session(id, nodeId, uri, stereotype, c, Instant.now()))) .advanced() .healthCheck(() -> new HealthCheck.Result(UP, "Yay!")) .build(); @@ -231,7 +233,8 @@ void shouldNotRemoveNodeWhoseHealthCheckPassesBeforeThreshold() throws Interrupt .add( caps, new TestSessionFactory( - (id, caps) -> new Session(id, uri, stereotype, caps, Instant.now()))) + (id, nodeId, caps) -> + new Session(id, nodeId, uri, stereotype, caps, Instant.now()))) .advanced() .healthCheck( () -> { @@ -294,7 +297,8 @@ void shouldReturnNodesThatWereDownToPoolOfNodesOnceTheyMarkTheirHealthCheckPasse .add( caps, new TestSessionFactory( - (id, caps) -> new Session(id, uri, stereotype, caps, Instant.now()))) + (id, nodeId, caps) -> + new Session(id, nodeId, uri, stereotype, caps, Instant.now()))) .advanced() .healthCheck(() -> new HealthCheck.Result(isUp.get(), "TL;DR")) .build(); @@ -350,7 +354,8 @@ void shouldBeAbleToAddANodeAndCreateASession() { .add( caps, new TestSessionFactory( - (id, c) -> new Session(id, nodeUri, stereotype, c, Instant.now()))) + (id, nodeId, c) -> + new Session(id, nodeId, nodeUri, stereotype, c, Instant.now()))) .build(); local =
diff --git a/java/test/org/openqa/selenium/grid/distributor/DistributorTest.java b/java/test/org/openqa/selenium/grid/distributor/DistributorTest.java index 1fcb2be..22b3064 100644 --- a/java/test/org/openqa/selenium/grid/distributor/DistributorTest.java +++ b/java/test/org/openqa/selenium/grid/distributor/DistributorTest.java
@@ -93,7 +93,8 @@ void creatingASessionAddsItToTheSessionMap() { .add( caps, new TestSessionFactory( - (id, c) -> new Session(id, nodeUri, stereotype, c, Instant.now()))) + (id, nodeId, c) -> + new Session(id, nodeId, nodeUri, stereotype, c, Instant.now()))) .build(); local = @@ -144,7 +145,8 @@ void shouldReleaseSlotOnceSessionEnds() { .add( caps, new TestSessionFactory( - (id, c) -> new Session(id, nodeUri, stereotype, c, Instant.now()))) + (id, nodeId, c) -> + new Session(id, nodeId, nodeUri, stereotype, c, Instant.now()))) .build(); local = @@ -255,7 +257,7 @@ void attemptingToStartASessionWhichFailsMarksAsTheSlotAsAvailable() { .add( caps, new TestSessionFactory( - (id, caps) -> { + (id, nodeId, caps) -> { throw new SessionNotCreatedException("OMG"); })) .build(); @@ -291,7 +293,7 @@ private Node createBrokenNode(Capabilities stereotype) { stereotype, new TestSessionFactory( stereotype, - (id, caps) -> { + (id, nodeId, caps) -> { throw new SessionNotCreatedException("Surprise!"); })) .build();
diff --git a/java/test/org/openqa/selenium/grid/distributor/DistributorTestBase.java b/java/test/org/openqa/selenium/grid/distributor/DistributorTestBase.java index c54e582..b971c66 100644 --- a/java/test/org/openqa/selenium/grid/distributor/DistributorTestBase.java +++ b/java/test/org/openqa/selenium/grid/distributor/DistributorTestBase.java
@@ -40,6 +40,7 @@ import org.openqa.selenium.grid.data.Availability; import org.openqa.selenium.grid.data.CreateSessionRequest; import org.openqa.selenium.grid.data.DefaultSlotMatcher; +import org.openqa.selenium.grid.data.NodeId; import org.openqa.selenium.grid.data.NodeStatus; import org.openqa.selenium.grid.data.RequestId; import org.openqa.selenium.grid.data.Session; @@ -78,6 +79,7 @@ public abstract class DistributorTestBase { protected LocalDistributor local; protected Capabilities stereotype; protected Capabilities caps; + protected NodeId nodeId; protected URI nodeUri; protected URI routableUri; protected LocalSessionMap sessions; @@ -89,6 +91,7 @@ protected static <A, B> EitherAssert<A, B> assertThatEither(Either<A, B> either) @BeforeEach public void setUp() throws URISyntaxException { + nodeId = new NodeId(UUID.randomUUID()); nodeUri = new URI("http://example:5678"); routableUri = createUri(); tracer = DefaultTestTracer.createTracer(); @@ -167,7 +170,9 @@ protected Node createNode(Capabilities stereotype, int count, int currentLoad) { URI uri = createUri(); LocalNode.Builder builder = LocalNode.builder(tracer, bus, uri, uri, registrationSecret); for (int i = 0; i < count; i++) { - builder.add(stereotype, new TestSessionFactory((id, caps) -> new HandledSession(uri, caps))); + builder.add( + stereotype, + new TestSessionFactory((id, nodeId, caps) -> new HandledSession(nodeId, uri, caps))); } builder.maximumConcurrentSessions(12); @@ -188,8 +193,8 @@ protected void waitForAllNodesToHaveCapacity(Distributor distributor, int nodeCo protected class HandledSession extends Session implements HttpHandler { - HandledSession(URI uri, Capabilities caps) { - super(new SessionId(UUID.randomUUID()), uri, stereotype, caps, Instant.now()); + HandledSession(NodeId nodeId, URI uri, Capabilities caps) { + super(new SessionId(UUID.randomUUID()), nodeId, uri, stereotype, caps, Instant.now()); } @Override
diff --git a/java/test/org/openqa/selenium/grid/distributor/HeartBeatTest.java b/java/test/org/openqa/selenium/grid/distributor/HeartBeatTest.java index d0793eb..ff72277 100644 --- a/java/test/org/openqa/selenium/grid/distributor/HeartBeatTest.java +++ b/java/test/org/openqa/selenium/grid/distributor/HeartBeatTest.java
@@ -44,7 +44,8 @@ void shouldStartHeartBeatOnNodeStart() { .add( caps, new TestSessionFactory( - (id, c) -> new Session(id, nodeUri, stereotype, c, Instant.now()))) + (id, nodeId, c) -> + new Session(id, nodeId, nodeUri, stereotype, c, Instant.now()))) .heartbeatPeriod(Duration.ofSeconds(1)) .build();
diff --git a/java/test/org/openqa/selenium/grid/distributor/SessionSchedulingTest.java b/java/test/org/openqa/selenium/grid/distributor/SessionSchedulingTest.java index 5b4b8ad..e9561cf 100644 --- a/java/test/org/openqa/selenium/grid/distributor/SessionSchedulingTest.java +++ b/java/test/org/openqa/selenium/grid/distributor/SessionSchedulingTest.java
@@ -203,7 +203,8 @@ void shouldNotScheduleAJobIfAllSlotsAreBeingUsed() { .add( caps, new TestSessionFactory( - (id, c) -> new Session(id, nodeUri, stereotype, c, Instant.now()))) + (id, nodeId, c) -> + new Session(id, nodeId, nodeUri, stereotype, c, Instant.now()))) .build(); local = new LocalDistributor( @@ -338,7 +339,9 @@ private Set<Node> createNodeSet( LocalNode.Builder builder = LocalNode.builder(tracer, bus, uri, uri, registrationSecret); for (Capabilities caps : capabilities) { builder.add( - caps, new TestSessionFactory((id, hostCaps) -> new HandledSession(uri, hostCaps))); + caps, + new TestSessionFactory( + (id, nodeId, hostCaps) -> new HandledSession(nodeId, uri, hostCaps))); } Node node = builder.build(); handler.addHandler(node);
diff --git a/java/test/org/openqa/selenium/grid/distributor/local/LocalDistributorTest.java b/java/test/org/openqa/selenium/grid/distributor/local/LocalDistributorTest.java index af5adb6..738fe25 100644 --- a/java/test/org/openqa/selenium/grid/distributor/local/LocalDistributorTest.java +++ b/java/test/org/openqa/selenium/grid/distributor/local/LocalDistributorTest.java
@@ -54,6 +54,7 @@ import org.openqa.selenium.grid.data.CreateSessionResponse; import org.openqa.selenium.grid.data.DefaultSlotMatcher; import org.openqa.selenium.grid.data.DistributorStatus; +import org.openqa.selenium.grid.data.NodeId; import org.openqa.selenium.grid.data.NodeStatus; import org.openqa.selenium.grid.data.RequestId; import org.openqa.selenium.grid.data.Session; @@ -87,6 +88,7 @@ class LocalDistributorTest { private static final int newSessionThreadPoolSize = Runtime.getRuntime().availableProcessors(); private Tracer tracer; private EventBus bus; + private NodeId nodeId; private URI uri; private Node localNode; private Wait<Object> wait; @@ -97,10 +99,11 @@ public void setUp() throws URISyntaxException { bus = new GuavaEventBus(); Capabilities caps = new ImmutableCapabilities("browserName", "cheese"); + nodeId = new NodeId(UUID.randomUUID()); uri = new URI("http://localhost:1234"); localNode = LocalNode.builder(tracer, bus, uri, uri, registrationSecret) - .add(caps, new TestSessionFactory((id, c) -> new Handler(c))) + .add(caps, new TestSessionFactory((id, nodeId, c) -> new Handler(c))) .maximumConcurrentSessions(2) .sessionTimeout(Duration.ofSeconds(30)) .heartbeatPeriod(Duration.ofSeconds(5)) @@ -239,8 +242,8 @@ void shouldBeAbleToAddMultipleSessionsConcurrently() throws Exception { Capabilities caps = new ImmutableCapabilities("browserName", "cheese"); class VerifyingHandler extends Session implements HttpHandler { - private VerifyingHandler(SessionId id, Capabilities capabilities) { - super(id, uri, new ImmutableCapabilities(), capabilities, Instant.now()); + private VerifyingHandler(SessionId id, NodeId nodeId, Capabilities capabilities) { + super(id, nodeId, uri, new ImmutableCapabilities(), capabilities, Instant.now()); } @Override @@ -430,7 +433,7 @@ void slowStartingNodesShouldNotCauseReservationsToBeSerialized() { caps, new TestSessionFactory( caps, - (id, c) -> { + (id, nodeId, c) -> { try { Thread.sleep(delay); } catch (InterruptedException e) { @@ -492,6 +495,7 @@ private class Handler extends Session implements HttpHandler { private Handler(Capabilities capabilities) { super( new SessionId(UUID.randomUUID()), + nodeId, uri, new ImmutableCapabilities(), capabilities,
diff --git a/java/test/org/openqa/selenium/grid/distributor/selector/DefaultSlotSelectorTest.java b/java/test/org/openqa/selenium/grid/distributor/selector/DefaultSlotSelectorTest.java index df3eecb..801d90e 100644 --- a/java/test/org/openqa/selenium/grid/distributor/selector/DefaultSlotSelectorTest.java +++ b/java/test/org/openqa/selenium/grid/distributor/selector/DefaultSlotSelectorTest.java
@@ -236,7 +236,6 @@ void nodesAreOrderedByNumberOfSupportedBrowsersAndLoad() { private NodeStatus createNode(List<Capabilities> stereotypes, int count, int currentLoad) { NodeId nodeId = new NodeId(UUID.randomUUID()); - URI uri = createUri(); Set<Slot> slots = new HashSet<>(); @@ -250,7 +249,12 @@ private NodeStatus createNode(List<Capabilities> stereotypes, int count, int cur stereotype, now, new Session( - new SessionId(UUID.randomUUID()), uri, stereotype, stereotype, now))); + new SessionId(UUID.randomUUID()), + nodeId, + uri, + stereotype, + stereotype, + now))); } for (int i = 0; i < count - currentLoad; i++) { @@ -284,7 +288,8 @@ private NodeStatus createNode(String... browsers) { .forEach( browser -> { Capabilities caps = new ImmutableCapabilities("browserName", browser); - nodeBuilder.add(caps, new TestSessionFactory((id, c) -> new Handler(c))); + nodeBuilder.add( + caps, new TestSessionFactory((id, nodeId, c) -> new Handler(nodeId, c))); }); Node myNode = nodeBuilder.build(); @@ -299,7 +304,7 @@ private NodeStatus createNodeWithStereotypes(List<ImmutableMap> stereotypes) { stereotypes.forEach( stereotype -> { Capabilities caps = new ImmutableCapabilities(stereotype); - nodeBuilder.add(caps, new TestSessionFactory((id, c) -> new Handler(c))); + nodeBuilder.add(caps, new TestSessionFactory((id, nodeId, c) -> new Handler(nodeId, c))); }); Node myNode = nodeBuilder.build(); return myNode.getStatus(); @@ -314,9 +319,10 @@ private URI createUri() { } private class Handler extends Session implements HttpHandler { - private Handler(Capabilities capabilities) { + private Handler(NodeId nodeId, Capabilities capabilities) { super( new SessionId(UUID.randomUUID()), + nodeId, uri, new ImmutableCapabilities(), capabilities,
diff --git a/java/test/org/openqa/selenium/grid/graphql/GraphqlHandlerTest.java b/java/test/org/openqa/selenium/grid/graphql/GraphqlHandlerTest.java index 3a442da..60a72b6 100644 --- a/java/test/org/openqa/selenium/grid/graphql/GraphqlHandlerTest.java +++ b/java/test/org/openqa/selenium/grid/graphql/GraphqlHandlerTest.java
@@ -47,6 +47,7 @@ import org.openqa.selenium.grid.data.CreateSessionRequest; import org.openqa.selenium.grid.data.CreateSessionResponse; import org.openqa.selenium.grid.data.DefaultSlotMatcher; +import org.openqa.selenium.grid.data.NodeId; import org.openqa.selenium.grid.data.RequestId; import org.openqa.selenium.grid.data.Session; import org.openqa.selenium.grid.data.SessionRequest; @@ -268,7 +269,7 @@ public Capabilities getStereotype() { @Override public Either<WebDriverException, ActiveSession> apply( - CreateSessionRequest createSessionRequest) { + NodeId nodeId, CreateSessionRequest createSessionRequest) { return Either.left(new SessionNotCreatedException("Factory for testing")); } @@ -304,9 +305,9 @@ void shouldBeAbleToGetSessionCount() throws URISyntaxException { .add( caps, new TestSessionFactory( - (id, caps) -> + (id, nodeId, caps) -> new org.openqa.selenium.grid.data.Session( - id, nodeUri, stereotype, caps, Instant.now()))) + id, nodeId, nodeUri, stereotype, caps, Instant.now()))) .build(); distributor = @@ -353,9 +354,9 @@ void shouldBeAbleToGetSessionInfo() throws URISyntaxException { .add( caps, new TestSessionFactory( - (id, caps) -> + (id, nodeId, caps) -> new org.openqa.selenium.grid.data.Session( - id, nodeUri, stereotype, caps, Instant.now()))) + id, nodeId, nodeUri, stereotype, caps, Instant.now()))) .build(); distributor = @@ -430,9 +431,9 @@ void shouldBeAbleToGetNodeInfoForSession() throws URISyntaxException { .add( caps, new TestSessionFactory( - (id, caps) -> + (id, nodeId, caps) -> new org.openqa.selenium.grid.data.Session( - id, nodeUri, stereotype, caps, Instant.now()))) + id, nodeId, nodeUri, stereotype, caps, Instant.now()))) .build(); distributor = @@ -505,9 +506,9 @@ void shouldBeAbleToGetSlotInfoForSession() throws URISyntaxException { .add( caps, new TestSessionFactory( - (id, caps) -> + (id, nodeId, caps) -> new org.openqa.selenium.grid.data.Session( - id, nodeUri, stereotype, caps, Instant.now()))) + id, nodeId, nodeUri, stereotype, caps, Instant.now()))) .build(); distributor = @@ -588,9 +589,9 @@ void shouldBeAbleToGetSessionDuration() throws URISyntaxException { .add( caps, new TestSessionFactory( - (id, caps) -> + (id, nodeId, caps) -> new org.openqa.selenium.grid.data.Session( - id, nodeUri, stereotype, caps, Instant.now()))) + id, nodeId, nodeUri, stereotype, caps, Instant.now()))) .build(); distributor = @@ -648,9 +649,9 @@ void shouldThrowExceptionWhenSessionNotFound() throws URISyntaxException { .add( caps, new TestSessionFactory( - (id, caps) -> + (id, nodeId, caps) -> new org.openqa.selenium.grid.data.Session( - id, nodeUri, stereotype, caps, Instant.now()))) + id, nodeId, nodeUri, stereotype, caps, Instant.now()))) .build(); distributor.add(node); @@ -687,9 +688,9 @@ void shouldThrowExceptionWhenSessionIsEmpty() throws URISyntaxException { .add( caps, new TestSessionFactory( - (id, caps) -> + (id, nodeId, caps) -> new org.openqa.selenium.grid.data.Session( - id, nodeUri, stereotype, caps, Instant.now()))) + id, nodeId, nodeUri, stereotype, caps, Instant.now()))) .build(); distributor.add(node);
diff --git a/java/test/org/openqa/selenium/grid/node/CustomLocatorHandlerTest.java b/java/test/org/openqa/selenium/grid/node/CustomLocatorHandlerTest.java index 2d8c349..2db3e3d 100644 --- a/java/test/org/openqa/selenium/grid/node/CustomLocatorHandlerTest.java +++ b/java/test/org/openqa/selenium/grid/node/CustomLocatorHandlerTest.java
@@ -146,7 +146,8 @@ void shouldCallTheGivenLocatorForALocator() { nodeBuilder .add( caps, - new TestSessionFactory((id, c) -> new Session(id, nodeUri, caps, c, Instant.now()))) + new TestSessionFactory( + (id, nodeId, c) -> new Session(id, nodeId, nodeUri, caps, c, Instant.now()))) .build(); HttpHandler handler =
diff --git a/java/test/org/openqa/selenium/grid/node/NodeTest.java b/java/test/org/openqa/selenium/grid/node/NodeTest.java index 4ce9e7e..ef95964 100644 --- a/java/test/org/openqa/selenium/grid/node/NodeTest.java +++ b/java/test/org/openqa/selenium/grid/node/NodeTest.java
@@ -106,6 +106,7 @@ class NodeTest { private Node node2; private ImmutableCapabilities stereotype; private ImmutableCapabilities caps; + private NodeId nodeId; private URI uri; private Secret registrationSecret; @@ -128,11 +129,13 @@ public void setUp(TestInfo testInfo) throws URISyntaxException { caps = new ImmutableCapabilities("browserName", "chrome", "se:downloadsEnabled", true); } + nodeId = new NodeId(UUID.randomUUID()); uri = new URI("http://localhost:1234"); class Handler extends Session implements HttpHandler { private Handler(Capabilities capabilities) { - super(new SessionId(UUID.randomUUID()), uri, stereotype, capabilities, Instant.now()); + super( + new SessionId(UUID.randomUUID()), nodeId, uri, stereotype, capabilities, Instant.now()); } @Override @@ -143,9 +146,9 @@ public HttpResponse execute(HttpRequest req) throws UncheckedIOException { Builder builder = LocalNode.builder(tracer, bus, uri, uri, registrationSecret) - .add(caps, new TestSessionFactory((id, c) -> new Handler(c))) - .add(caps, new TestSessionFactory((id, c) -> new Handler(c))) - .add(caps, new TestSessionFactory((id, c) -> new Handler(c))) + .add(caps, new TestSessionFactory((id, nodeId, c) -> new Handler(c))) + .add(caps, new TestSessionFactory((id, nodeId, c) -> new Handler(c))) + .add(caps, new TestSessionFactory((id, nodeId, c) -> new Handler(c))) .maximumConcurrentSessions(2); if (isDownloadsTestCase) { builder = builder.enableManagedDownloads(true).sessionTimeout(Duration.ofSeconds(1)); @@ -218,7 +221,7 @@ public Capabilities getStereotype() { @Override public Either<WebDriverException, ActiveSession> apply( - CreateSessionRequest createSessionRequest) { + NodeId nodeId, CreateSessionRequest createSessionRequest) { return Either.left(new SessionNotCreatedException("HelperFactory for testing")); } @@ -255,7 +258,7 @@ void shouldOnlyCreateAsManySessionsAsFactories() { .add( caps, new TestSessionFactory( - (id, c) -> new Session(id, uri, stereotype, c, Instant.now()))) + (id, nodeId, c) -> new Session(id, nodeId, uri, stereotype, c, Instant.now()))) .build(); Either<WebDriverException, CreateSessionResponse> response = @@ -340,7 +343,7 @@ void willRespondToWebDriverCommandsSentToOwnedSessions() { class Recording extends Session implements HttpHandler { private Recording() { - super(new SessionId(UUID.randomUUID()), uri, stereotype, caps, Instant.now()); + super(new SessionId(UUID.randomUUID()), nodeId, uri, stereotype, caps, Instant.now()); } @Override @@ -352,7 +355,7 @@ public HttpResponse execute(HttpRequest req) throws UncheckedIOException { Node local = LocalNode.builder(tracer, bus, uri, uri, registrationSecret) - .add(caps, new TestSessionFactory((id, c) -> new Recording())) + .add(caps, new TestSessionFactory((id, nodeId, c) -> new Recording())) .build(); Node remote = new RemoteNode( @@ -419,7 +422,7 @@ void aSessionThatTimesOutWillBeStoppedAndRemovedFromTheSessionMap() { .add( caps, new TestSessionFactory( - (id, c) -> new Session(id, uri, stereotype, c, Instant.now()))) + (id, nodeId, c) -> new Session(id, nodeId, uri, stereotype, c, Instant.now()))) .sessionTimeout(Duration.ofMinutes(3)) .advanced() .clock(clock) @@ -442,7 +445,7 @@ void shouldNotPropagateExceptionsWhenSessionCreationFails() { .add( caps, new TestSessionFactory( - (id, c) -> { + (id, nodeId, c) -> { throw new SessionNotCreatedException("eeek"); })) .build(); @@ -461,7 +464,8 @@ void eachSessionShouldReportTheNodesUrl() throws URISyntaxException { .add( caps, new TestSessionFactory( - (id, c) -> new Session(id, sessionUri, stereotype, c, Instant.now()))) + (id, nodeId, c) -> + new Session(id, nodeId, sessionUri, stereotype, c, Instant.now()))) .build(); Either<WebDriverException, CreateSessionResponse> response =
diff --git a/java/test/org/openqa/selenium/grid/node/config/DriverServiceSessionFactoryTest.java b/java/test/org/openqa/selenium/grid/node/config/DriverServiceSessionFactoryTest.java index a23294a..003dc11 100644 --- a/java/test/org/openqa/selenium/grid/node/config/DriverServiceSessionFactoryTest.java +++ b/java/test/org/openqa/selenium/grid/node/config/DriverServiceSessionFactoryTest.java
@@ -36,6 +36,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.time.Duration; +import java.util.UUID; import java.util.function.Predicate; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -43,6 +44,7 @@ import org.openqa.selenium.ImmutableCapabilities; import org.openqa.selenium.WebDriverException; import org.openqa.selenium.grid.data.CreateSessionRequest; +import org.openqa.selenium.grid.data.NodeId; import org.openqa.selenium.grid.node.ActiveSession; import org.openqa.selenium.internal.Either; import org.openqa.selenium.remote.Dialect; @@ -94,6 +96,7 @@ void shouldNotInstantiateSessionIfNoDialectSpecifiedInARequest() { Either<WebDriverException, ActiveSession> session = factory.apply( + new NodeId(UUID.randomUUID()), new CreateSessionRequest(ImmutableSet.of(), toPayload("chrome"), ImmutableMap.of())); assertThat(session.isLeft()).isTrue(); @@ -106,6 +109,7 @@ void shouldNotInstantiateSessionIfCapabilitiesDoNotMatch() { Either<WebDriverException, ActiveSession> session = factory.apply( + new NodeId(UUID.randomUUID()), new CreateSessionRequest( ImmutableSet.of(Dialect.W3C), toPayload("firefox"), ImmutableMap.of())); @@ -121,6 +125,7 @@ void shouldNotInstantiateSessionIfBuilderCanNotBuildService() { Either<WebDriverException, ActiveSession> session = factory.apply( + new NodeId(UUID.randomUUID()), new CreateSessionRequest( ImmutableSet.of(Dialect.W3C), toPayload("chrome"), ImmutableMap.of())); @@ -143,6 +148,7 @@ void shouldNotInstantiateSessionIfRemoteEndReturnsInvalidResponse() throws IOExc Either<WebDriverException, ActiveSession> session = factory.apply( + new NodeId(UUID.randomUUID()), new CreateSessionRequest( ImmutableSet.of(Dialect.W3C), toPayload("chrome"), ImmutableMap.of())); @@ -175,6 +181,7 @@ void shouldInstantiateSessionIfEverythingIsOK() throws IOException { Either<WebDriverException, ActiveSession> session = factory.apply( + new NodeId(UUID.randomUUID()), new CreateSessionRequest( ImmutableSet.of(Dialect.W3C), toPayload("chrome"), ImmutableMap.of()));
diff --git a/java/test/org/openqa/selenium/grid/node/config/NodeOptionsTest.java b/java/test/org/openqa/selenium/grid/node/config/NodeOptionsTest.java index 69f1ba3..2ae921b 100644 --- a/java/test/org/openqa/selenium/grid/node/config/NodeOptionsTest.java +++ b/java/test/org/openqa/selenium/grid/node/config/NodeOptionsTest.java
@@ -56,6 +56,7 @@ import org.openqa.selenium.grid.config.TomlConfig; import org.openqa.selenium.grid.data.CreateSessionRequest; import org.openqa.selenium.grid.data.DefaultSlotMatcher; +import org.openqa.selenium.grid.data.NodeId; import org.openqa.selenium.grid.node.ActiveSession; import org.openqa.selenium.grid.node.SessionFactory; import org.openqa.selenium.grid.node.data.YesSlotMatcher; @@ -781,7 +782,7 @@ public Capabilities getStereotype() { @Override public Either<WebDriverException, ActiveSession> apply( - CreateSessionRequest createSessionRequest) { + NodeId nodeId, CreateSessionRequest createSessionRequest) { return Either.left(new SessionNotCreatedException("HelperFactory for testing")); }
diff --git a/java/test/org/openqa/selenium/grid/node/local/CreateSessionTest.java b/java/test/org/openqa/selenium/grid/node/local/CreateSessionTest.java index 7b57bae..257d0c9 100644 --- a/java/test/org/openqa/selenium/grid/node/local/CreateSessionTest.java +++ b/java/test/org/openqa/selenium/grid/node/local/CreateSessionTest.java
@@ -70,8 +70,9 @@ void shouldAcceptAW3CPayload() throws URISyntaxException { .add( stereotype, new TestSessionFactory( - (id, caps) -> - new Session(id, uri, new ImmutableCapabilities(), caps, Instant.now()))) + (id, nodeId, caps) -> + new Session( + id, nodeId, uri, new ImmutableCapabilities(), caps, Instant.now()))) .build(); Either<WebDriverException, CreateSessionResponse> response = @@ -126,8 +127,9 @@ void shouldPreferUsingTheW3CProtocol() throws URISyntaxException { .add( stereotype, new TestSessionFactory( - (id, caps) -> - new Session(id, uri, new ImmutableCapabilities(), caps, Instant.now()))) + (id, nodeId, caps) -> + new Session( + id, nodeId, uri, new ImmutableCapabilities(), caps, Instant.now()))) .build(); Either<WebDriverException, CreateSessionResponse> response =
diff --git a/java/test/org/openqa/selenium/grid/node/local/LocalNodeTest.java b/java/test/org/openqa/selenium/grid/node/local/LocalNodeTest.java index ccd2b44..045f62b 100644 --- a/java/test/org/openqa/selenium/grid/node/local/LocalNodeTest.java +++ b/java/test/org/openqa/selenium/grid/node/local/LocalNodeTest.java
@@ -46,6 +46,7 @@ import org.openqa.selenium.events.local.GuavaEventBus; import org.openqa.selenium.grid.data.CreateSessionRequest; import org.openqa.selenium.grid.data.CreateSessionResponse; +import org.openqa.selenium.grid.data.NodeId; import org.openqa.selenium.grid.data.NodeStatus; import org.openqa.selenium.grid.data.Session; import org.openqa.selenium.grid.data.Slot; @@ -84,7 +85,8 @@ public void setUp() throws URISyntaxException { .add( stereotype, new TestSessionFactory( - (id, caps) -> new Session(id, uri, stereotype, caps, Instant.now()))) + (id, nodeId, caps) -> + new Session(id, nodeId, uri, stereotype, caps, Instant.now()))) .build(); Either<WebDriverException, CreateSessionResponse> response = @@ -200,8 +202,8 @@ void shouldBeAbleToCreateSessionsConcurrently() throws Exception { Capabilities caps = new ImmutableCapabilities("browserName", "cheese"); class VerifyingHandler extends Session implements HttpHandler { - private VerifyingHandler(SessionId id, Capabilities capabilities) { - super(id, uri, new ImmutableCapabilities(), capabilities, Instant.now()); + private VerifyingHandler(SessionId id, NodeId nodeId, Capabilities capabilities) { + super(id, nodeId, uri, new ImmutableCapabilities(), capabilities, Instant.now()); } @Override @@ -263,7 +265,7 @@ void nodeDrainsAfterSessionCountIsReached() throws URISyntaxException { builder.add( stereotype, new TestSessionFactory( - (id, caps) -> new Session(id, uri, stereotype, caps, Instant.now()))); + (id, nodeId, caps) -> new Session(id, nodeId, uri, stereotype, caps, Instant.now()))); } LocalNode localNode = builder.build(); @@ -296,7 +298,8 @@ void seVncCdpUrlCapabilityWhenGridUrlWithSubPath() throws URISyntaxException { .add( stereotype, new TestSessionFactory( - (id, caps) -> new Session(id, uri, stereotype, caps, Instant.now()))); + (id, nodeId, caps) -> + new Session(id, nodeId, uri, stereotype, caps, Instant.now()))); LocalNode localNode = builder.build(); Either<WebDriverException, CreateSessionResponse> response = @@ -331,7 +334,8 @@ void seVncCdpUrlCapabilityWhenGridUrlWithTrailingSlash() throws URISyntaxExcepti .add( stereotype, new TestSessionFactory( - (id, caps) -> new Session(id, uri, stereotype, caps, Instant.now()))); + (id, nodeId, caps) -> + new Session(id, nodeId, uri, stereotype, caps, Instant.now()))); LocalNode localNode = builder.build(); Either<WebDriverException, CreateSessionResponse> response = @@ -364,7 +368,8 @@ void responseCapsShowContainerName() throws URISyntaxException { .add( stereotype, new TestSessionFactory( - (id, caps) -> new Session(id, uri, stereotype, caps, Instant.now()))); + (id, nodeId, caps) -> + new Session(id, nodeId, uri, stereotype, caps, Instant.now()))); LocalNode localNode = builder.build(); Either<WebDriverException, CreateSessionResponse> response = @@ -392,7 +397,8 @@ void cdpIsDisabledAndResponseCapsShowThat() throws URISyntaxException { .add( stereotype, new TestSessionFactory( - (id, caps) -> new Session(id, uri, stereotype, caps, Instant.now()))); + (id, nodeId, caps) -> + new Session(id, nodeId, uri, stereotype, caps, Instant.now()))); LocalNode localNode = builder.build(); Either<WebDriverException, CreateSessionResponse> response = @@ -420,7 +426,8 @@ void bidiIsDisabledAndResponseCapsShowThat() throws URISyntaxException { .add( stereotype, new TestSessionFactory( - (id, caps) -> new Session(id, uri, stereotype, caps, Instant.now()))); + (id, nodeId, caps) -> + new Session(id, nodeId, uri, stereotype, caps, Instant.now()))); LocalNode localNode = builder.build(); Either<WebDriverException, CreateSessionResponse> response =
diff --git a/java/test/org/openqa/selenium/grid/router/EndToEndTest.java b/java/test/org/openqa/selenium/grid/router/EndToEndTest.java index af228d1..34c24f3 100644 --- a/java/test/org/openqa/selenium/grid/router/EndToEndTest.java +++ b/java/test/org/openqa/selenium/grid/router/EndToEndTest.java
@@ -49,6 +49,7 @@ import org.openqa.selenium.WebDriver; import org.openqa.selenium.grid.config.Config; import org.openqa.selenium.grid.config.TomlConfig; +import org.openqa.selenium.grid.data.NodeId; import org.openqa.selenium.grid.data.Session; import org.openqa.selenium.grid.node.SessionFactory; import org.openqa.selenium.grid.router.DeploymentTypes.Deployment; @@ -149,15 +150,17 @@ public static SessionFactory create(Config config, Capabilities stereotype) { throw new RuntimeException(e); } - return new TestSessionFactory(stereotype, (id, caps) -> new SpoofSession(serverUri, caps)); + return new TestSessionFactory( + stereotype, (id, nodeId, caps) -> new SpoofSession(nodeId, serverUri, caps)); } } private static class SpoofSession extends Session implements HttpHandler { - private SpoofSession(URI serverUri, Capabilities capabilities) { + private SpoofSession(NodeId nodeId, URI serverUri, Capabilities capabilities) { super( new SessionId(UUID.randomUUID()), + nodeId, serverUri, new ImmutableCapabilities(), capabilities,
diff --git a/java/test/org/openqa/selenium/grid/router/JmxTest.java b/java/test/org/openqa/selenium/grid/router/JmxTest.java index 2561eee..02ae737 100644 --- a/java/test/org/openqa/selenium/grid/router/JmxTest.java +++ b/java/test/org/openqa/selenium/grid/router/JmxTest.java
@@ -121,9 +121,14 @@ void shouldBeAbleToRegisterNode() throws URISyntaxException { .add( CAPS, new TestSessionFactory( - (id, caps) -> + (id, nodeId, caps) -> new Session( - id, nodeUri, new ImmutableCapabilities(), caps, Instant.now()))) + id, + nodeId, + nodeUri, + new ImmutableCapabilities(), + caps, + Instant.now()))) .build(); assertThat(localNode).isNotNull(); @@ -269,8 +274,9 @@ void shouldBeAbleToMonitorHub() throws Exception { .add( CAPS, new TestSessionFactory( - (id, caps) -> - new Session(id, nodeUri, new ImmutableCapabilities(), caps, Instant.now()))) + (id, nodeId, caps) -> + new Session( + id, nodeId, nodeUri, new ImmutableCapabilities(), caps, Instant.now()))) .build(); NewSessionQueue sessionQueue =
diff --git a/java/test/org/openqa/selenium/grid/router/NewSessionCreationTest.java b/java/test/org/openqa/selenium/grid/router/NewSessionCreationTest.java index 5ff4d19..2badc01 100644 --- a/java/test/org/openqa/selenium/grid/router/NewSessionCreationTest.java +++ b/java/test/org/openqa/selenium/grid/router/NewSessionCreationTest.java
@@ -137,9 +137,14 @@ void ensureJsCannotCreateANewSession() throws URISyntaxException { .add( Browser.detect().getCapabilities(), new TestSessionFactory( - (id, caps) -> + (id, nodeId, caps) -> new Session( - id, uri, Browser.detect().getCapabilities(), caps, Instant.now()))) + id, + nodeId, + uri, + Browser.detect().getCapabilities(), + caps, + Instant.now()))) .build(); distributor.add(node); @@ -201,12 +206,13 @@ void shouldNotRetryNewSessionRequestOnUnexpectedError() throws URISyntaxExceptio // Does not reach second attempt. TestSessionFactory sessionFactory = new TestSessionFactory( - (id, caps) -> { + (id, nodeId, caps) -> { if (count.get() == 0) { count.incrementAndGet(); throw new SessionNotCreatedException("Expected the exception"); } else { - return new Session(id, nodeUri, new ImmutableCapabilities(), caps, Instant.now()); + return new Session( + id, nodeId, nodeUri, new ImmutableCapabilities(), caps, Instant.now()); } }); @@ -273,8 +279,8 @@ void shouldRejectRequestForUnsupportedCaps() throws URISyntaxException { TestSessionFactory sessionFactory = new TestSessionFactory( - (id, caps) -> - new Session(id, nodeUri, new ImmutableCapabilities(), caps, Instant.now())); + (id, nodeId, caps) -> + new Session(id, nodeId, nodeUri, new ImmutableCapabilities(), caps, Instant.now())); LocalNode localNode = LocalNode.builder(tracer, bus, nodeUri, nodeUri, registrationSecret)
diff --git a/java/test/org/openqa/selenium/grid/router/ProxyWebsocketTest.java b/java/test/org/openqa/selenium/grid/router/ProxyWebsocketTest.java index 54ffd00..6846b53 100644 --- a/java/test/org/openqa/selenium/grid/router/ProxyWebsocketTest.java +++ b/java/test/org/openqa/selenium/grid/router/ProxyWebsocketTest.java
@@ -51,6 +51,7 @@ import org.openqa.selenium.events.local.GuavaEventBus; import org.openqa.selenium.grid.config.Config; import org.openqa.selenium.grid.config.MapConfig; +import org.openqa.selenium.grid.data.NodeId; import org.openqa.selenium.grid.data.Session; import org.openqa.selenium.grid.server.BaseServerOptions; import org.openqa.selenium.grid.server.Server; @@ -125,6 +126,7 @@ void shouldForwardTextMessageToServer(Supplier<String> values) sessions.add( new Session( id, + new NodeId(UUID.randomUUID()), backend.getUrl().toURI(), new ImmutableCapabilities(), new ImmutableCapabilities(), @@ -160,6 +162,7 @@ void shouldForwardTextMessageFromServerToLocalEnd(Supplier<String> values) sessions.add( new Session( id, + new NodeId(UUID.randomUUID()), backend.getUrl().toURI(), new ImmutableCapabilities(), new ImmutableCapabilities(), @@ -215,6 +218,7 @@ void shouldBeAbleToSendMessagesOverSecureWebSocket(Supplier<String> values) sessions.add( new Session( id, + new NodeId(UUID.randomUUID()), backend.getUrl().toURI(), new ImmutableCapabilities(), new ImmutableCapabilities(),
diff --git a/java/test/org/openqa/selenium/grid/router/ReverseProxyEndToEndTest.java b/java/test/org/openqa/selenium/grid/router/ReverseProxyEndToEndTest.java index 6d75033..720c06e 100644 --- a/java/test/org/openqa/selenium/grid/router/ReverseProxyEndToEndTest.java +++ b/java/test/org/openqa/selenium/grid/router/ReverseProxyEndToEndTest.java
@@ -42,6 +42,7 @@ import org.openqa.selenium.WebDriver; import org.openqa.selenium.grid.config.Config; import org.openqa.selenium.grid.config.TomlConfig; +import org.openqa.selenium.grid.data.NodeId; import org.openqa.selenium.grid.data.Session; import org.openqa.selenium.grid.node.SessionFactory; import org.openqa.selenium.grid.router.DeploymentTypes.Deployment; @@ -144,15 +145,17 @@ public static SessionFactory create(Config config, Capabilities stereotype) { } catch (URISyntaxException e) { throw new RuntimeException(e); } - return new TestSessionFactory(stereotype, (id, caps) -> new SpoofSession(serverUri, caps)); + return new TestSessionFactory( + stereotype, (id, nodeId, caps) -> new SpoofSession(nodeId, serverUri, caps)); } } private static class SpoofSession extends Session implements HttpHandler { - private SpoofSession(URI serverUri, Capabilities capabilities) { + private SpoofSession(NodeId nodeId, URI serverUri, Capabilities capabilities) { super( new SessionId(UUID.randomUUID()), + nodeId, serverUri, new ImmutableCapabilities(), capabilities,
diff --git a/java/test/org/openqa/selenium/grid/router/RouterTest.java b/java/test/org/openqa/selenium/grid/router/RouterTest.java index 352495f..5ae502c 100644 --- a/java/test/org/openqa/selenium/grid/router/RouterTest.java +++ b/java/test/org/openqa/selenium/grid/router/RouterTest.java
@@ -200,9 +200,14 @@ void shouldListAllNodesTheDistributorIsAwareOf() throws URISyntaxException { .add( chromeCapabilities, new TestSessionFactory( - (id, caps) -> + (id, nodeId, caps) -> new Session( - id, firstNodeUri, new ImmutableCapabilities(), caps, Instant.now()))) + id, + nodeId, + firstNodeUri, + new ImmutableCapabilities(), + caps, + Instant.now()))) .advanced() .healthCheck(() -> new HealthCheck.Result(isUp.get(), "TL;DR")) .build(); @@ -212,9 +217,14 @@ id, firstNodeUri, new ImmutableCapabilities(), caps, Instant.now()))) .add( firefoxCapabilities, new TestSessionFactory( - (id, caps) -> + (id, nodeId, caps) -> new Session( - id, secondNodeUri, new ImmutableCapabilities(), caps, Instant.now()))) + id, + nodeId, + secondNodeUri, + new ImmutableCapabilities(), + caps, + Instant.now()))) .advanced() .healthCheck(() -> new HealthCheck.Result(isUp.get(), "TL;DR")) .build(); @@ -249,13 +259,15 @@ void ifNodesHaveSpareSlotsButAlreadyHaveMaxSessionsGridIsNotReady() throws URISy .add( chromeCapabilities, new TestSessionFactory( - (id, caps) -> - new Session(id, uri, new ImmutableCapabilities(), caps, Instant.now()))) + (id, nodeId, caps) -> + new Session( + id, nodeId, uri, new ImmutableCapabilities(), caps, Instant.now()))) .add( firefoxCapabilities, new TestSessionFactory( - (id, caps) -> - new Session(id, uri, new ImmutableCapabilities(), caps, Instant.now()))) + (id, nodeId, caps) -> + new Session( + id, nodeId, uri, new ImmutableCapabilities(), caps, Instant.now()))) .maximumConcurrentSessions(1) .advanced() .healthCheck(() -> new HealthCheck.Result(isUp.get(), "TL;DR")) @@ -292,8 +304,8 @@ private Node getNode( .add( capabilities, new TestSessionFactory( - (id, caps) -> - new Session(id, uri, new ImmutableCapabilities(), caps, Instant.now()))) + (id, nodeId, caps) -> + new Session(id, nodeId, uri, new ImmutableCapabilities(), caps, Instant.now()))) .advanced() .healthCheck(() -> new HealthCheck.Result(availability.get(), "TL;DR")) .build();
diff --git a/java/test/org/openqa/selenium/grid/router/SessionCleanUpTest.java b/java/test/org/openqa/selenium/grid/router/SessionCleanUpTest.java index 9944736..151f0fb 100644 --- a/java/test/org/openqa/selenium/grid/router/SessionCleanUpTest.java +++ b/java/test/org/openqa/selenium/grid/router/SessionCleanUpTest.java
@@ -56,6 +56,7 @@ import org.openqa.selenium.grid.data.Availability; import org.openqa.selenium.grid.data.CreateSessionResponse; import org.openqa.selenium.grid.data.DefaultSlotMatcher; +import org.openqa.selenium.grid.data.NodeId; import org.openqa.selenium.grid.data.NodeStatus; import org.openqa.selenium.grid.data.RequestId; import org.openqa.selenium.grid.data.Session; @@ -272,7 +273,8 @@ void shouldRemoveSessionAfterNodeIsDown() throws URISyntaxException { .add( capabilities, new TestSessionFactory( - (id, caps) -> new Session(id, uri, capabilities, caps, Instant.now()))) + (id, nodeId, caps) -> + new Session(id, nodeId, uri, capabilities, caps, Instant.now()))) .heartbeatPeriod(Duration.ofSeconds(500000)) .advanced() .healthCheck(() -> new HealthCheck.Result(availability.get(), "TL;DR")) @@ -385,15 +387,17 @@ public static SessionFactory create(Config config, Capabilities stereotype) { throw new RuntimeException(e); } - return new TestSessionFactory(stereotype, (id, caps) -> new SpoofSession(serverUri, caps)); + return new TestSessionFactory( + stereotype, (id, nodeId, caps) -> new SpoofSession(nodeId, serverUri, caps)); } } private static class SpoofSession extends Session implements HttpHandler { - private SpoofSession(URI serverUri, Capabilities capabilities) { + private SpoofSession(NodeId nodeId, URI serverUri, Capabilities capabilities) { super( new SessionId(UUID.randomUUID()), + nodeId, serverUri, new ImmutableCapabilities(), capabilities,
diff --git a/java/test/org/openqa/selenium/grid/router/SessionQueueGridTest.java b/java/test/org/openqa/selenium/grid/router/SessionQueueGridTest.java index be3d745..ca6c161 100644 --- a/java/test/org/openqa/selenium/grid/router/SessionQueueGridTest.java +++ b/java/test/org/openqa/selenium/grid/router/SessionQueueGridTest.java
@@ -120,13 +120,15 @@ public void setup() throws URISyntaxException, MalformedURLException { .add( CAPS, new TestSessionFactory( - (id, caps) -> - new Session(id, nodeUri, new ImmutableCapabilities(), caps, Instant.now()))) + (id, nodeId, caps) -> + new Session( + id, nodeId, nodeUri, new ImmutableCapabilities(), caps, Instant.now()))) .add( CAPS, new TestSessionFactory( - (id, caps) -> - new Session(id, nodeUri, new ImmutableCapabilities(), caps, Instant.now()))) + (id, nodeId, caps) -> + new Session( + id, nodeId, nodeUri, new ImmutableCapabilities(), caps, Instant.now()))) .maximumConcurrentSessions(5) .build(); handler.addHandler(localNode);
diff --git a/java/test/org/openqa/selenium/grid/router/SessionQueueGridWithTimeoutTest.java b/java/test/org/openqa/selenium/grid/router/SessionQueueGridWithTimeoutTest.java index cd48aef..2ebf6d1 100644 --- a/java/test/org/openqa/selenium/grid/router/SessionQueueGridWithTimeoutTest.java +++ b/java/test/org/openqa/selenium/grid/router/SessionQueueGridWithTimeoutTest.java
@@ -118,13 +118,13 @@ public void setup() throws URISyntaxException, MalformedURLException { .add( CAPS, new TestSessionFactory( - (id, caps) -> { + (id, nodeId, caps) -> { try { Thread.sleep(6000); // simulate a session that takes long to create } catch (Exception e) { } return new Session( - id, nodeUri, new ImmutableCapabilities(), caps, Instant.now()); + id, nodeId, nodeUri, new ImmutableCapabilities(), caps, Instant.now()); })) .maximumConcurrentSessions(1) .build();
diff --git a/java/test/org/openqa/selenium/grid/sessionmap/SessionMapTest.java b/java/test/org/openqa/selenium/grid/sessionmap/SessionMapTest.java index 18aee99..1572d14 100644 --- a/java/test/org/openqa/selenium/grid/sessionmap/SessionMapTest.java +++ b/java/test/org/openqa/selenium/grid/sessionmap/SessionMapTest.java
@@ -33,6 +33,7 @@ import org.openqa.selenium.NoSuchSessionException; import org.openqa.selenium.events.EventBus; import org.openqa.selenium.events.local.GuavaEventBus; +import org.openqa.selenium.grid.data.NodeId; import org.openqa.selenium.grid.data.Session; import org.openqa.selenium.grid.data.SessionClosedEvent; import org.openqa.selenium.grid.sessionmap.local.LocalSessionMap; @@ -52,6 +53,7 @@ class SessionMapTest { private SessionId id; + private NodeId nodeId; private Session expected; private SessionMap local; private HttpClient client; @@ -61,9 +63,11 @@ class SessionMapTest { @BeforeEach public void setUp() throws URISyntaxException { id = new SessionId(UUID.randomUUID()); + nodeId = new NodeId(UUID.randomUUID()); expected = new Session( id, + nodeId, new URI("http://localhost:1234"), new ImmutableCapabilities(), new ImmutableCapabilities(),
diff --git a/java/test/org/openqa/selenium/grid/sessionmap/jdbc/JdbcBackedSessionMapTest.java b/java/test/org/openqa/selenium/grid/sessionmap/jdbc/JdbcBackedSessionMapTest.java index 4ba3f67..2680a94 100644 --- a/java/test/org/openqa/selenium/grid/sessionmap/jdbc/JdbcBackedSessionMapTest.java +++ b/java/test/org/openqa/selenium/grid/sessionmap/jdbc/JdbcBackedSessionMapTest.java
@@ -36,6 +36,7 @@ import org.openqa.selenium.NoSuchSessionException; import org.openqa.selenium.events.EventBus; import org.openqa.selenium.events.local.GuavaEventBus; +import org.openqa.selenium.grid.data.NodeId; import org.openqa.selenium.grid.data.Session; import org.openqa.selenium.grid.sessionmap.SessionMap; import org.openqa.selenium.remote.SessionId; @@ -104,6 +105,7 @@ void canCreateAJdbcBackedSessionMap() throws URISyntaxException { Session expected = new Session( new SessionId(UUID.randomUUID()), + new NodeId(UUID.randomUUID()), new URI("http://example.com/foo"), new ImmutableCapabilities("foo", "bar"), new ImmutableCapabilities("key", "value"), @@ -124,6 +126,7 @@ void shouldBeAbleToRemoveSessions() throws URISyntaxException { Session expected = new Session( new SessionId(UUID.randomUUID()), + new NodeId(UUID.randomUUID()), new URI("http://example.com/foo"), new ImmutableCapabilities("foo", "bar"), new ImmutableCapabilities("key", "value"),
diff --git a/java/test/org/openqa/selenium/grid/sessionmap/redis/RedisBackedSessionMapTest.java b/java/test/org/openqa/selenium/grid/sessionmap/redis/RedisBackedSessionMapTest.java index ce8ebfe..55c6b46 100644 --- a/java/test/org/openqa/selenium/grid/sessionmap/redis/RedisBackedSessionMapTest.java +++ b/java/test/org/openqa/selenium/grid/sessionmap/redis/RedisBackedSessionMapTest.java
@@ -33,6 +33,7 @@ import org.openqa.selenium.NoSuchSessionException; import org.openqa.selenium.events.EventBus; import org.openqa.selenium.events.local.GuavaEventBus; +import org.openqa.selenium.grid.data.NodeId; import org.openqa.selenium.grid.data.Session; import org.openqa.selenium.net.PortProber; import org.openqa.selenium.remote.SessionId; @@ -80,6 +81,7 @@ void canGetTheUriOfASessionWithoutNeedingUrl() throws URISyntaxException { Session expected = new Session( new SessionId(UUID.randomUUID()), + new NodeId(UUID.randomUUID()), new URI("http://example.com/foo"), new ImmutableCapabilities(), new ImmutableCapabilities(), @@ -96,6 +98,7 @@ void canCreateARedisBackedSessionMap() throws URISyntaxException { Session expected = new Session( new SessionId(UUID.randomUUID()), + new NodeId(UUID.randomUUID()), new URI("http://example.com/foo"), new ImmutableCapabilities(), new ImmutableCapabilities("cheese", "beyaz peynir"), @@ -112,6 +115,7 @@ void shouldBeAbleToRemoveSessions() throws URISyntaxException { Session expected = new Session( new SessionId(UUID.randomUUID()), + new NodeId(UUID.randomUUID()), new URI("http://example.com/foo"), new ImmutableCapabilities(), new ImmutableCapabilities("cheese", "beyaz peynir"),
diff --git a/java/test/org/openqa/selenium/grid/sessionqueue/local/LocalNewSessionQueueTest.java b/java/test/org/openqa/selenium/grid/sessionqueue/local/LocalNewSessionQueueTest.java index 97f85db..50517d0 100644 --- a/java/test/org/openqa/selenium/grid/sessionqueue/local/LocalNewSessionQueueTest.java +++ b/java/test/org/openqa/selenium/grid/sessionqueue/local/LocalNewSessionQueueTest.java
@@ -66,6 +66,7 @@ import org.openqa.selenium.SessionNotCreatedException; import org.openqa.selenium.grid.data.CreateSessionResponse; import org.openqa.selenium.grid.data.DefaultSlotMatcher; +import org.openqa.selenium.grid.data.NodeId; import org.openqa.selenium.grid.data.RequestId; import org.openqa.selenium.grid.data.Session; import org.openqa.selenium.grid.data.SessionRequest; @@ -188,6 +189,7 @@ void testCompleteWithCreatedSession(Supplier<TestData> supplier) throws Interrup Session session = new Session( sessionId, + new NodeId(UUID.randomUUID()), URI.create("https://example.com"), CAPS, capabilities, @@ -235,6 +237,7 @@ void testCompleteWithSessionInTimeout(Supplier<TestData> supplier) throws Interr Session session = new Session( sessionId, + new NodeId(UUID.randomUUID()), URI.create("https://example.com"), CAPS, capabilities, @@ -280,6 +283,7 @@ void shouldBeAbleToAddToQueueAndGetValidResponse(Supplier<TestData> supplier) { Session session = new Session( sessionId, + new NodeId(UUID.randomUUID()), URI.create("https://example.com"), CAPS, capabilities, @@ -391,6 +395,7 @@ void shouldBeAbleToAddToQueueWithTimeoutAndTimeoutResponse(Supplier<TestData> su Session session = new Session( sessionId, + new NodeId(UUID.randomUUID()), URI.create("https://example.com"), CAPS, capabilities, @@ -553,6 +558,7 @@ void shouldBeAbleToRetryRequest(Supplier<TestData> supplier) { Session session = new Session( sessionId, + new NodeId(UUID.randomUUID()), new URI("http://example.com"), CAPS, capabilities, @@ -606,6 +612,7 @@ void shouldBeAbleToHandleMultipleSessionRequestsAtTheSameTime(Supplier<TestData> Session session = new Session( sessionId, + new NodeId(UUID.randomUUID()), new URI("https://example.com"), CAPS, capabilities,
diff --git a/java/test/org/openqa/selenium/grid/testing/TestSessionFactory.java b/java/test/org/openqa/selenium/grid/testing/TestSessionFactory.java index 60719a2..915a72b 100644 --- a/java/test/org/openqa/selenium/grid/testing/TestSessionFactory.java +++ b/java/test/org/openqa/selenium/grid/testing/TestSessionFactory.java
@@ -26,11 +26,11 @@ import java.net.URL; import java.time.Instant; import java.util.UUID; -import java.util.function.BiFunction; import org.openqa.selenium.Capabilities; import org.openqa.selenium.ImmutableCapabilities; import org.openqa.selenium.WebDriverException; import org.openqa.selenium.grid.data.CreateSessionRequest; +import org.openqa.selenium.grid.data.NodeId; import org.openqa.selenium.grid.data.Session; import org.openqa.selenium.grid.node.ActiveSession; import org.openqa.selenium.grid.node.BaseActiveSession; @@ -44,15 +44,21 @@ public class TestSessionFactory implements SessionFactory { - private final Capabilities stereotype; - private final BiFunction<SessionId, Capabilities, Session> sessionGenerator; + public interface SessionGenerator<T, U, R, N> { + N apply(T t, U u, R r); + } - public TestSessionFactory(BiFunction<SessionId, Capabilities, Session> sessionGenerator) { + private final Capabilities stereotype; + private final SessionGenerator<SessionId, NodeId, Capabilities, Session> sessionGenerator; + + public TestSessionFactory( + SessionGenerator<SessionId, NodeId, Capabilities, Session> sessionGenerator) { this(new ImmutableCapabilities(), sessionGenerator); } public TestSessionFactory( - Capabilities stereotype, BiFunction<SessionId, Capabilities, Session> sessionGenerator) { + Capabilities stereotype, + SessionGenerator<SessionId, NodeId, Capabilities, Session> sessionGenerator) { this.stereotype = ImmutableCapabilities.copyOf(stereotype); this.sessionGenerator = sessionGenerator; } @@ -63,9 +69,10 @@ public Capabilities getStereotype() { } @Override - public Either<WebDriverException, ActiveSession> apply(CreateSessionRequest sessionRequest) { + public Either<WebDriverException, ActiveSession> apply( + NodeId nodeId, CreateSessionRequest sessionRequest) { SessionId id = new SessionId(UUID.randomUUID()); - Session session = sessionGenerator.apply(id, sessionRequest.getDesiredCapabilities()); + Session session = sessionGenerator.apply(id, nodeId, sessionRequest.getDesiredCapabilities()); URL url; try { @@ -82,6 +89,7 @@ public Either<WebDriverException, ActiveSession> apply(CreateSessionRequest sess BaseActiveSession activeSession = new BaseActiveSession( session.getId(), + session.getNodeId(), url, downstream, W3C,