syntax = "proto3"; package com.apple.containerization.sandbox.v3; import "google/protobuf/timestamp.proto"; // Context for interacting with a container's runtime environment. service SandboxContext { // Mount a filesystem. rpc Mount(MountRequest) returns (MountResponse); // Unmount a filesystem. rpc Umount(UmountRequest) returns (UmountResponse); // Set an environment variable on the init process. rpc Setenv(SetenvRequest) returns (SetenvResponse); // Get an environment variable from the init process. rpc Getenv(GetenvRequest) returns (GetenvResponse); // Create a new directory inside the sandbox. rpc Mkdir(MkdirRequest) returns (MkdirResponse); // Set sysctls in the context of the sandbox. rpc Sysctl(SysctlRequest) returns (SysctlResponse); // Set time in the guest. rpc SetTime(SetTimeRequest) returns (SetTimeResponse); // Set up an emulator in the guest for a specific binary format. rpc SetupEmulator(SetupEmulatorRequest) returns (SetupEmulatorResponse); // Write data to an existing or new file. rpc WriteFile(WriteFileRequest) returns (WriteFileResponse); // Copy a file or directory between the host and guest. // Data transfer happens over a dedicated vsock connection; // the gRPC stream is used only for control/metadata. rpc Copy(CopyRequest) returns (stream CopyResponse); // Stat a path in the guest filesystem. rpc Stat(StatRequest) returns (StatResponse); // Perform a filesystem operation on a mounted filesystem. rpc FilesystemOperation(FilesystemOperationRequest) returns (FilesystemOperationResponse); // Create a new process inside the container. rpc CreateProcess(CreateProcessRequest) returns (CreateProcessResponse); // Delete an existing process inside the container. rpc DeleteProcess(DeleteProcessRequest) returns (DeleteProcessResponse); // Start the provided process. rpc StartProcess(StartProcessRequest) returns (StartProcessResponse); // Send a signal to the provided process. rpc KillProcess(KillProcessRequest) returns (KillProcessResponse); // Wait for a process to exit and return the exit code. rpc WaitProcess(WaitProcessRequest) returns (WaitProcessResponse); // Resize the tty of a given process. This will error if the process does // not have a pty allocated. rpc ResizeProcess(ResizeProcessRequest) returns (ResizeProcessResponse); // Close IO for a given process. rpc CloseProcessStdin(CloseProcessStdinRequest) returns (CloseProcessStdinResponse); // Get statistics for containers. rpc ContainerStatistics(ContainerStatisticsRequest) returns (ContainerStatisticsResponse); // Proxy a vsock port to a unix domain socket in the guest, or vice versa. rpc ProxyVsock(ProxyVsockRequest) returns (ProxyVsockResponse); // Stop a vsock proxy to a unix domain socket. rpc StopVsockProxy(StopVsockProxyRequest) returns (StopVsockProxyResponse); // Set the link state of a network interface. rpc IpLinkSet(IpLinkSetRequest) returns (IpLinkSetResponse); // Add an IPv4 address to a network interface. rpc IpAddrAdd(IpAddrAddRequest) returns (IpAddrAddResponse); // Add an IP route for a network interface. rpc IpRouteAddLink(IpRouteAddLinkRequest) returns (IpRouteAddLinkResponse); // Add an IP route for a network interface. rpc IpRouteAddDefault(IpRouteAddDefaultRequest) returns (IpRouteAddDefaultResponse); // Configure DNS resolver. rpc ConfigureDns(ConfigureDnsRequest) returns (ConfigureDnsResponse); // Configure /etc/hosts. rpc ConfigureHosts(ConfigureHostsRequest) returns (ConfigureHostsResponse); // Perform the sync syscall. rpc Sync(SyncRequest) returns (SyncResponse); // Send a signal to a process via the PID. rpc Kill(KillRequest) returns (KillResponse); } message Stdio { optional int32 stdinPort = 1; optional int32 stdoutPort = 2; optional int32 stderrPort = 3; } message SetupEmulatorRequest { string binary_path = 1; string name = 2; string type = 3; string offset = 4; string magic = 5; string mask = 6; string flags = 7; } message SetupEmulatorResponse {} message SetTimeRequest { int64 sec = 1; int32 usec = 2; } message SetTimeResponse {} message SysctlRequest { map settings = 1; } message SysctlResponse {} message ProxyVsockRequest { enum Action { INTO = 0; OUT_OF = 1; } string id = 1; uint32 vsock_port = 2; string guestPath = 3; optional uint32 guestSocketPermissions = 4; Action action = 5; } message ProxyVsockResponse {} message StopVsockProxyRequest { string id = 1; } message StopVsockProxyResponse {} message MountRequest { string type = 1; string source = 2; string destination = 3; repeated string options = 4; } message MountResponse {} message UmountRequest { string path = 1; int32 flags = 2; } message UmountResponse {} message SetenvRequest { string key = 1; optional string value = 2; } message SetenvResponse {} message GetenvRequest { string key = 1; } message GetenvResponse { optional string value = 1; } message CreateProcessRequest { string id = 1; optional string containerID = 2; optional uint32 stdin = 3; optional uint32 stdout = 4; optional uint32 stderr = 5; optional string ociRuntimePath = 6; bytes configuration = 7; optional bytes options = 8; } message CreateProcessResponse {} message WaitProcessRequest { string id = 1; optional string containerID = 2; } message WaitProcessResponse { int32 exitCode = 1; google.protobuf.Timestamp exited_at = 2; } message ResizeProcessRequest { string id = 1; optional string containerID = 2; uint32 rows = 3; uint32 columns = 4; } message ResizeProcessResponse {} message DeleteProcessRequest { string id = 1; optional string containerID = 2; } message DeleteProcessResponse {} message StartProcessRequest { string id = 1; optional string containerID = 2; } message StartProcessResponse { int32 pid = 1; } message KillProcessRequest { string id = 1; optional string containerID = 2; int32 signal = 3; } message KillProcessResponse { int32 result = 1; } message CloseProcessStdinRequest { string id = 1; optional string containerID = 2; } message CloseProcessStdinResponse {} message MkdirRequest { string path = 1; bool all = 2; uint32 perms = 3; } message MkdirResponse {} message WriteFileRequest { message WriteFileFlags { bool create_parent_dirs = 1; bool append = 2; bool create_if_missing = 3; } string path = 1; bytes data = 2; uint32 mode = 3; WriteFileFlags flags = 4; } message WriteFileResponse {} message CopyRequest { enum Direction { // Copy from host into guest. COPY_IN = 0; // Copy from guest to host. COPY_OUT = 1; } // Direction of the copy operation. Direction direction = 1; // Path in the guest (destination for COPY_IN, source for COPY_OUT). string path = 2; // File mode for single-file COPY_IN (defaults to 0644 if not set). uint32 mode = 3; // Create parent directories if they don't exist. bool create_parents = 4; // Vsock port the host is listening on for data transfer. uint32 vsock_port = 5; // For COPY_IN: indicates the data arriving on vsock is a tar+gzip archive. bool is_archive = 6; } message CopyResponse { enum Status { // Transfer metadata (first message for COPY_OUT: is_archive, total_size). METADATA = 0; // Data transfer completed successfully. COMPLETE = 1; } // What this response represents. Status status = 1; // For COPY_OUT METADATA: indicates the data on vsock will be a tar+gzip archive. bool is_archive = 2; // For COPY_OUT METADATA: total size in bytes (0 if unknown, e.g. for archives). uint64 total_size = 3; // Non-empty if an error occurred. string error = 4; } message StatRequest { string path = 1; } message Stat { uint64 dev = 1; // st_dev: ID of device containing file uint64 ino = 2; // st_ino: inode number uint32 mode = 3; // st_mode: file type and mode (permissions) uint64 nlink = 4; // st_nlink: number of hard links uint32 uid = 5; // st_uid: user ID of owner uint32 gid = 6; // st_gid: group ID of owner uint64 rdev = 7; // st_rdev: device ID (if special file) int64 size = 8; // st_size: total size in bytes int64 blksize = 9; // st_blksize: preferred block size for filesystem I/O int64 blocks = 10; // st_blocks: number of 512-byte blocks allocated google.protobuf.Timestamp atime = 11; // st_atim: time of last access google.protobuf.Timestamp mtime = 12; // st_mtim: time of last modification google.protobuf.Timestamp ctime = 13; // st_ctim: time of last status change } message StatResponse { Stat stat = 1; string error = 2; // Non-empty if stat failed. } message FiTrimParams { oneof schedule { OneShot one_shot = 1; } message OneShot {} } message FiFreezeParams {} message FiThawParams {} message FiTrimResult { uint64 trimmed_bytes = 1; } message FilesystemOperationRequest { string path = 1; oneof operation { FiTrimParams trim = 2; FiFreezeParams freeze = 3; FiThawParams thaw = 4; } } message FilesystemOperationResponse { oneof result { FiTrimResult trim = 1; } } message IpLinkSetRequest { string interface = 1; bool up = 2; optional uint32 mtu = 3; } message IpLinkSetResponse {} message IpAddrAddRequest { string interface = 1; string ipv4Address = 2; optional string ipv6Address = 3; } message IpAddrAddResponse {} message IpRouteAddLinkRequest { string interface = 1; string dstIpv4Addr = 2; string srcIpv4Addr = 3; optional string dstIpv6Addr = 4; optional string srcIpv6Addr = 5; } message IpRouteAddLinkResponse {} message IpRouteAddDefaultRequest { string interface = 1; string ipv4Gateway = 2; optional string ipv6Gateway = 3; } message IpRouteAddDefaultResponse {} message ConfigureDnsRequest { string location = 1; repeated string nameservers = 2; optional string domain = 3; repeated string searchDomains = 4; repeated string options = 5; } message ConfigureDnsResponse {} message ConfigureHostsRequest { message HostsEntry { string ipAddress = 1; repeated string hostnames = 2; optional string comment = 3; } string location = 1; repeated HostsEntry entries = 2; optional string comment = 3; } message ConfigureHostsResponse {} message SyncRequest {} message SyncResponse {} message KillRequest { int32 pid = 1; int32 signal = 3; } message KillResponse { int32 result = 1; } // Categories of statistics that can be requested. enum StatCategory { STAT_CATEGORY_UNSPECIFIED = 0; STAT_CATEGORY_PROCESS = 1; STAT_CATEGORY_MEMORY = 2; STAT_CATEGORY_CPU = 3; STAT_CATEGORY_BLOCK_IO = 4; STAT_CATEGORY_NETWORK = 5; STAT_CATEGORY_MEMORY_EVENTS = 6; } message ContainerStatisticsRequest { repeated string container_ids = 1; // Empty = all containers repeated StatCategory categories = 2; // Empty = all categories } message ContainerStatisticsResponse { repeated ContainerStats containers = 1; } message ContainerStats { string container_id = 1; ProcessStats process = 2; MemoryStats memory = 3; CPUStats cpu = 4; BlockIOStats block_io = 5; repeated NetworkStats networks = 6; MemoryEventStats memory_events = 7; } message ProcessStats { uint64 current = 1; uint64 limit = 2; // 0 or max value = unlimited } message MemoryStats { uint64 usage_bytes = 1; uint64 limit_bytes = 2; uint64 swap_usage_bytes = 3; uint64 swap_limit_bytes = 4; uint64 cache_bytes = 5; uint64 kernel_stack_bytes = 6; uint64 slab_bytes = 7; uint64 page_faults = 8; uint64 major_page_faults = 9; uint64 inactive_file = 10; uint64 anon = 11; uint64 workingset_refault_anon = 12; uint64 workingset_refault_file = 13; uint64 pgsteal_kswapd = 14; uint64 pgsteal_direct = 15; uint64 pgsteal_khugepaged = 16; } message CPUStats { uint64 usage_usec = 1; uint64 user_usec = 2; uint64 system_usec = 3; uint64 throttling_periods = 4; uint64 throttled_periods = 5; uint64 throttled_time_usec = 6; } message BlockIOStats { repeated BlockIOEntry devices = 1; } message BlockIOEntry { uint64 major = 1; uint64 minor = 2; uint64 read_bytes = 3; uint64 write_bytes = 4; uint64 read_operations = 5; uint64 write_operations = 6; } message NetworkStats { string interface = 1; uint64 receivedPackets = 2; uint64 transmittedPackets = 3; uint64 receivedBytes = 4; uint64 transmittedBytes = 5; uint64 receivedErrors = 6; uint64 transmittedErrors = 7; } // Memory event counters from cgroup2's memory.events file. message MemoryEventStats { // Number of times the cgroup was reclaimed due to low memory. uint64 low = 1; // Number of times the cgroup exceeded its high memory limit. uint64 high = 2; // Number of times the cgroup hit its max memory limit. uint64 max = 3; // Number of times the cgroup triggered OOM. uint64 oom = 4; // Number of processes killed by OOM killer. uint64 oom_kill = 5; // Number of times charge for memory failed because of limit. uint64 oom_group_kill = 6; }