| // 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(); |
| |
| /** |
| * Creates a top-level directory with the given name and adds all given mappings inside it. |
| * |
| * @param name basename of the top-level directory to create |
| * @param mappings the collection of mappings to add, which must not have yet been previously |
| * mapped and which will be contained within the given top-level directory |
| * @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 createSandbox(String name, List<Mapping> mappings) throws IOException; |
| |
| /** |
| * Destroys a top-level directory and all of its contents. |
| * |
| * @param name basename of the top-level directory to destroy |
| * @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 destroySandbox(String name) throws IOException; |
| } |