/*
	Copyright The containerd Authors.

	Licensed under the Apache License, Version 2.0 (the "License");
	you may not use this file except in compliance with the License.
	You may obtain a copy of the License at

		http://www.apache.org/licenses/LICENSE-2.0

	Unless required by applicable law or agreed to in writing, software
	distributed under the License is distributed on an "AS IS" BASIS,
	WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
	See the License for the specific language governing permissions and
	limitations under the License.
*/

syntax = "proto3";

package containerd.runtime.sandbox.v1;

import "google/protobuf/any.proto";
import "google/protobuf/timestamp.proto";

import "github.com/containerd/containerd/api/types/mount.proto";
import "github.com/containerd/containerd/api/types/platform.proto";
import "github.com/containerd/containerd/api/types/metrics.proto";

option go_package = "github.com/containerd/containerd/api/runtime/sandbox/v1;sandbox";

// Sandbox is an optional interface that shim may implement to support sandboxes environments.
// A typical example of sandbox is microVM or pause container - an entity that groups containers and/or
// holds resources relevant for this group.
service Sandbox {
	// CreateSandbox will be called right after sandbox shim instance launched.
	// It is a good place to initialize sandbox environment.
	rpc CreateSandbox(CreateSandboxRequest) returns (CreateSandboxResponse);

	// StartSandbox will start a previously created sandbox.
	rpc StartSandbox(StartSandboxRequest) returns (StartSandboxResponse);

	// Platform queries the platform the sandbox is going to run containers on.
	// containerd will use this to generate a proper OCI spec.
	rpc Platform(PlatformRequest) returns (PlatformResponse);

	// StopSandbox will stop existing sandbox instance
	rpc StopSandbox(StopSandboxRequest) returns (StopSandboxResponse);

	// WaitSandbox blocks until sandbox exits.
	rpc WaitSandbox(WaitSandboxRequest) returns (WaitSandboxResponse);

	// SandboxStatus will return current status of the running sandbox instance
	rpc SandboxStatus(SandboxStatusRequest) returns (SandboxStatusResponse);

	// PingSandbox is a lightweight API call to check whether sandbox alive.
	rpc PingSandbox(PingRequest) returns (PingResponse);

	// ShutdownSandbox must shutdown shim instance.
	rpc ShutdownSandbox(ShutdownSandboxRequest) returns (ShutdownSandboxResponse);

	// SandboxMetrics retrieves metrics about a sandbox instance.
	rpc SandboxMetrics(SandboxMetricsRequest) returns (SandboxMetricsResponse);
}

message CreateSandboxRequest {
	string sandbox_id = 1;
	string bundle_path = 2;
	repeated containerd.types.Mount rootfs = 3;
	google.protobuf.Any options = 4;
	string netns_path = 5;
	map<string, string> annotations = 6;
}

message CreateSandboxResponse {}

message StartSandboxRequest {
	string sandbox_id = 1;
}

message StartSandboxResponse {
	uint32 pid = 1;
	google.protobuf.Timestamp created_at = 2;
}

message PlatformRequest {
	string sandbox_id = 1;
}

message PlatformResponse {
	containerd.types.Platform platform = 1;
}

message StopSandboxRequest {
	string sandbox_id = 1;
	uint32 timeout_secs = 2;
}

message StopSandboxResponse {}

message UpdateSandboxRequest {
	string sandbox_id = 1;
	google.protobuf.Any resources = 2;
	map<string, string> annotations = 3;
}

message WaitSandboxRequest {
	string sandbox_id = 1;
}

message WaitSandboxResponse {
	uint32 exit_status = 1;
	google.protobuf.Timestamp exited_at = 2;
}

message UpdateSandboxResponse {}

message SandboxStatusRequest {
	string sandbox_id = 1;
	bool verbose = 2;
}

message SandboxStatusResponse {
	string sandbox_id = 1;
	uint32 pid = 2;
	string state = 3;
	map<string, string> info = 4;
	google.protobuf.Timestamp created_at = 5;
	google.protobuf.Timestamp exited_at = 6;
	google.protobuf.Any extra = 7;
}

message PingRequest {
	string sandbox_id = 1;
}

message PingResponse {}

message ShutdownSandboxRequest {
	string sandbox_id = 1;
}

message ShutdownSandboxResponse {}

message SandboxMetricsRequest {
	string sandbox_id = 1;
}

message SandboxMetricsResponse {
	containerd.types.Metric metrics = 1;
}
