aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/sandbox/SandboxfsProcess.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/sandbox/SandboxfsProcess.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/sandbox/SandboxfsProcess.java128
1 files changed, 128 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/SandboxfsProcess.java b/src/main/java/com/google/devtools/build/lib/sandbox/SandboxfsProcess.java
new file mode 100644
index 0000000000..4b56ed3265
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/sandbox/SandboxfsProcess.java
@@ -0,0 +1,128 @@
+// Copyright 2018 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.sandbox;
+
+import static com.google.common.base.Preconditions.checkState;
+
+import com.google.auto.value.AutoValue;
+import com.google.devtools.build.lib.vfs.Path;
+import com.google.devtools.build.lib.vfs.PathFragment;
+import java.io.IOException;
+import java.util.List;
+
+/** Interface to interact with a sandboxfs instance. */
+interface SandboxfsProcess {
+
+ /** Represents a single mapping within a sandboxfs file system. */
+ @AutoValue
+ abstract class Mapping {
+ /**
+ * Path within the sandbox. This looks like an absolute path but is treated as relative to the
+ * sandbox's root.
+ */
+ abstract PathFragment path();
+
+ /** Absolute path from the host's file system to map into the sandbox. */
+ abstract PathFragment target();
+
+ /** Whether the mapped path is writable or not. */
+ abstract boolean writable();
+
+ /** Constructs a new mapping builder. */
+ static Builder builder() {
+ return new AutoValue_SandboxfsProcess_Mapping.Builder();
+ }
+
+ /** Builder for a single mapping within a sandboxfs file system. */
+ @AutoValue.Builder
+ abstract static class Builder {
+ /**
+ * Sets the path within the sandbox on which this mapping will appear. This looks like an
+ * absolute path but is treated as relative to the sandbox's root.
+ *
+ * @param path absolute path rooted at the sandbox's mount point
+ * @return the builder instance
+ */
+ abstract Builder setPath(PathFragment path);
+
+ /**
+ * Sets the path to which this mapping refers. This is an absolute path into the host's
+ * file system.
+ *
+ * @param target absolute path into the host's file system
+ * @return the builder instance
+ */
+ abstract Builder setTarget(PathFragment target);
+
+ /**
+ * Sets whether this mapping is writable or not when accessed via the sandbox.
+ *
+ * @param writable whether the mapping is writable or not
+ * @return the builder instance
+ */
+ abstract Builder setWritable(boolean writable);
+
+ abstract Mapping autoBuild();
+
+ /**
+ * Constructs the mapping and validates field invariants.
+ *
+ * @return the constructed mapping.
+ */
+ public Mapping build() {
+ Mapping mapping = autoBuild();
+ checkState(mapping.path().isAbsolute(), "Mapping specifications are supposed to be "
+ + "absolute but %s is not", mapping.path());
+ checkState(mapping.target().isAbsolute(), "Mapping targets are supposed to be "
+ + "absolute but %s is not", mapping.target());
+ return mapping;
+ }
+ }
+ }
+
+ /** Returns the path to the sandboxfs's mount point. */
+ Path getMountPoint();
+
+ /** Returns true if the sandboxfs process is still alive. */
+ boolean isAlive();
+
+ /**
+ * Unmounts and stops the sandboxfs process.
+ *
+ * <p>This function must be idempotent because there can be a race between explicit calls during
+ * regular execution and calls from shutdown hooks.
+ */
+ void destroy();
+
+ /**
+ * Adds new mappings to the sandboxfs instance.
+ *
+ * @param mappings the collection of mappings to add, which must not have yet been previously
+ * mapped
+ * @throws IOException if sandboxfs cannot be reconfigured either because of an error in the
+ * configuration or because we failed to communicate with the subprocess
+ */
+ void map(List<Mapping> mappings) throws IOException;
+
+ /**
+ * Removes a mapping from the sandboxfs instance.
+ *
+ * @param mapping the mapping to remove, which must have been previously mapped. This looks like
+ * an absolute path but is treated as relative to the sandbox's root.
+ * @throws IOException if sandboxfs cannot be reconfigured either because of an error in the
+ * configuration or because we failed to communicate with the subprocess
+ */
+ void unmap(PathFragment mapping) throws IOException;
+}