blob: 9c949ed41db494b0a88bbaf5153877be78df0226 [file] [log] [blame]
// 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 com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.PathFragment;
import java.io.IOException;
/** Interface to interact with a sandboxfs instance. */
interface SandboxfsProcess {
/** 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();
/** Interface to create a single mapping definition within the sandbox. */
@FunctionalInterface
interface SandboxMapper {
/**
* Defines a single mapping within the sandbox being constructed.
*
* <p>Called only from within the context of a {@link SandboxCreator} instance, which carries
* the details of the specific sandbox being constructed.
*
* @param path the path within the sandbox to define as a mapping. sandboxfs expects this path
* to be absolute.
* @param underlyingPath the path to which the mapping points to, which is outside of the
* sandbox. sandboxfs expects this path to be absolute.
* @param writable whether the mapping is writable or read-only
* @throws IOException if the attempt to send the mapping to sandboxfs fails
*/
void map(PathFragment path, PathFragment underlyingPath, boolean writable) throws IOException;
}
/** Interface to create all the mappings of a sandbox. */
@FunctionalInterface
interface SandboxCreator {
/**
* Creates all the mappings of a sandbox.
*
* <p>This lambda runs holding a big lock around sandboxfs and is called in the critical path of
* all running actions. As a result, this lambda should not block (which includes not doing any
* I/O other than writing to the sandboxfs stream via {@code mapper}).
*
* @param mapper a callback to send a single mapping definition to sandboxfs
* @throws IOException if calls to the mapper fail, or if the lambda desires to raise any other
* problem during the construction of the sandbox
*/
void create(SandboxMapper mapper) throws IOException;
}
/**
* Creates a top-level directory with the given name and delegates the set up of all mappings
* within that directory to the given {@code creator} lambda.
*
* @param name basename of the top-level directory to create
* @param creator a callback to populate the sandbox with mappings
* @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, SandboxCreator creator) 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;
}