syntax = "proto3";
package hashicorp.nomad.plugins.executor.proto;
option go_package = "proto";

import "google/protobuf/timestamp.proto";
import "plugins/drivers/proto/driver.proto";

service Executor {
    rpc Launch(LaunchRequest) returns (LaunchResponse) {}
    rpc Wait(WaitRequest) returns (WaitResponse) {}
    rpc Shutdown(ShutdownRequest) returns (ShutdownResponse) {}
    rpc UpdateResources(UpdateResourcesRequest) returns (UpdateResourcesResponse) {}
    rpc Version(VersionRequest) returns (VersionResponse) {}
    rpc Stats(StatsRequest) returns (stream StatsResponse) {}
    rpc Signal(SignalRequest) returns (SignalResponse) {}
    rpc Exec(ExecRequest) returns (ExecResponse) {}

    // buf:lint:ignore RPC_REQUEST_RESPONSE_UNIQUE
    rpc ExecStreaming(
      stream
      // buf:lint:ignore RPC_REQUEST_STANDARD_NAME
      hashicorp.nomad.plugins.drivers.proto.ExecTaskStreamingRequest)
    returns (
      stream
      // buf:lint:ignore RPC_RESPONSE_STANDARD_NAME
      hashicorp.nomad.plugins.drivers.proto.ExecTaskStreamingResponse
    ) {}
}

message LaunchRequest {
    string cmd = 1;
    repeated string args = 2;
    hashicorp.nomad.plugins.drivers.proto.Resources resources = 3;
    string stdout_path = 4;
    string stderr_path = 5;
    repeated string env = 6;
    string user = 7;
    string task_dir = 8;
    bool resource_limits = 9;
    bool basic_process_cgroup = 10;
    repeated hashicorp.nomad.plugins.drivers.proto.Mount mounts = 11;
    repeated hashicorp.nomad.plugins.drivers.proto.Device devices = 12;
    hashicorp.nomad.plugins.drivers.proto.NetworkIsolationSpec network_isolation = 13;
    bool no_pivot_root = 14;
    string default_pid_mode = 15;
    string default_ipc_mode = 16;
    string cpuset_cgroup = 17;
    repeated string allow_caps = 18;
    repeated string capabilities = 19;
}

message LaunchResponse {
    ProcessState process = 1;
}

message WaitRequest {}

message WaitResponse{
    ProcessState process = 1;
}

message ShutdownRequest {
    string signal = 1;
    int64 grace_period = 2;
}

message ShutdownResponse {}

message UpdateResourcesRequest{
    hashicorp.nomad.plugins.drivers.proto.Resources resources = 1;
}

message UpdateResourcesResponse {}

message VersionRequest {}

message VersionResponse{
    string version = 1;
}

message StatsRequest {
    int64 interval = 1;
}

message StatsResponse {
    hashicorp.nomad.plugins.drivers.proto.TaskStats stats = 1;
}

message SignalRequest {
    int32 signal = 1;
}

message SignalResponse {}

message ExecRequest {
    google.protobuf.Timestamp deadline = 1;
    string cmd = 2;
    repeated string args = 3;
}

message ExecResponse {
    bytes output = 1;
    int32 exit_code = 2;
}

message ProcessState {
    int32 pid = 1;
    int32 exit_code = 2;
    int32 signal = 3;
    google.protobuf.Timestamp time = 4;
}
