syntax = "proto3";

package containerd.task.v2;

import "google/protobuf/any.proto";
import "google/protobuf/empty.proto";
import weak "gogoproto/gogo.proto";
import "google/protobuf/timestamp.proto";
import "github.com/containerd/containerd/api/types/mount.proto";
import "github.com/containerd/containerd/api/types/task/task.proto";

option go_package = "github.com/containerd/containerd/runtime/v2/task;task";

// Shim service is launched for each container and is responsible for owning the IO
// for the container and its additional processes.  The shim is also the parent of
// each container and allows reattaching to the IO and receiving the exit status
// for the container processes.
service Task {
	rpc State(StateRequest) returns (StateResponse);
	rpc Create(CreateTaskRequest) returns (CreateTaskResponse);
	rpc Start(StartRequest) returns (StartResponse);
	rpc Delete(DeleteRequest) returns (DeleteResponse);
	rpc Pids(PidsRequest) returns (PidsResponse);
	rpc Pause(PauseRequest) returns (google.protobuf.Empty);
	rpc Resume(ResumeRequest) returns (google.protobuf.Empty);
	rpc Checkpoint(CheckpointTaskRequest) returns (google.protobuf.Empty);
	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 Update(UpdateTaskRequest) returns (google.protobuf.Empty);
	rpc Wait(WaitRequest) returns (WaitResponse);
	rpc Stats(StatsRequest) returns (StatsResponse);
	rpc Connect(ConnectRequest) returns (ConnectResponse);
	rpc Shutdown(ShutdownRequest) returns (google.protobuf.Empty);
}

message CreateTaskRequest {
	string id = 1;
	string bundle = 2;
	repeated containerd.types.Mount rootfs = 3;
	bool terminal = 4;
	string stdin = 5;
	string stdout = 6;
	string stderr = 7;
	string checkpoint = 8;
	string parent_checkpoint = 9;
	google.protobuf.Any options = 10;
}

message CreateTaskResponse {
	uint32 pid = 1;
}

message DeleteRequest {
	string id = 1;
	string exec_id = 2;
}

message DeleteResponse {
	uint32 pid = 1;
	uint32 exit_status = 2;
	google.protobuf.Timestamp exited_at = 3 [(gogoproto.stdtime) = true, (gogoproto.nullable) = false];
}

message ExecProcessRequest {
	string id = 1;
	string exec_id = 2;
	bool terminal = 3;
	string stdin = 4;
	string stdout = 5;
	string stderr = 6;
	google.protobuf.Any spec = 7;
}

message ExecProcessResponse {
}

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

message StateRequest {
	string id = 1;
	string exec_id = 2;
}

message StateResponse {
	string id = 1;
	string bundle = 2;
	uint32 pid = 3;
	containerd.v1.types.Status status = 4;
	string stdin = 5;
	string stdout = 6;
	string stderr = 7;
	bool terminal = 8;
	uint32 exit_status = 9;
	google.protobuf.Timestamp exited_at = 10 [(gogoproto.stdtime) = true, (gogoproto.nullable) = false];
	string exec_id = 11;
}

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

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

message PidsRequest {
	string id = 1;
}

message PidsResponse {
	repeated containerd.v1.types.ProcessInfo processes = 1;
}

message CheckpointTaskRequest {
	string id = 1;
	string path = 2;
	google.protobuf.Any options = 3;
}

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

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

message StartResponse {
	uint32 pid = 1;
}

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

message WaitResponse {
	uint32 exit_status = 1;
	google.protobuf.Timestamp exited_at = 2 [(gogoproto.stdtime) = true, (gogoproto.nullable) = false];
}

message StatsRequest {
	string id = 1;
}

message StatsResponse {
	google.protobuf.Any stats = 1;
}

message ConnectRequest {
	string id = 1;
}

message ConnectResponse {
	uint32 shim_pid = 1;
	uint32 task_pid = 2;
	string version = 3;
}

message ShutdownRequest {
	string id = 1;
	bool now = 2;
}

message PauseRequest {
	string id = 1;
}

message ResumeRequest {
	string id = 1;
}
