syntax = "proto3";

package containerd.v1.services.execution;

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

service Tasks {
	rpc Create(CreateRequest) returns (CreateResponse);
	rpc Start(StartRequest) returns (google.protobuf.Empty);
	rpc Delete(DeleteRequest) returns (DeleteResponse);
	rpc Info(InfoRequest) returns (InfoResponse);
	rpc List(ListRequest) returns (ListResponse);
	rpc Kill(KillRequest) returns (google.protobuf.Empty);
	rpc Events(EventsRequest) returns (stream containerd.v1.types.Event);
	rpc Exec(ExecRequest) returns (ExecResponse);
	rpc Pty(PtyRequest) returns (google.protobuf.Empty);
	rpc CloseStdin(CloseStdinRequest) returns (google.protobuf.Empty);
	rpc Pause(PauseRequest) returns (google.protobuf.Empty);
	rpc Resume(ResumeRequest) returns (google.protobuf.Empty);
	rpc Processes(ProcessesRequest) returns (ProcessesResponse);
	rpc Checkpoint(CheckpointRequest) returns (CheckpointResponse);
}

message CreateRequest {
	// ContainerID specifies the container to use for creating this task.
	//
	// The spec from the provided container id will be used to create the
	// task associated with this container. Only one task can be run at a time
	// per container.
	//
	// This should be created using the Containers service.
	string container_id = 2;

	// 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.v1.types.Mount rootfs = 3;

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

	types.Descriptor checkpoint = 9;
}

message CreateResponse {
	// TODO(stevvooe): We no longer have an id for a task since they are bound
	// to a single container. Although, we should represent each new task with
	// an ID so one can differentiate between each instance of a container
	// running.
	//
	// Hence, we are leaving this here and reserving the field number in case
	// we need to move in this direction.
	// string id = 1;

	string container_id = 2;
	uint32 pid = 3;
}

message StartRequest {
	string container_id = 1;
}

message DeleteRequest {
	string container_id = 1;
}

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

message InfoRequest {
	string container_id = 1;
}

message InfoResponse {
	types.Task task = 1;
}

message ListRequest {
}

message ListResponse {
	repeated containerd.v1.types.Task tasks = 1;
}

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

message EventsRequest {
}

message ExecRequest {
	// ContainerID specifies the container in which to exec the process.
	string container_id = 1;
	bool terminal = 2;
	string stdin = 3;
	string stdout = 4;
	string stderr = 5;

	// Spec for starting a process in the target container.
	//
	// For runc, this is a process spec, for example.
	google.protobuf.Any spec = 6;
}

message ExecResponse {
	uint32 pid = 1;
}

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

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

message PauseRequest {
	string container_id = 1;
}

message ResumeRequest {
	string container_id = 1;
}

message ProcessesRequest {
	string container_id = 1;
}

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

message CheckpointRequest {
	string container_id = 1;
	bool allow_tcp = 2;
	bool allow_unix_sockets = 3;
	bool allow_terminal = 4;
	bool file_locks = 5;
	repeated string empty_namespaces = 6;
	string parent_checkpoint = 7 [(gogoproto.customtype) = "github.com/opencontainers/go-digest.Digest", (gogoproto.nullable) = false];
	bool exit = 8;
}

message CheckpointResponse {
	repeated types.Descriptor descriptors = 1;
}
