syntax = "proto3";

package containerd.v1.services.shim;

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

// 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 Shim {
	rpc Create(CreateRequest) returns (CreateResponse);
	rpc Start(StartRequest) returns (google.protobuf.Empty);
	rpc Delete(DeleteRequest) returns (DeleteResponse);
	rpc State(StateRequest) returns (StateResponse);
	rpc Processes(ProcessesRequest) returns (ProcessesResponse);
	rpc Pause(PauseRequest) returns (google.protobuf.Empty);
	rpc Resume(ResumeRequest) returns (google.protobuf.Empty);
	rpc Checkpoint(CheckpointRequest) returns (google.protobuf.Empty);

	rpc Exit(ExitRequest) returns (google.protobuf.Empty);
	rpc Events(EventsRequest) returns (stream containerd.v1.types.Event);
	rpc Kill(KillRequest) returns (google.protobuf.Empty);
	rpc Exec(ExecRequest) returns (ExecResponse);
	rpc Pty(PtyRequest) returns (google.protobuf.Empty);
	rpc CloseStdin(CloseStdinRequest) returns (google.protobuf.Empty);
}

message CreateRequest {
	string id = 1;
	string bundle = 2;
	string runtime = 3;
	bool no_pivot = 4;
	bool terminal = 5;
	string stdin = 6;
	string stdout = 7;
	string stderr = 8;
	repeated containerd.v1.types.Mount rootfs = 9;
	string checkpoint = 10;
	string parent_checkpoint = 11;
}

message CreateResponse {
	uint32 pid = 1;
}

message StartRequest {
}

message DeleteRequest {
	uint32 pid = 1;
}

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

message ExecRequest {
	bool terminal = 1;
	string stdin = 2;
	string stdout = 3;
	string stderr = 4;
	google.protobuf.Any spec = 5;
}

message Rlimit {
	string type = 1;
	uint64 hard = 2;
	uint64 soft = 3;
}

message ExecResponse {
	uint32 pid = 1;
}

message PtyRequest {
	uint32 pid = 1;
	uint32 width = 2;
	uint32 height = 3;
}

message EventsRequest {
}

message StateRequest {
}

message StateResponse {
	string id = 1;
	string bundle = 2;
	uint32 pid = 3;
	containerd.v1.types.Status status = 4;
	repeated containerd.v1.types.Process processes = 5;
}

message PauseRequest {
}

message ResumeRequest {
}

message ExitRequest {
}

message KillRequest {
	uint32 signal = 1;
	bool all = 2;
	uint32 pid = 3;
}

message CloseStdinRequest {
	uint32 pid = 1;
}

message ProcessesRequest {
	string id = 1;
}

message ProcessesResponse{
	repeated containerd.v1.types.Process processes = 1;
}

message CheckpointRequest {
	bool exit = 1;
	bool allow_tcp = 2;
	bool allow_unix_sockets = 3;
	bool allow_terminal = 4;
	bool file_locks = 5;
	repeated string empty_namespaces = 6;
	string checkpoint_path = 7;
}
