[ 
https://issues.apache.org/jira/browse/BEAM-3327?focusedWorklogId=78768&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-78768
 ]

ASF GitHub Bot logged work on BEAM-3327:
----------------------------------------

                Author: ASF GitHub Bot
            Created on: 09/Mar/18 02:18
            Start Date: 09/Mar/18 02:18
    Worklog Time Spent: 10m 
      Work Description: bsidhom commented on a change in pull request #4751: 
[BEAM-3327] Implement simple Docker container manager
URL: https://github.com/apache/beam/pull/4751#discussion_r173350125
 
 

 ##########
 File path: 
runners/java-fn-execution/src/main/java/org/apache/beam/runners/fnexecution/environment/SingletonDockerEnvironmentManager.java
 ##########
 @@ -0,0 +1,107 @@
+package org.apache.beam.runners.fnexecution.environment;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.TimeoutException;
+import javax.annotation.concurrent.GuardedBy;
+import org.apache.beam.model.pipeline.v1.RunnerApi.Environment;
+import org.apache.beam.runners.fnexecution.GrpcFnServer;
+import org.apache.beam.runners.fnexecution.artifact.ArtifactRetrievalService;
+import 
org.apache.beam.runners.fnexecution.control.SdkHarnessClientControlService;
+import org.apache.beam.runners.fnexecution.logging.GrpcLoggingService;
+import 
org.apache.beam.runners.fnexecution.provisioning.StaticGrpcProvisionService;
+
+/** An {@link EnvironmentManager} that manages a single docker container. */
+public class SingletonDockerEnvironmentManager implements EnvironmentManager {
+
+  public static SingletonDockerEnvironmentManager forServices(
+      DockerWrapper docker,
+      GrpcFnServer<SdkHarnessClientControlService> controlServiceServer,
+      GrpcFnServer<GrpcLoggingService> loggingServiceServer,
+      GrpcFnServer<ArtifactRetrievalService> retrievalServiceServer,
+      GrpcFnServer<StaticGrpcProvisionService> provisioningServiceServer) {
+    return new SingletonDockerEnvironmentManager(docker, controlServiceServer, 
loggingServiceServer,
+        retrievalServiceServer, provisioningServiceServer);
+  }
+
+  private final Object lock = new Object();
+  private final DockerWrapper docker;
+  private final GrpcFnServer<SdkHarnessClientControlService> 
controlServiceServer;
+  private final GrpcFnServer<GrpcLoggingService> loggingServiceServer;
+  private final GrpcFnServer<ArtifactRetrievalService> retrievalServiceServer;
+  private final GrpcFnServer<StaticGrpcProvisionService> 
provisioningServiceServer;
+
+  @GuardedBy("lock")
+  private RemoteEnvironment dockerEnvironment = null;
+
+  private SingletonDockerEnvironmentManager(
+      DockerWrapper docker,
+      GrpcFnServer<SdkHarnessClientControlService> controlServiceServer,
+      GrpcFnServer<GrpcLoggingService> loggingServiceServer,
+      GrpcFnServer<ArtifactRetrievalService> retrievalServiceServer,
+      GrpcFnServer<StaticGrpcProvisionService> provisioningServiceServer) {
+    this.docker = docker;
+    this.controlServiceServer = controlServiceServer;
+    this.loggingServiceServer = loggingServiceServer;
+    this.retrievalServiceServer = retrievalServiceServer;
+    this.provisioningServiceServer = provisioningServiceServer;
+  }
+
+  /**
+   * Retrieve a handle for the given environment. The same environment must be 
requested every time.
+   * The same remote handle is returned to every caller, so the environment 
cannot be used once
+   * closed.
+   */
+  @Override
+  public RemoteEnvironment getEnvironment(Environment environment) throws 
Exception {
+    synchronized (lock) {
+      if (dockerEnvironment == null) {
+        dockerEnvironment = createDockerEnv(environment);
+      } else {
+        checkArgument(
+            
environment.getUrl().equals(dockerEnvironment.getEnvironment().getUrl()),
+            "A %s must only be queried for a single %s. Existing %s, Argument 
%s",
+            SingletonDockerEnvironmentManager.class.getSimpleName(),
+            Environment.class.getSimpleName(),
+            dockerEnvironment.getEnvironment().getUrl(),
+            environment.getUrl());
+      }
+      return dockerEnvironment;
+    }
+  }
+
+  private DockerContainerEnvironment createDockerEnv(Environment environment)
+      throws IOException, TimeoutException, InterruptedException {
+    // TODO: Generate environment id correctly.
+    String environmentId = Long.toString(-123);
+    Path workerPersistentDirectory = 
Files.createTempDirectory("worker_persistent_directory");
+    Path semiPersistentDirectory = 
Files.createTempDirectory("semi_persistent_dir");
+    String containerImage = environment.getUrl();
+    // TODO: The default service address will not work for Docker for Mac.
+    String loggingEndpoint = 
loggingServiceServer.getApiServiceDescriptor().getUrl();
+    String artifactEndpoint = 
retrievalServiceServer.getApiServiceDescriptor().getUrl();
+    String provisionEndpoint = 
provisioningServiceServer.getApiServiceDescriptor().getUrl();
+    String controlEndpoint = 
controlServiceServer.getApiServiceDescriptor().getUrl();
+    List<String> args = Arrays.asList(
+        "-v",
+        String.format("%s:%S", workerPersistentDirectory, 
semiPersistentDirectory),
+        // TODO: This needs to be special-cased for Mac.
+        "--network=host",
 
 Review comment:
   I've played around with it a bit and it looks like Docker for Mac accepts 
the `--network=host` flag but silently ignores it.
   
   It looks like the only change we actually need to make between Mac and Linux 
is to add a restriction on the temporary directory. By default, Docker for Mac 
only accepts temporary mounts under `/tmp` and requires explicit user 
configuration to use the default Java generated directory `/var/...`. In the 
interest of making things "just work" for local development, we should add this 
change, but I'll do that in a follow-up PR where I also address the network 
hosts for Mac.

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


Issue Time Tracking
-------------------

    Worklog Id:     (was: 78768)
    Time Spent: 4h 10m  (was: 4h)

> Add abstractions to manage Environment Instance lifecycles.
> -----------------------------------------------------------
>
>                 Key: BEAM-3327
>                 URL: https://issues.apache.org/jira/browse/BEAM-3327
>             Project: Beam
>          Issue Type: New Feature
>          Components: runner-core
>            Reporter: Thomas Groh
>            Assignee: Ben Sidhom
>            Priority: Major
>              Labels: portability
>          Time Spent: 4h 10m
>  Remaining Estimate: 0h
>
> This permits remote stage execution for arbitrary environments



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to