Skip to content

Commit c8e2a79

Browse files
committed
[grid] Starting containers with the correct network
This will help us to run containers when the user starts everything in a custom network or in docker-compose.
1 parent a625b1e commit c8e2a79

File tree

2 files changed

+46
-28
lines changed

2 files changed

+46
-28
lines changed

java/server/src/org/openqa/selenium/grid/docker/DockerOptions.java

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

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

20-
import static org.openqa.selenium.Platform.WINDOWS;
21-
2220
import com.google.common.collect.HashMultimap;
2321
import com.google.common.collect.ImmutableMultimap;
2422
import com.google.common.collect.Multimap;
@@ -51,12 +49,15 @@
5149
import java.util.concurrent.ExecutionException;
5250
import java.util.logging.Logger;
5351

52+
import static org.openqa.selenium.Platform.WINDOWS;
53+
5454
public class DockerOptions {
5555

5656
static final String DOCKER_SECTION = "docker";
5757
static final String DEFAULT_ASSETS_PATH = "/opt/selenium/assets";
5858
static final String DEFAULT_DOCKER_URL = "unix:/var/run/docker.sock";
5959
static final String DEFAULT_VIDEO_IMAGE = "selenium/video:latest";
60+
private static final String DEFAULT_DOCKER_NETWORK = "bridge";
6061
private static final Logger LOG = Logger.getLogger(DockerOptions.class.getName());
6162
private static final Json JSON = new Json();
6263
private final Config config;
@@ -143,6 +144,7 @@ public Map<Capabilities, Collection<SessionFactory>> getDockerSessionFactories(
143144
loadImages(docker, kinds.keySet().toArray(new String[0]));
144145
Image videoImage = getVideoImage(docker);
145146
loadImages(docker, videoImage.getName());
147+
String networkName = getDockerNetworkName(docker);
146148

147149
int maxContainerCount = Runtime.getRuntime().availableProcessors();
148150
ImmutableMultimap.Builder<Capabilities, SessionFactory> factories = ImmutableMultimap.builder();
@@ -159,13 +161,14 @@ public Map<Capabilities, Collection<SessionFactory>> getDockerSessionFactories(
159161
image,
160162
caps,
161163
videoImage,
162-
assetsPath));
164+
assetsPath,
165+
networkName));
163166
}
164167
LOG.info(String.format(
165-
"Mapping %s to docker image %s %d times",
166-
caps,
167-
name,
168-
maxContainerCount));
168+
"Mapping %s to docker image %s %d times",
169+
caps,
170+
name,
171+
maxContainerCount));
169172
});
170173
return factories.build().asMap();
171174
}
@@ -175,6 +178,18 @@ private Image getVideoImage(Docker docker) {
175178
return docker.getImage(videoImage);
176179
}
177180

181+
private String getDockerNetworkName(Docker docker) {
182+
// Selenium Server is running inside a Docker container, we will inspect that container
183+
// to get the mounted volume and use that. If no volume was mounted, no assets will be saved.
184+
// Since Docker 1.12, the env var HOSTNAME has the container id (unless the user overwrites it)
185+
String hostname = HostIdentifier.getHostName();
186+
Optional<ContainerInfo> info = docker.inspect(new ContainerId(hostname));
187+
if (info.isPresent()) {
188+
return info.get().getNetworkName();
189+
}
190+
return DEFAULT_DOCKER_NETWORK;
191+
}
192+
178193
private DockerAssetsPath getAssetsPath(Docker docker) {
179194
Optional<String> assetsPath = config.get(DOCKER_SECTION, "assets-path");
180195
if (assetsPath.isPresent()) {

java/server/src/org/openqa/selenium/grid/docker/DockerSessionFactory.java

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

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

20-
import static java.util.Optional.ofNullable;
21-
import static org.openqa.selenium.docker.ContainerConfig.image;
22-
import static org.openqa.selenium.remote.Dialect.W3C;
23-
import static org.openqa.selenium.remote.http.Contents.string;
24-
import static org.openqa.selenium.remote.http.HttpMethod.GET;
25-
import static org.openqa.selenium.remote.tracing.Tags.EXCEPTION;
26-
2720
import org.openqa.selenium.Capabilities;
2821
import org.openqa.selenium.Dimension;
2922
import org.openqa.selenium.ImmutableCapabilities;
@@ -81,6 +74,13 @@
8174
import java.util.logging.Level;
8275
import java.util.logging.Logger;
8376

77+
import static java.util.Optional.ofNullable;
78+
import static org.openqa.selenium.docker.ContainerConfig.image;
79+
import static org.openqa.selenium.remote.Dialect.W3C;
80+
import static org.openqa.selenium.remote.http.Contents.string;
81+
import static org.openqa.selenium.remote.http.HttpMethod.GET;
82+
import static org.openqa.selenium.remote.tracing.Tags.EXCEPTION;
83+
8484
public class DockerSessionFactory implements SessionFactory {
8585

8686
private static final Logger LOG = Logger.getLogger(DockerSessionFactory.class.getName());
@@ -93,6 +93,7 @@ public class DockerSessionFactory implements SessionFactory {
9393
private final Capabilities stereotype;
9494
private final Image videoImage;
9595
private final DockerAssetsPath assetsPath;
96+
private final String networkName;
9697

9798
public DockerSessionFactory(
9899
Tracer tracer,
@@ -102,12 +103,14 @@ public DockerSessionFactory(
102103
Image browserImage,
103104
Capabilities stereotype,
104105
Image videoImage,
105-
DockerAssetsPath assetsPath) {
106+
DockerAssetsPath assetsPath,
107+
String networkName) {
106108
this.tracer = Require.nonNull("Tracer", tracer);
107109
this.clientFactory = Require.nonNull("HTTP client", clientFactory);
108110
this.docker = Require.nonNull("Docker command", docker);
109111
this.dockerUri = Require.nonNull("Docker URI", dockerUri);
110112
this.browserImage = Require.nonNull("Docker browser image", browserImage);
113+
this.networkName = Require.nonNull("Docker network name", networkName);
111114
this.stereotype = ImmutableCapabilities.copyOf(
112115
Require.nonNull("Stereotype", stereotype));
113116
this.videoImage = videoImage;
@@ -176,9 +179,8 @@ public Either<WebDriverException, ActiveSession> apply(CreateSessionRequest sess
176179
try {
177180
result = new ProtocolHandshake().createSession(client, command);
178181
response = result.createResponse();
179-
attributeMap.put(
180-
AttributeKey.DRIVER_RESPONSE.getKey(),
181-
EventAttribute.setValue(response.toString()));
182+
attributeMap.put(AttributeKey.DRIVER_RESPONSE.getKey(),
183+
EventAttribute.setValue(response.toString()));
182184
} catch (IOException | RuntimeException e) {
183185
span.setAttribute("error", true);
184186
span.setStatus(Status.CANCELLED);
@@ -242,15 +244,13 @@ public Either<WebDriverException, ActiveSession> apply(CreateSessionRequest sess
242244
}
243245

244246
private Container createBrowserContainer(int port, Capabilities sessionCapabilities) {
245-
Map<String, String> browserContainerEnvVars =
246-
getBrowserContainerEnvVars(sessionCapabilities);
247-
Map<String, String> devShmMount =
248-
Collections.singletonMap("/dev/shm", "/dev/shm");
249-
return docker.create(
250-
image(browserImage)
251-
.env(browserContainerEnvVars)
252-
.bind(devShmMount)
253-
.map(Port.tcp(4444), Port.tcp(port)));
247+
Map<String, String> browserContainerEnvVars = getBrowserContainerEnvVars(sessionCapabilities);
248+
Map<String, String> devShmMount = Collections.singletonMap("/dev/shm", "/dev/shm");
249+
return docker.create(image(browserImage)
250+
.env(browserContainerEnvVars)
251+
.bind(devShmMount)
252+
.map(Port.tcp(4444), Port.tcp(port))
253+
.network(networkName));
254254
}
255255

256256
private Map<String, String> getBrowserContainerEnvVars(Capabilities sessionRequestCapabilities) {
@@ -275,7 +275,10 @@ private Container startVideoContainer(Capabilities sessionCapabilities,
275275
sessionCapabilities,
276276
browserContainerIp);
277277
Map<String, String> volumeBinds = Collections.singletonMap(hostPath, "/videos");
278-
Container videoContainer = docker.create(image(videoImage).env(envVars).bind(volumeBinds));
278+
Container videoContainer = docker.create(image(videoImage)
279+
.env(envVars)
280+
.bind(volumeBinds)
281+
.network(networkName));
279282
videoContainer.start();
280283
LOG.info(String.format("Video container started (id: %s)", videoContainer.getId()));
281284
return videoContainer;

0 commit comments

Comments
 (0)