// Copyright 2017 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 com.google.devtools.build.lib.remote.CasServiceGrpc.CasServiceBlockingStub; import com.google.devtools.build.lib.remote.CasServiceGrpc.CasServiceStub; import com.google.devtools.build.lib.remote.ExecuteServiceGrpc.ExecuteServiceBlockingStub; import com.google.devtools.build.lib.remote.ExecutionCacheServiceGrpc.ExecutionCacheServiceBlockingStub; import com.google.devtools.build.lib.remote.RemoteProtocol.CasDownloadBlobRequest; import com.google.devtools.build.lib.remote.RemoteProtocol.CasDownloadReply; import com.google.devtools.build.lib.remote.RemoteProtocol.CasDownloadTreeMetadataReply; import com.google.devtools.build.lib.remote.RemoteProtocol.CasDownloadTreeMetadataRequest; import com.google.devtools.build.lib.remote.RemoteProtocol.CasLookupReply; import com.google.devtools.build.lib.remote.RemoteProtocol.CasLookupRequest; import com.google.devtools.build.lib.remote.RemoteProtocol.CasUploadBlobReply; import com.google.devtools.build.lib.remote.RemoteProtocol.CasUploadBlobRequest; import com.google.devtools.build.lib.remote.RemoteProtocol.CasUploadTreeMetadataReply; import com.google.devtools.build.lib.remote.RemoteProtocol.CasUploadTreeMetadataRequest; import com.google.devtools.build.lib.remote.RemoteProtocol.ExecuteReply; import com.google.devtools.build.lib.remote.RemoteProtocol.ExecuteRequest; import com.google.devtools.build.lib.remote.RemoteProtocol.ExecutionCacheReply; import com.google.devtools.build.lib.remote.RemoteProtocol.ExecutionCacheRequest; import com.google.devtools.build.lib.remote.RemoteProtocol.ExecutionCacheSetReply; import com.google.devtools.build.lib.remote.RemoteProtocol.ExecutionCacheSetRequest; import io.grpc.Channel; import io.grpc.stub.StreamObserver; import java.util.Iterator; import java.util.concurrent.TimeUnit; /** Implementations of the gRPC interfaces that actually talk to gRPC. */ public class GrpcInterfaces { /** Create a {@link GrpcCasInterface} instance that actually talks to gRPC. */ public static GrpcCasInterface casInterface( final int grpcTimeoutSeconds, final Channel channel, final ChannelOptions channelOptions) { return new GrpcCasInterface() { private CasServiceBlockingStub getCasServiceBlockingStub() { return CasServiceGrpc.newBlockingStub(channel) .withCallCredentials(channelOptions.getCallCredentials()) .withDeadlineAfter(grpcTimeoutSeconds, TimeUnit.SECONDS); } private CasServiceStub getCasServiceStub() { return CasServiceGrpc.newStub(channel) .withCallCredentials(channelOptions.getCallCredentials()) .withDeadlineAfter(grpcTimeoutSeconds, TimeUnit.SECONDS); } @Override public CasLookupReply lookup(CasLookupRequest request) { return getCasServiceBlockingStub().lookup(request); } @Override public CasUploadTreeMetadataReply uploadTreeMetadata(CasUploadTreeMetadataRequest request) { return getCasServiceBlockingStub().uploadTreeMetadata(request); } @Override public CasDownloadTreeMetadataReply downloadTreeMetadata( CasDownloadTreeMetadataRequest request) { return getCasServiceBlockingStub().downloadTreeMetadata(request); } @Override public Iterator<CasDownloadReply> downloadBlob(CasDownloadBlobRequest request) { return getCasServiceBlockingStub().downloadBlob(request); } @Override public StreamObserver<CasUploadBlobRequest> uploadBlobAsync( StreamObserver<CasUploadBlobReply> responseObserver) { return getCasServiceStub().uploadBlob(responseObserver); } }; } /** Create a {@link GrpcCasInterface} instance that actually talks to gRPC. */ public static GrpcExecutionCacheInterface executionCacheInterface( final int grpcTimeoutSeconds, final Channel channel, final ChannelOptions channelOptions) { return new GrpcExecutionCacheInterface() { private ExecutionCacheServiceBlockingStub getExecutionCacheServiceBlockingStub() { return ExecutionCacheServiceGrpc.newBlockingStub(channel) .withCallCredentials(channelOptions.getCallCredentials()) .withDeadlineAfter(grpcTimeoutSeconds, TimeUnit.SECONDS); } @Override public ExecutionCacheReply getCachedResult(ExecutionCacheRequest request) { return getExecutionCacheServiceBlockingStub().getCachedResult(request); } @Override public ExecutionCacheSetReply setCachedResult(ExecutionCacheSetRequest request) { return getExecutionCacheServiceBlockingStub().setCachedResult(request); } }; } /** Create a {@link GrpcExecutionInterface} instance that actually talks to gRPC. */ public static GrpcExecutionInterface executionInterface( final int grpcTimeoutSeconds, final Channel channel, final ChannelOptions channelOptions) { return new GrpcExecutionInterface() { @Override public Iterator<ExecuteReply> execute(ExecuteRequest request) { ExecuteServiceBlockingStub stub = ExecuteServiceGrpc.newBlockingStub(channel) .withCallCredentials(channelOptions.getCallCredentials()) .withDeadlineAfter( grpcTimeoutSeconds + request.getTimeoutMillis() / 1000, TimeUnit.SECONDS); return stub.execute(request); } }; } }