All Downloads are FREE. Search and download functionalities are using the official Maven repository.

build.bazel.remote.execution.v2.ExecutionClient.kt Maven / Gradle / Ivy

package build.bazel.remote.execution.v2

import com.google.api.kgax.Retry
import com.google.api.kgax.grpc.ClientCallOptions
import com.google.api.kgax.grpc.ClientCallOptions.Builder
import com.google.api.kgax.grpc.GrpcBasicRetry
import com.google.api.kgax.grpc.GrpcClientStub
import com.google.api.kgax.grpc.ServerStreamingCall
import com.google.api.kgax.grpc.pager
import com.google.api.kgax.grpc.prepare
import com.google.longrunning.Operation
import com.google.longrunning.OperationsClientStub
import io.grpc.ManagedChannel
import io.grpc.ManagedChannelBuilder
import java.util.concurrent.TimeUnit
import javax.annotation.Generated
import kotlin.Boolean
import kotlin.Int
import kotlin.Long
import kotlin.String
import kotlin.Unit
import kotlin.collections.List
import kotlin.jvm.JvmOverloads
import kotlin.jvm.JvmStatic
import kotlinx.coroutines.async
import kotlinx.coroutines.coroutineScope

/**
 *
 *
 *
 *
 * [Product Documentation](http://www.google.com)
 */
@Generated("com.google.api.kotlin.generator.GRPCGenerator")
class ExecutionClient private constructor(
    val channel: ManagedChannel,
    val options: ClientCallOptions,
    factory: Stubs.Factory? = null
) {
    private val stubs: Stubs = factory?.create(channel, options) ?: Stubs(
            ExecutionClientStub(channel).prepare(options),
            OperationsClientStub(channel).prepare(options))

    /**
     * Prepare for an API call by setting any desired options. For example:
     *
     * ```
     * val client = ExecutionClient.create()
     * val response = client.prepare {
     *     withMetadata("my-custom-header", listOf("some", "thing"))
     * }.execute(request)
     * ```
     *
     * You may save the client returned by this call and reuse it if you
     * plan to make multiple requests with the same settings.
     */
    fun prepare(init: ClientCallOptions.Builder.() -> Unit): ExecutionClient {
        val optionsBuilder = ClientCallOptions.Builder(options)
        optionsBuilder.init()
        return ExecutionClient(channel, optionsBuilder.build())
    }

    /**
     * Shutdown the [channel] associated with this client.
     */
    fun shutdownChannel(waitForSeconds: Long = 5) {
        channel.shutdown().awaitTermination(waitForSeconds, TimeUnit.SECONDS)
    }

    /**
     * Execute an action remotely.
     *  In order to execute an action, the client must first upload all of the
     * inputs, the
     * [Command][build.bazel.remote.execution.v2.Command] to run, and the
     * [Action][build.bazel.remote.execution.v2.Action] into the
     * [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage].
     * It then calls `Execute` with an `action_digest` referring to them. The
     * server will run the action and eventually return the result.
     *  The input `Action`'s fields MUST meet the various canonicalization
     * requirements specified in the documentation for their types so that it has
     * the same digest as other logically equivalent `Action`s. The server MAY
     * enforce the requirements and return errors if a non-canonical input is
     * received. It MAY also proceed without verifying some or all of the
     * requirements, such as for performance reasons. If the server does not
     * verify the requirement, then it will treat the `Action` as distinct from
     * another logically equivalent action if they hash differently.
     *  Returns a stream of
     * [google.longrunning.Operation][google.longrunning.Operation] messages
     * describing the resulting execution, with eventual `response`
     * [ExecuteResponse][build.bazel.remote.execution.v2.ExecuteResponse]. The
     * `metadata` on the operation is of type
     * [ExecuteOperationMetadata][build.bazel.remote.execution.v2.ExecuteOperationMetadata].
     *  If the client remains connected after the first response is returned after
     * the server, then updates are streamed as if the client had called
     * [WaitExecution][build.bazel.remote.execution.v2.Execution.WaitExecution]
     * until the execution completes or the request reaches an error. The
     * operation can also be queried using [Operations
     * API][google.longrunning.Operations.GetOperation].
     *  The server NEED NOT implement other methods or functionality of the
     * Operations API.
     *  Errors discovered during creation of the `Operation` will be reported
     * as gRPC Status errors, while errors that occurred while running the
     * action will be reported in the `status` field of the `ExecuteResponse`. The
     * server MUST NOT set the `error` field of the `Operation` proto.
     * The possible errors include:
     *  * `INVALID_ARGUMENT`: One or more arguments are invalid.
     * * `FAILED_PRECONDITION`: One or more errors occurred in setting up the
     *   action requested, such as a missing input or command or no worker being
     *   available. The client may be able to fix the errors and retry.
     * * `RESOURCE_EXHAUSTED`: There is insufficient quota of some resource to run
     *   the action.
     * * `UNAVAILABLE`: Due to a transient condition, such as all workers being
     *   occupied (and the server does not support a queue), the action could not
     *   be started. The client should retry.
     * * `INTERNAL`: An internal error occurred in the execution engine or the
     *   worker.
     * * `DEADLINE_EXCEEDED`: The execution timed out.
     * * `CANCELLED`: The operation was cancelled by the client. This status is
     *   only possible if the server implements the Operations API CancelOperation
     *   method, and it was called for the current execution.
     *  In the case of a missing input or command, the server SHOULD additionally
     * send a [PreconditionFailure][google.rpc.PreconditionFailure] error detail
     * where, for each requested blob not present in the CAS, there is a
     * `Violation` with a `type` of `MISSING` and a `subject` of
     * `"blobs/{hash}/{size}"` indicating the digest of the missing blob.
     *  The server does not need to guarantee that a call to this method leads to
     * at most one execution of the action. The server MAY execute the action
     * multiple times, potentially in parallel. These redundant executions MAY
     * continue to run, even if the operation is completed.
     *
     * For example:
     * ```
     * val client = ExecutionClient.create()
     * val result = client.execute(
     *     executeRequest {
     *     }
     * )
     * ```
     */
    fun execute(request: ExecuteRequest): ServerStreamingCall =
            stubs.api.executeServerStreaming(context = "execute") { stub, observer ->
        stub.execute(request, observer)
    }

    /**
     * Wait for an execution operation to complete. When the client initially
     * makes the request, the server immediately responds with the current status
     * of the execution. The server will leave the request stream open until the
     * operation completes, and then respond with the completed operation. The
     * server MAY choose to stream additional updates as execution progresses,
     * such as to provide an update as to the state of the execution.
     *
     * For example:
     * ```
     * val client = ExecutionClient.create()
     * val result = client.waitExecution(
     *     waitExecutionRequest {
     *     }
     * )
     * ```
     */
    fun waitExecution(request: WaitExecutionRequest): ServerStreamingCall =
            stubs.api.executeServerStreaming(context = "waitExecution") { stub, observer ->
        stub.waitExecution(request, observer)
    }

    /**
     * Utilities for creating a fully configured ExecutionClient.
     */
    companion object {
        /**
         * Default scopes to use. Use [prepare] to override as needed.
         */
        @JvmStatic
        val ALL_SCOPES: List = listOf()

        /**
         * Default operations to retry on failure. Use [prepare] to override as needed.
         *
         * Note: This setting controls client side retries. If you enable
         * server managed retries on the channel do not use this.
         */
        @JvmStatic
        val RETRY: Retry = GrpcBasicRetry(mapOf())

        /**
         * Create a ExecutionClient with the provided [channel], [options], or stub [factory].
         */
        @JvmStatic
        @JvmOverloads
        fun create(
            channel: ManagedChannel? = null,
            options: ClientCallOptions? = null,
            factory: Stubs.Factory? = null
        ): ExecutionClient = ExecutionClient(
            channel ?: createChannel(),
            options ?: ClientCallOptions(),
            factory
        )

        /**
         * Create a [ManagedChannel] to use with a ExecutionClient.
         *
         * [enableRetry] can be used to enable server managed retries, which is currently
         * experimental. You should not use any client retry settings if you enable it.
         */
        @JvmStatic
        @JvmOverloads
        fun createChannel(
            host: String = "",
            port: Int = 443,
            enableRetry: Boolean = false
        ): ManagedChannel {
            val builder = ManagedChannelBuilder.forAddress(host, port)
            if (enableRetry) {
                builder.enableRetry()
            }
            return builder.build()
        }
    }

    class Stubs(val api: GrpcClientStub, val operation:
            GrpcClientStub) {
        interface Factory {
            fun create(channel: ManagedChannel, options: ClientCallOptions): Stubs
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy