/*
   Copyright The containerd Authors.

   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.
*/

syntax = "proto3";

package containerd.services.tasks.v1;

import "google/protobuf/any.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/timestamp.proto";
import "types/descriptor.proto";
import "types/metrics.proto";
import "types/mount.proto";
import "types/task/task.proto";

option go_package = "github.com/containerd/containerd/api/services/tasks/v1;tasks";

service Tasks {
  // Create a task.
  rpc Create(CreateTaskRequest) returns (CreateTaskResponse);

  // Start a process.
  rpc Start(StartRequest) returns (StartResponse);

  // Delete a task and on disk state.
  rpc Delete(DeleteTaskRequest) returns (DeleteResponse);

  rpc DeleteProcess(DeleteProcessRequest) returns (DeleteResponse);

  rpc Get(GetRequest) returns (GetResponse);

  rpc List(ListTasksRequest) returns (ListTasksResponse);

  // Kill a task or process.
  rpc Kill(KillRequest) returns (google.protobuf.Empty);

  rpc Exec(ExecProcessRequest) returns (google.protobuf.Empty);

  rpc ResizePty(ResizePtyRequest) returns (google.protobuf.Empty);

  rpc CloseIO(CloseIORequest) returns (google.protobuf.Empty);

  rpc Pause(PauseTaskRequest) returns (google.protobuf.Empty);

  rpc Resume(ResumeTaskRequest) returns (google.protobuf.Empty);

  rpc ListPids(ListPidsRequest) returns (ListPidsResponse);

  rpc Checkpoint(CheckpointTaskRequest) returns (CheckpointTaskResponse);

  rpc Update(UpdateTaskRequest) returns (google.protobuf.Empty);

  rpc Metrics(MetricsRequest) returns (MetricsResponse);

  rpc Wait(WaitRequest) returns (WaitResponse);
}

message CreateTaskRequest {
  string container_id = 1;

  // RootFS provides the pre-chroot mounts to perform in the shim before
  // executing the container task.
  //
  // These are for mounts that cannot be performed in the user namespace.
  // Typically, these mounts should be resolved from snapshots specified on
  // the container object.
  repeated containerd.types.Mount rootfs = 3;

  string stdin = 4;
  string stdout = 5;
  string stderr = 6;
  bool terminal = 7;

  containerd.types.Descriptor checkpoint = 8;

  google.protobuf.Any options = 9;

  string runtime_path = 10;

  // TaskApiAddress optionally specifies the address of an existing task API
  // endpoint (e.g. an in-VM agent for sandbox runtimes such as Kata).
  // When set, containerd connects to this address for task operations instead
  // of bootstrapping a new shim.  The format is <protocol>+<scheme>://...,
  // e.g. "ttrpc+unix:///path/to/uds" or "grpc+vsock://<cid>:<port>".
  string task_api_address = 11;
  // TaskApiVersion is the shim API version served at TaskApiAddress.
  // Currently supported values are 2 and 3.
  uint32 task_api_version = 12;
}

message CreateTaskResponse {
  string container_id = 1;
  uint32 pid = 2;
}

message StartRequest {
  string container_id = 1;
  string exec_id = 2;
}

message StartResponse {
  uint32 pid = 1;
}

message DeleteTaskRequest {
  string container_id = 1;
}

message DeleteResponse {
  string id = 1;
  uint32 pid = 2;
  uint32 exit_status = 3;
  google.protobuf.Timestamp exited_at = 4;
}

message DeleteProcessRequest {
  string container_id = 1;
  string exec_id = 2;
}

message GetRequest {
  string container_id = 1;
  string exec_id = 2;
}

message GetResponse {
  containerd.v1.types.Process process = 1;
}

message ListTasksRequest {
  string filter = 1;
}

message ListTasksResponse {
  repeated containerd.v1.types.Process tasks = 1;
}

message KillRequest {
  string container_id = 1;
  string exec_id = 2;
  uint32 signal = 3;
  bool all = 4;
}

message ExecProcessRequest {
  string container_id = 1;
  string stdin = 2;
  string stdout = 3;
  string stderr = 4;
  bool terminal = 5;
  // Spec for starting a process in the target container.
  //
  // For runc, this is a process spec, for example.
  google.protobuf.Any spec = 6;
  // id of the exec process
  string exec_id = 7;
}

message ExecProcessResponse {}

message ResizePtyRequest {
  string container_id = 1;
  string exec_id = 2;
  uint32 width = 3;
  uint32 height = 4;
}

message CloseIORequest {
  string container_id = 1;
  string exec_id = 2;
  bool stdin = 3;
}

message PauseTaskRequest {
  string container_id = 1;
}

message ResumeTaskRequest {
  string container_id = 1;
}

message ListPidsRequest {
  string container_id = 1;
}

message ListPidsResponse {
  // Processes includes the process ID and additional process information
  repeated containerd.v1.types.ProcessInfo processes = 1;
}

message CheckpointTaskRequest {
  string container_id = 1;
  string parent_checkpoint = 2;
  google.protobuf.Any options = 3;
}

message CheckpointTaskResponse {
  repeated containerd.types.Descriptor descriptors = 1;
}

message UpdateTaskRequest {
  string container_id = 1;
  google.protobuf.Any resources = 2;
  map<string, string> annotations = 3;
}

message MetricsRequest {
  repeated string filters = 1;
}

message MetricsResponse {
  repeated types.Metric metrics = 1;
}

message WaitRequest {
  string container_id = 1;
  string exec_id = 2;
}

message WaitResponse {
  uint32 exit_status = 1;
  google.protobuf.Timestamp exited_at = 2;
}
