blob: e680ea484d818cfa3d5577200a7501d090e1a76a [file] [log] [blame]
// Copyright 2022 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.remote;
import build.bazel.remote.execution.v2.Action;
import build.bazel.remote.execution.v2.Command;
import build.bazel.remote.execution.v2.Digest;
import com.google.devtools.build.lib.actions.ActionInput;
import com.google.devtools.build.lib.actions.ForbiddenActionInputException;
import com.google.devtools.build.lib.actions.Spawn;
import com.google.devtools.build.lib.exec.SpawnRunner.SpawnExecutionContext;
import com.google.devtools.build.lib.remote.common.NetworkTime;
import com.google.devtools.build.lib.remote.common.RemoteActionExecutionContext;
import com.google.devtools.build.lib.remote.common.RemoteCacheClient.ActionKey;
import com.google.devtools.build.lib.remote.common.RemotePathResolver;
import com.google.devtools.build.lib.remote.merkletree.MerkleTree;
import com.google.devtools.build.lib.vfs.PathFragment;
import java.io.IOException;
import java.util.SortedMap;
/** A value class representing an action which can be executed remotely. */
public class RemoteAction {
private final Spawn spawn;
private final SpawnExecutionContext spawnExecutionContext;
private final RemoteActionExecutionContext remoteActionExecutionContext;
private final RemotePathResolver remotePathResolver;
private final MerkleTree merkleTree;
private final Digest commandHash;
private final Command command;
private final Action action;
private final ActionKey actionKey;
RemoteAction(
Spawn spawn,
SpawnExecutionContext spawnExecutionContext,
RemoteActionExecutionContext remoteActionExecutionContext,
RemotePathResolver remotePathResolver,
MerkleTree merkleTree,
Digest commandHash,
Command command,
Action action,
ActionKey actionKey) {
this.spawn = spawn;
this.spawnExecutionContext = spawnExecutionContext;
this.remoteActionExecutionContext = remoteActionExecutionContext;
this.remotePathResolver = remotePathResolver;
this.merkleTree = merkleTree;
this.commandHash = commandHash;
this.command = command;
this.action = action;
this.actionKey = actionKey;
}
public RemoteActionExecutionContext getRemoteActionExecutionContext() {
return remoteActionExecutionContext;
}
public SpawnExecutionContext getSpawnExecutionContext() {
return spawnExecutionContext;
}
/** Returns the {@link Spawn} that owns this action. */
public Spawn getSpawn() {
return spawn;
}
/**
* Returns the sum of file sizes plus protobuf sizes used to represent the inputs of this action.
*/
public long getInputBytes() {
return merkleTree.getInputBytes();
}
/** Returns the number of input files of this action. */
public long getInputFiles() {
return merkleTree.getInputFiles();
}
/** Returns the id this is action. */
public String getActionId() {
return actionKey.getDigest().getHash();
}
/** Returns the {@link ActionKey} of this action. */
public ActionKey getActionKey() {
return actionKey;
}
/** Returns underlying {@link Action} of this remote action. */
public Action getAction() {
return action;
}
public Digest getCommandHash() {
return commandHash;
}
public Command getCommand() {
return command;
}
public MerkleTree getMerkleTree() {
return merkleTree;
}
/**
* Returns a {@link SortedMap} which maps from input paths for remote action to {@link
* ActionInput}.
*/
public SortedMap<PathFragment, ActionInput> getInputMap()
throws IOException, ForbiddenActionInputException {
return remotePathResolver.getInputMapping(spawnExecutionContext);
}
/**
* Returns the {@link NetworkTime} instance used to measure the network time during the action
* execution.
*/
public NetworkTime getNetworkTime() {
return remoteActionExecutionContext.getNetworkTime();
}
}