Skip to content

Commit ec807f8

Browse files
committed
[grid] Sharing queue as a list for GraphQL
Fixes SeleniumHQ/docker-selenium#1186
1 parent cd6c82e commit ec807f8

8 files changed

Lines changed: 61 additions & 83 deletions

File tree

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,15 @@ public class Grid {
4242
private static final Json JSON = new Json();
4343
private final URI uri;
4444
private final Supplier<DistributorStatus> distributorStatus;
45-
private final Map<String, Object> queueInfoMap;
45+
private final List<Object> queueInfoList;
4646
private final String version;
4747

4848
public Grid(Distributor distributor, NewSessionQueuer newSessionQueuer, URI uri,
4949
String version) {
5050
Require.nonNull("Distributor", distributor);
5151
this.uri = Require.nonNull("Grid's public URI", uri);
5252
NewSessionQueuer sessionQueuer = Require.nonNull("NewSessionQueuer", newSessionQueuer);
53-
this.queueInfoMap = sessionQueuer.getQueueContents();
53+
this.queueInfoList = sessionQueuer.getQueueContents();
5454
this.distributorStatus = Suppliers.memoize(distributor::getStatus);
5555
this.version = Require.nonNull("Grid's version", version);
5656
}
@@ -124,12 +124,11 @@ public int getMaxSession() {
124124
}
125125

126126
public int getSessionQueueSize() {
127-
return (int) queueInfoMap.get("request-count");
127+
return queueInfoList.size();
128128
}
129129

130130
public List<String> getSessionQueueRequests() {
131-
//noinspection unchecked
132-
return ((List<Capabilities>) queueInfoMap.get("request-payloads")).stream()
131+
return queueInfoList.stream()
133132
.map(JSON::toJson)
134133
.collect(Collectors.toList());
135134
}

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

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,27 +19,28 @@
1919

2020
import org.openqa.selenium.grid.data.RequestId;
2121
import org.openqa.selenium.internal.Require;
22-
2322
import org.openqa.selenium.remote.http.HttpRequest;
2423
import org.openqa.selenium.remote.tracing.Tracer;
2524
import org.openqa.selenium.status.HasReadyState;
2625

2726
import java.time.Duration;
2827
import java.time.Instant;
29-
import java.util.Map;
28+
import java.util.List;
3029
import java.util.Optional;
3130

3231
public abstract class NewSessionQueue implements HasReadyState {
3332

33+
public static final String SESSIONREQUEST_TIMESTAMP_HEADER = "new-session-request-timestamp";
34+
public static final String SESSIONREQUEST_ID_HEADER = "request-id";
3435
protected final Tracer tracer;
35-
3636
protected final Duration retryInterval;
37-
3837
protected final Duration requestTimeout;
3938

40-
public static final String SESSIONREQUEST_TIMESTAMP_HEADER = "new-session-request-timestamp";
41-
42-
public static final String SESSIONREQUEST_ID_HEADER = "request-id";
39+
protected NewSessionQueue(Tracer tracer, Duration retryInterval, Duration requestTimeout) {
40+
this.tracer = Require.nonNull("Tracer", tracer);
41+
this.retryInterval = Require.nonNull("Session request retry interval", retryInterval);
42+
this.requestTimeout = Require.nonNull("Session request timeout", requestTimeout);
43+
}
4344

4445
public abstract boolean offerLast(HttpRequest request, RequestId requestId);
4546

@@ -51,7 +52,7 @@ public abstract class NewSessionQueue implements HasReadyState {
5152

5253
public abstract int getQueueSize();
5354

54-
public abstract Map<String,Object> getQueueContents();
55+
public abstract List<Object> getQueuedRequests();
5556

5657
public void addRequestHeaders(HttpRequest request, RequestId reqId) {
5758
long timestamp = Instant.now().getEpochSecond();
@@ -69,10 +70,4 @@ public boolean hasRequestTimedOut(HttpRequest request) {
6970
return duration.compareTo(requestTimeout) > 0;
7071
}
7172

72-
protected NewSessionQueue(Tracer tracer, Duration retryInterval, Duration requestTimeout) {
73-
this.tracer = Require.nonNull("Tracer", tracer);
74-
this.retryInterval = Require.nonNull("Session request retry interval", retryInterval);
75-
this.requestTimeout = Require.nonNull("Session request timeout", requestTimeout);
76-
}
77-
7873
}

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

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,6 @@
1717

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

20-
import static org.openqa.selenium.remote.http.Contents.reader;
21-
import static org.openqa.selenium.remote.http.Route.combine;
22-
import static org.openqa.selenium.remote.http.Route.delete;
23-
import static org.openqa.selenium.remote.http.Route.get;
24-
import static org.openqa.selenium.remote.http.Route.post;
25-
import static org.openqa.selenium.remote.tracing.Tags.EXCEPTION;
26-
2720
import org.openqa.selenium.Capabilities;
2821
import org.openqa.selenium.SessionNotCreatedException;
2922
import org.openqa.selenium.grid.data.RequestId;
@@ -46,15 +39,23 @@
4639
import java.io.Reader;
4740
import java.util.HashMap;
4841
import java.util.Iterator;
42+
import java.util.List;
4943
import java.util.Map;
5044
import java.util.Objects;
5145
import java.util.Optional;
5246
import java.util.UUID;
5347

48+
import static org.openqa.selenium.remote.http.Contents.reader;
49+
import static org.openqa.selenium.remote.http.Route.combine;
50+
import static org.openqa.selenium.remote.http.Route.delete;
51+
import static org.openqa.selenium.remote.http.Route.get;
52+
import static org.openqa.selenium.remote.http.Route.post;
53+
import static org.openqa.selenium.remote.tracing.Tags.EXCEPTION;
54+
5455
public abstract class NewSessionQueuer implements HasReadyState, Routable {
5556

56-
private final Route routes;
5757
protected final Tracer tracer;
58+
private final Route routes;
5859

5960
protected NewSessionQueuer(Tracer tracer, Secret registrationSecret) {
6061
this.tracer = Require.nonNull("Tracer", tracer);
@@ -125,7 +126,7 @@ public void validateSessionRequest(HttpRequest request) {
125126

126127
public abstract int clearQueue();
127128

128-
public abstract Map<String, Object> getQueueContents();
129+
public abstract List<Object> getQueueContents();
129130

130131
@Override
131132
public boolean matches(HttpRequest req) {

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

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,26 +17,22 @@
1717

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

20-
import com.google.common.collect.ImmutableMap;
21-
import org.openqa.selenium.Capabilities;
2220
import org.openqa.selenium.events.EventBus;
2321
import org.openqa.selenium.grid.config.Config;
2422
import org.openqa.selenium.grid.data.NewSessionErrorResponse;
2523
import org.openqa.selenium.grid.data.NewSessionRejectedEvent;
2624
import org.openqa.selenium.grid.data.NewSessionRequestEvent;
2725
import org.openqa.selenium.grid.data.RequestId;
26+
import org.openqa.selenium.grid.jmx.JMXHelper;
27+
import org.openqa.selenium.grid.jmx.ManagedAttribute;
28+
import org.openqa.selenium.grid.jmx.ManagedService;
2829
import org.openqa.selenium.grid.log.LoggingOptions;
2930
import org.openqa.selenium.grid.server.EventBusOptions;
3031
import org.openqa.selenium.grid.sessionqueue.NewSessionQueue;
3132
import org.openqa.selenium.grid.sessionqueue.config.NewSessionQueueOptions;
3233
import org.openqa.selenium.internal.Require;
3334
import org.openqa.selenium.remote.NewSessionPayload;
3435
import org.openqa.selenium.remote.http.HttpRequest;
35-
36-
import org.openqa.selenium.grid.jmx.JMXHelper;
37-
import org.openqa.selenium.grid.jmx.ManagedAttribute;
38-
import org.openqa.selenium.grid.jmx.ManagedService;
39-
4036
import org.openqa.selenium.remote.tracing.AttributeKey;
4137
import org.openqa.selenium.remote.tracing.EventAttribute;
4238
import org.openqa.selenium.remote.tracing.EventAttributeValue;
@@ -48,11 +44,11 @@
4844
import java.time.Duration;
4945
import java.util.Deque;
5046
import java.util.HashMap;
51-
import java.util.List;
5247
import java.util.Iterator;
48+
import java.util.List;
5349
import java.util.Map;
54-
import java.util.Optional;
5550
import java.util.Objects;
51+
import java.util.Optional;
5652
import java.util.concurrent.ConcurrentLinkedDeque;
5753
import java.util.concurrent.Executors;
5854
import java.util.concurrent.ScheduledExecutorService;
@@ -112,11 +108,11 @@ public int getQueueSize() {
112108
}
113109

114110
@Override
115-
public Map<String, Object> getQueueContents() {
111+
public List<Object> getQueuedRequests() {
116112
Lock readLock = lock.readLock();
117113
readLock.lock();
118114
try {
119-
List<Capabilities> capabilitiesList = sessionRequests.stream()
115+
return sessionRequests.stream()
120116
.map(SessionRequest::getHttpRequest)
121117
.map(req -> {
122118
try (
@@ -132,10 +128,6 @@ public Map<String, Object> getQueueContents() {
132128
.filter(Iterator::hasNext)
133129
.map(Iterator::next)
134130
.collect(Collectors.toList());
135-
136-
return ImmutableMap.of(
137-
"request-count", capabilitiesList.size(),
138-
"request-payloads", capabilitiesList);
139131
} finally {
140132
readLock.unlock();
141133
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,13 @@
3434
import org.openqa.selenium.remote.tracing.Tracer;
3535

3636
import java.time.Duration;
37-
import java.util.Map;
37+
import java.util.List;
3838
import java.util.Optional;
3939

4040
public class LocalNewSessionQueuer extends NewSessionQueuer {
4141

42-
private final EventBus bus;
4342
public final NewSessionQueue sessionRequests;
43+
private final EventBus bus;
4444

4545
public LocalNewSessionQueuer(
4646
Tracer tracer,
@@ -93,8 +93,8 @@ public int clearQueue() {
9393
}
9494

9595
@Override
96-
public Map<String, Object> getQueueContents() {
97-
return sessionRequests.getQueueContents();
96+
public List<Object> getQueueContents() {
97+
return sessionRequests.getQueuedRequests();
9898
}
9999

100100
@Override

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

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,6 @@
1717

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

20-
import static java.net.HttpURLConnection.HTTP_OK;
21-
import static org.openqa.selenium.grid.sessionqueue.NewSessionQueue.SESSIONREQUEST_ID_HEADER;
22-
import static org.openqa.selenium.grid.sessionqueue.NewSessionQueue.SESSIONREQUEST_TIMESTAMP_HEADER;
23-
import static org.openqa.selenium.remote.http.HttpMethod.DELETE;
24-
import static org.openqa.selenium.remote.http.HttpMethod.GET;
25-
import static org.openqa.selenium.remote.http.HttpMethod.POST;
26-
2720
import org.openqa.selenium.grid.config.Config;
2821
import org.openqa.selenium.grid.data.RequestId;
2922
import org.openqa.selenium.grid.log.LoggingOptions;
@@ -45,16 +38,21 @@
4538
import java.io.UncheckedIOException;
4639
import java.net.MalformedURLException;
4740
import java.net.URI;
48-
import java.util.Map;
41+
import java.util.List;
4942
import java.util.Optional;
50-
import java.util.logging.Logger;
43+
44+
import static java.net.HttpURLConnection.HTTP_OK;
45+
import static org.openqa.selenium.grid.sessionqueue.NewSessionQueue.SESSIONREQUEST_ID_HEADER;
46+
import static org.openqa.selenium.grid.sessionqueue.NewSessionQueue.SESSIONREQUEST_TIMESTAMP_HEADER;
47+
import static org.openqa.selenium.remote.http.HttpMethod.DELETE;
48+
import static org.openqa.selenium.remote.http.HttpMethod.GET;
49+
import static org.openqa.selenium.remote.http.HttpMethod.POST;
5150

5251
public class RemoteNewSessionQueuer extends NewSessionQueuer {
5352

54-
private static final Logger LOG = Logger.getLogger(RemoteNewSessionQueuer.class.getName());
53+
private static final String timestampHeader = SESSIONREQUEST_TIMESTAMP_HEADER;
54+
private static final String reqIdHeader = SESSIONREQUEST_ID_HEADER;
5555
private final HttpClient client;
56-
private static final String timestampHeader= SESSIONREQUEST_TIMESTAMP_HEADER;
57-
private static final String reqIdHeader= SESSIONREQUEST_ID_HEADER;
5856
private final Filter addSecret;
5957

6058
public RemoteNewSessionQueuer(Tracer tracer, HttpClient client, Secret registrationSecret) {
@@ -131,11 +129,11 @@ public int clearQueue() {
131129
}
132130

133131
@Override
134-
public Map<String, Object> getQueueContents() {
132+
public List<Object> getQueueContents() {
135133
HttpRequest upstream = new HttpRequest(GET, "/se/grid/newsessionqueuer/queue");
136134
HttpTracing.inject(tracer, tracer.getCurrentContext(), upstream);
137135
HttpResponse response = client.execute(upstream);
138-
return Values.get(response, Map.class);
136+
return Values.get(response, List.class);
139137
}
140138

141139
@Override

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

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
package org.openqa.selenium.grid.sessionqueue;
1919

2020
import com.google.common.collect.ImmutableMap;
21-
2221
import org.junit.Before;
2322
import org.junit.Test;
2423
import org.openqa.selenium.Capabilities;
@@ -56,7 +55,6 @@
5655
import java.time.Duration;
5756
import java.time.Instant;
5857
import java.util.List;
59-
import java.util.Map;
6058
import java.util.Optional;
6159
import java.util.UUID;
6260
import java.util.concurrent.Callable;
@@ -84,15 +82,15 @@
8482

8583
public class NewSessionQueuerTest {
8684

85+
private static final Json JSON = new Json();
86+
private static int count = 0;
87+
private final Secret registrationSecret = new Secret("secret");
8788
private LocalNewSessionQueuer local;
8889
private RemoteNewSessionQueuer remote;
8990
private EventBus bus;
9091
private ImmutableCapabilities caps;
9192
private NewSessionPayload payload;
9293
private HttpRequest request;
93-
private static int count = 0;
94-
private static final Json JSON = new Json();
95-
private final Secret registrationSecret = new Secret("secret");
9694
private NewSessionQueue sessionQueue;
9795

9896

@@ -235,27 +233,25 @@ public void shouldBeAbleToGetQueueContents() {
235233
RequestId requestId = new RequestId(UUID.randomUUID());
236234
sessionQueue.offerLast(request, requestId);
237235

238-
Map<String, Object> response = local.getQueueContents();
236+
List<Object> response = local.getQueueContents();
239237
assertThat(response).isNotNull();
240238

241-
assertEquals(1, response.get("request-count"));
239+
assertEquals(1, response.size());
242240

243-
List<Capabilities> capabilitiesList = (List<Capabilities>) response.get("request-payloads");
244-
assertEquals(caps, capabilitiesList.get(0));
241+
assertEquals(caps, response.get(0));
245242
}
246243

247244
@Test
248245
public void shouldBeAbleToGetQueueContentsRemotely() {
249246
RequestId requestId = new RequestId(UUID.randomUUID());
250247
sessionQueue.offerLast(request, requestId);
251248

252-
Map<String, Object> response = sessionQueue.getQueueContents();
249+
List<Object> response = sessionQueue.getQueuedRequests();
253250
assertThat(response).isNotNull();
254251

255-
assertEquals(1, response.get("request-count"));
252+
assertEquals(1, response.size());
256253

257-
List<Capabilities> capabilitiesList = (List<Capabilities>) response.get("request-payloads");
258-
assertEquals(caps, capabilitiesList.get(0));
254+
assertEquals(caps, response.iterator().next());
259255
}
260256

261257
@Test

0 commit comments

Comments
 (0)