syntax = "proto3";

package containerd.services.tasks.v1;

import "google/protobuf/empty.proto";
import "google/protobuf/any.proto";
import weak "gogoproto/gogo.proto";
import "github.com/containerd/containerd/api/types/mount.proto";
import "github.com/containerd/containerd/api/types/metrics.proto";
import "github.com/containerd/containerd/api/types/descriptor.proto";
import "github.com/containerd/containerd/api/types/task/task.proto";
import "google/protobuf/timestamp.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;
}

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 [(gogoproto.stdtime) = true, (gogoproto.nullable) = false];
}

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 [(gogoproto.customtype) = "github.com/opencontainers/go-digest.Digest", (gogoproto.nullable) = false];
	google.protobuf.Any options = 3;
}

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

message UpdateTaskRequest {
	string container_id = 1;
	google.protobuf.Any resources = 2;
}

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 [(gogoproto.stdtime) = true, (gogoproto.nullable) = false];
}
