Skip to content

Commit 7de1d2b

Browse files
pujaganidiemol
andauthored
[grid] Add endpoint to return new session request queue contents (#9078)
* [grid] Add endpoint to return session queue contents * [grid] Update session queue contents tests. * [grid] Fix imports in LocalNewSessionQueue * [grid] Remove unused import * [grid] Remove unused json import from LocalNewSessionQueue * [grid] Rename the session queue contents endpoint. * [grid] Remove queue size endpoint Co-authored-by: Diego Molina <[email protected]>
1 parent 29ecb67 commit 7de1d2b

File tree

11 files changed

+117
-49
lines changed

11 files changed

+117
-49
lines changed

java/server/src/org/openqa/selenium/grid/graphql/Grid.java

-4
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,4 @@ public int getTotalSlots() {
9999
public int getUsedSlots() {
100100
return getSessionCount();
101101
}
102-
103-
public int getSessionQueueSize() {
104-
return newSessionQueuer.getQueueSize();
105-
}
106102
}

java/server/src/org/openqa/selenium/grid/graphql/selenium-grid-schema.graphqls

-1
Original file line numberDiff line numberDiff line change
@@ -47,5 +47,4 @@ type Grid {
4747
totalSlots: Int
4848
usedSlots: Int
4949
sessionCount: Int!
50-
sessionQueueSize: Int!
5150
}

java/server/src/org/openqa/selenium/grid/sessionqueue/GetNewSessionQueueSize.java renamed to java/server/src/org/openqa/selenium/grid/sessionqueue/GetSessionQueue.java

+7-9
Original file line numberDiff line numberDiff line change
@@ -17,40 +17,38 @@
1717

1818
package org.openqa.selenium.grid.sessionqueue;
1919

20-
import com.google.common.collect.ImmutableMap;
2120
import org.openqa.selenium.internal.Require;
2221
import org.openqa.selenium.remote.http.HttpHandler;
2322
import org.openqa.selenium.remote.http.HttpRequest;
2423
import org.openqa.selenium.remote.http.HttpResponse;
2524
import org.openqa.selenium.remote.tracing.Span;
2625
import org.openqa.selenium.remote.tracing.Tracer;
2726

27+
import java.util.Collections;
28+
2829
import static org.openqa.selenium.remote.http.Contents.asJson;
2930
import static org.openqa.selenium.remote.tracing.HttpTracing.newSpanAsChildOf;
3031
import static org.openqa.selenium.remote.tracing.Tags.HTTP_REQUEST;
3132
import static org.openqa.selenium.remote.tracing.Tags.HTTP_RESPONSE;
3233

33-
class GetNewSessionQueueSize implements HttpHandler {
34+
class GetSessionQueue implements HttpHandler {
3435

3536
private final Tracer tracer;
3637
private final NewSessionQueuer newSessionQueuer;
3738

38-
GetNewSessionQueueSize(Tracer tracer, NewSessionQueuer newSessionQueuer) {
39+
GetSessionQueue(Tracer tracer, NewSessionQueuer newSessionQueuer) {
3940
this.tracer = Require.nonNull("Tracer", tracer);
4041
this.newSessionQueuer = Require.nonNull("New Session Queuer", newSessionQueuer);
4142
}
4243

4344
@Override
4445
public HttpResponse execute(HttpRequest req) {
45-
try (Span span = newSpanAsChildOf(tracer, req, "sessionqueue.size")) {
46+
try (Span span = newSpanAsChildOf(tracer, req, "sessionqueue.contents")) {
4647
HTTP_REQUEST.accept(span, req);
4748

48-
int value = newSessionQueuer.getQueueSize();
49-
50-
span.setAttribute("request.retry", value);
51-
5249
HttpResponse response = new HttpResponse()
53-
.setContent(asJson(ImmutableMap.of("value", value)));
50+
.setContent(asJson(Collections.singletonMap(
51+
"value", newSessionQueuer.getQueueContents())));
5452

5553
HTTP_RESPONSE.accept(span, response);
5654

java/server/src/org/openqa/selenium/grid/sessionqueue/NewSessionQueue.java

+3
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
import java.time.Duration;
2828
import java.time.Instant;
29+
import java.util.Map;
2930
import java.util.Optional;
3031

3132
public abstract class NewSessionQueue implements HasReadyState {
@@ -50,6 +51,8 @@ public abstract class NewSessionQueue implements HasReadyState {
5051

5152
public abstract int getQueueSize();
5253

54+
public abstract Map<String,Object> getQueueContents();
55+
5356
public void addRequestHeaders(HttpRequest request, RequestId reqId) {
5457
long timestamp = Instant.now().getEpochSecond();
5558
request.addHeader(SESSIONREQUEST_TIMESTAMP_HEADER, Long.toString(timestamp));

java/server/src/org/openqa/selenium/grid/sessionqueue/NewSessionQueuer.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@ protected NewSessionQueuer(Tracer tracer, Secret registrationSecret) {
7474
get("/se/grid/newsessionqueuer/session/{requestId}")
7575
.to(params -> new RemoveFromSessionQueue(tracer, this, requestIdFrom(params)))
7676
.with(requiresSecret),
77-
get("/se/grid/newsessionqueuer/queue/size")
78-
.to(() -> new GetNewSessionQueueSize(tracer, this)),
77+
get("/se/grid/newsessionqueuer/queue")
78+
.to(() -> new GetSessionQueue(tracer, this)),
7979
delete("/se/grid/newsessionqueuer/queue")
8080
.to(() -> new ClearSessionQueue(tracer, this))
8181
.with(requiresSecret));
@@ -125,7 +125,7 @@ public void validateSessionRequest(HttpRequest request) {
125125

126126
public abstract int clearQueue();
127127

128-
public abstract int getQueueSize();
128+
public abstract Map<String, Object> getQueueContents();
129129

130130
@Override
131131
public boolean matches(HttpRequest req) {

java/server/src/org/openqa/selenium/grid/sessionqueue/local/LocalNewSessionQueue.java

+41
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717

1818
package org.openqa.selenium.grid.sessionqueue.local;
1919

20+
import com.google.common.collect.ImmutableMap;
21+
import org.openqa.selenium.Capabilities;
2022
import org.openqa.selenium.events.EventBus;
2123
import org.openqa.selenium.grid.config.Config;
2224
import org.openqa.selenium.grid.data.NewSessionErrorResponse;
@@ -28,6 +30,7 @@
2830
import org.openqa.selenium.grid.sessionqueue.NewSessionQueue;
2931
import org.openqa.selenium.grid.sessionqueue.config.NewSessionQueueOptions;
3032
import org.openqa.selenium.internal.Require;
33+
import org.openqa.selenium.remote.NewSessionPayload;
3134
import org.openqa.selenium.remote.http.HttpRequest;
3235

3336
import org.openqa.selenium.remote.server.jmx.JMXHelper;
@@ -40,11 +43,16 @@
4043
import org.openqa.selenium.remote.tracing.Span;
4144
import org.openqa.selenium.remote.tracing.Tracer;
4245

46+
import java.io.IOException;
47+
import java.io.Reader;
4348
import java.time.Duration;
4449
import java.util.Deque;
4550
import java.util.HashMap;
51+
import java.util.List;
52+
import java.util.Iterator;
4653
import java.util.Map;
4754
import java.util.Optional;
55+
import java.util.Objects;
4856
import java.util.concurrent.ConcurrentLinkedDeque;
4957
import java.util.concurrent.Executors;
5058
import java.util.concurrent.ScheduledExecutorService;
@@ -54,6 +62,9 @@
5462
import java.util.concurrent.locks.ReentrantReadWriteLock;
5563
import java.util.logging.Level;
5664
import java.util.logging.Logger;
65+
import java.util.stream.Collectors;
66+
67+
import static org.openqa.selenium.remote.http.Contents.reader;
5768

5869
@ManagedService(objectName = "org.seleniumhq.grid:type=SessionQueue,name=LocalSessionQueue",
5970
description = "New session queue")
@@ -100,6 +111,36 @@ public int getQueueSize() {
100111
}
101112
}
102113

114+
@Override
115+
public Map<String, Object> getQueueContents() {
116+
Lock readLock = lock.readLock();
117+
readLock.lock();
118+
try {
119+
List<Capabilities> capabilitiesList = sessionRequests.stream()
120+
.map(SessionRequest::getHttpRequest)
121+
.map(req -> {
122+
try (
123+
Reader reader = reader(req);
124+
NewSessionPayload payload = NewSessionPayload.create(reader)) {
125+
return payload.stream().iterator();
126+
} catch (IOException e) {
127+
LOG.warning("IOException while mapping to capabilities" + e.getMessage());
128+
}
129+
return null;
130+
})
131+
.filter(Objects::nonNull)
132+
.filter(Iterator::hasNext)
133+
.map(Iterator::next)
134+
.collect(Collectors.toList());
135+
136+
return ImmutableMap.of(
137+
"request-count", capabilitiesList.size(),
138+
"request-payloads", capabilitiesList);
139+
} finally {
140+
readLock.unlock();
141+
}
142+
}
143+
103144
@Override
104145
public boolean offerLast(HttpRequest request, RequestId requestId) {
105146
Require.nonNull("New Session request", request);

java/server/src/org/openqa/selenium/grid/sessionqueue/local/LocalNewSessionQueuer.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.openqa.selenium.remote.tracing.Tracer;
3535

3636
import java.time.Duration;
37+
import java.util.Map;
3738
import java.util.Optional;
3839

3940
public class LocalNewSessionQueuer extends NewSessionQueuer {
@@ -92,8 +93,8 @@ public int clearQueue() {
9293
}
9394

9495
@Override
95-
public int getQueueSize() {
96-
return sessionRequests.getQueueSize();
96+
public Map<String, Object> getQueueContents() {
97+
return sessionRequests.getQueueContents();
9798
}
9899

99100
@Override

java/server/src/org/openqa/selenium/grid/sessionqueue/remote/RemoteNewSessionQueuer.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import java.io.UncheckedIOException;
4646
import java.net.MalformedURLException;
4747
import java.net.URI;
48+
import java.util.Map;
4849
import java.util.Optional;
4950
import java.util.logging.Logger;
5051

@@ -130,12 +131,11 @@ public int clearQueue() {
130131
}
131132

132133
@Override
133-
public int getQueueSize() {
134-
HttpRequest upstream =
135-
new HttpRequest(GET, "/se/grid/newsessionqueuer/queue/size");
134+
public Map<String, Object> getQueueContents() {
135+
HttpRequest upstream = new HttpRequest(GET, "/se/grid/newsessionqueuer/queue");
136136
HttpTracing.inject(tracer, tracer.getCurrentContext(), upstream);
137137
HttpResponse response = client.execute(upstream);
138-
return Values.get(response, Integer.class);
138+
return Values.get(response, Map.class);
139139
}
140140

141141
@Override

java/server/test/org/openqa/selenium/grid/graphql/GraphqlHandlerTest.java

-20
Original file line numberDiff line numberDiff line change
@@ -141,26 +141,6 @@ public void shouldBeAbleToGetGridUri() {
141141
"uri", publicUri.toString()))));
142142
}
143143

144-
@Test
145-
public void shouldBeAbleToGetSessionQueueSize() {
146-
HttpRequest request = new HttpRequest(POST, "/session");
147-
request.setContent(asJson(
148-
ImmutableMap.of(
149-
"capabilities", ImmutableMap.of(
150-
"alwaysMatch", caps))));
151-
152-
localNewSessionQueue.offerLast(request, new RequestId(UUID.randomUUID()));
153-
GraphqlHandler handler = new GraphqlHandler(tracer, distributor, queuer, publicUri);
154-
155-
Map<String, Object> topLevel = executeQuery(handler, "{ grid { sessionQueueSize } }");
156-
157-
assertThat(topLevel).isEqualTo(
158-
singletonMap(
159-
"data", singletonMap(
160-
"grid", singletonMap(
161-
"sessionQueueSize", 1L))));
162-
}
163-
164144
@Test
165145
public void shouldReturnAnEmptyListForNodesIfNoneAreRegistered() {
166146
GraphqlHandler handler = new GraphqlHandler(tracer, distributor, queuer, publicUri);

java/server/test/org/openqa/selenium/grid/sessionqueue/NewSessionQueuerTest.java

+18-6
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@
5555
import java.net.URISyntaxException;
5656
import java.time.Duration;
5757
import java.time.Instant;
58+
import java.util.List;
59+
import java.util.Map;
5860
import java.util.Optional;
5961
import java.util.UUID;
6062
import java.util.concurrent.Callable;
@@ -229,21 +231,31 @@ public void shouldBeClearQueueRemotely() {
229231
}
230232

231233
@Test
232-
public void shouldBeAbleToGetQueueSize() {
234+
public void shouldBeAbleToGetQueueContents() {
233235
RequestId requestId = new RequestId(UUID.randomUUID());
234236
sessionQueue.offerLast(request, requestId);
235237

236-
int size = local.getQueueSize();
237-
assertEquals(1, size);
238+
Map<String, Object> response = local.getQueueContents();
239+
assertThat(response).isNotNull();
240+
241+
assertEquals(1, response.get("request-count"));
242+
243+
List<Capabilities> capabilitiesList = (List<Capabilities>) response.get("request-payloads");
244+
assertEquals(caps, capabilitiesList.get(0));
238245
}
239246

240247
@Test
241-
public void shouldBeAbleToGetQueueSizeRemotely() {
248+
public void shouldBeAbleToGetQueueContentsRemotely() {
242249
RequestId requestId = new RequestId(UUID.randomUUID());
243250
sessionQueue.offerLast(request, requestId);
244251

245-
int size = sessionQueue.getQueueSize();
246-
assertEquals(1, size);
252+
Map<String, Object> response = sessionQueue.getQueueContents();
253+
assertThat(response).isNotNull();
254+
255+
assertEquals(1, response.get("request-count"));
256+
257+
List<Capabilities> capabilitiesList = (List<Capabilities>) response.get("request-payloads");
258+
assertEquals(caps, capabilitiesList.get(0));
247259
}
248260

249261
@Test

java/server/test/org/openqa/selenium/grid/sessionqueue/local/LocalNewSessionQueueTest.java

+38
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@
3636
import java.io.UncheckedIOException;
3737
import java.time.Duration;
3838
import java.time.Instant;
39+
import java.util.List;
40+
import java.util.Map;
3941
import java.util.Optional;
4042
import java.util.UUID;
4143
import java.util.concurrent.CountDownLatch;
@@ -224,6 +226,42 @@ public void shouldBeAbleToGetQueueSize() {
224226
assertEquals(1, size);
225227
}
226228

229+
@Test
230+
public void shouldBeAbleToGetQueueContents() {
231+
long timestamp = Instant.now().getEpochSecond();
232+
233+
ImmutableCapabilities chromeCaps = new ImmutableCapabilities(
234+
"browserName", "chrome",
235+
"platform", "mac",
236+
"version", "87");
237+
NewSessionPayload chromePayload = NewSessionPayload.create(chromeCaps);
238+
HttpRequest chromeRequest = createRequest(chromePayload, POST, "/session");
239+
chromeRequest.addHeader(SESSIONREQUEST_TIMESTAMP_HEADER, Long.toString(timestamp));
240+
RequestId chromeRequestId = new RequestId(UUID.randomUUID());
241+
boolean addedChromeRequest = sessionQueue.offerLast(chromeRequest, chromeRequestId);
242+
assertTrue(addedChromeRequest);
243+
244+
ImmutableCapabilities firefoxCaps = new ImmutableCapabilities(
245+
"browserName", "firefox",
246+
"platform", "windows",
247+
"version", "84");
248+
NewSessionPayload firefoxPayload = NewSessionPayload.create(firefoxCaps);
249+
HttpRequest firefoxRequest = createRequest(firefoxPayload, POST, "/session");
250+
firefoxRequest.addHeader(SESSIONREQUEST_TIMESTAMP_HEADER, Long.toString(timestamp));
251+
RequestId firefoxRequestId = new RequestId(UUID.randomUUID());
252+
boolean addFirefoxRequest = sessionQueue.offerLast(firefoxRequest, firefoxRequestId);
253+
assertTrue(addFirefoxRequest);
254+
255+
Map<String, Object> response = sessionQueue.getQueueContents();
256+
assertThat(response).isNotNull();
257+
258+
assertEquals(2, response.get("request-count"));
259+
260+
List<Capabilities> capabilitiesList = (List<Capabilities>) response.get("request-payloads");
261+
assertEquals(chromeCaps, capabilitiesList.get(0));
262+
assertEquals(firefoxCaps, capabilitiesList.get(1));
263+
}
264+
227265
private HttpRequest createRequest(NewSessionPayload payload, HttpMethod httpMethod, String uri) {
228266
StringBuilder builder = new StringBuilder();
229267
try {

0 commit comments

Comments
 (0)