syntax = "proto3";

package buildx.controller.v1;

import "github.com/moby/buildkit/api/services/control/control.proto";
import "github.com/moby/buildkit/sourcepolicy/pb/policy.proto";

option go_package = "github.com/docker/buildx/controller/pb";

service Controller {
  rpc Build(BuildRequest) returns (BuildResponse);
  rpc Inspect(InspectRequest) returns (InspectResponse);
  rpc Status(StatusRequest) returns (stream StatusResponse);
  rpc Input(stream InputMessage) returns (InputResponse);
  rpc Invoke(stream Message) returns (stream Message);
  rpc List(ListRequest) returns (ListResponse);
  rpc Disconnect(DisconnectRequest) returns (DisconnectResponse);
  rpc Info(InfoRequest) returns (InfoResponse);
  rpc ListProcesses(ListProcessesRequest) returns (ListProcessesResponse);
  rpc DisconnectProcess(DisconnectProcessRequest) returns (DisconnectProcessResponse);
}

message ListProcessesRequest {
  string SessionID = 1;
}

message ListProcessesResponse {
  repeated ProcessInfo Infos = 1;
}

message ProcessInfo {
  string ProcessID = 1;
  InvokeConfig InvokeConfig = 2;
}

message DisconnectProcessRequest {
  string SessionID = 1;
  string ProcessID = 2;
}

message DisconnectProcessResponse {
}

message BuildRequest {
  string SessionID = 1;
  BuildOptions Options = 2;
}

message BuildOptions {
  string ContextPath = 1;
  string DockerfileName = 2;
  CallFunc CallFunc = 3;
  map<string, string> NamedContexts = 4;

  repeated string Allow = 5;
  repeated Attest Attests = 6;
  map<string, string> BuildArgs = 7;
  repeated CacheOptionsEntry CacheFrom = 8;
  repeated CacheOptionsEntry CacheTo = 9;
  string CgroupParent = 10;
  repeated ExportEntry Exports = 11;
  repeated string ExtraHosts = 12;
  map<string, string> Labels = 13;
  string NetworkMode = 14;
  repeated string NoCacheFilter = 15;
  repeated string Platforms = 16;
  repeated Secret Secrets = 17;
  int64 ShmSize = 18;
  repeated SSH SSH = 19;
  repeated string Tags = 20;
  string Target = 21;
  UlimitOpt Ulimits = 22;

  string Builder = 23;
  bool NoCache = 24;
  bool Pull = 25;
  bool ExportPush = 26;
  bool ExportLoad = 27;
  moby.buildkit.v1.sourcepolicy.Policy SourcePolicy = 28;
  string Ref = 29;
  string GroupRef = 30;
  repeated string Annotations = 31;
  string ProvenanceResponseMode = 32;
}

message ExportEntry {
  string Type = 1;
  map<string, string> Attrs = 2;
  string Destination = 3;
}

message CacheOptionsEntry {
  string Type = 1;
  map<string, string> Attrs = 2;
}

message Attest {
  string Type = 1;
  bool Disabled = 2;
  string Attrs = 3;
}

message SSH {
  string ID = 1;
  repeated string Paths = 2;
}

message Secret {
  string ID = 1;
  string FilePath = 2;
  string Env = 3;
}

message CallFunc {
  string Name = 1;
  string Format = 2;
  bool IgnoreStatus = 3;
}

message InspectRequest {
  string SessionID = 1;
}

message InspectResponse {
  BuildOptions Options = 1;
}

message UlimitOpt {
  map<string, Ulimit> values = 1;
}

message Ulimit {
  string Name = 1;
  int64 Hard = 2;
  int64 Soft = 3;
}

message BuildResponse {
	map<string, string> ExporterResponse = 1;
}

message DisconnectRequest {
  string SessionID = 1;
}

message DisconnectResponse {}

message ListRequest {
  string SessionID = 1;
}

message ListResponse {
  repeated string keys = 1;
}

message InputMessage {
  oneof Input {
    InputInitMessage Init = 1;
    DataMessage Data = 2;
  }
}

message InputInitMessage {
  string SessionID = 1;
}

message DataMessage {
  bool EOF = 1;    // true if eof was reached
  bytes Data = 2;  // should be chunked smaller than 4MB:
                   // https://pkg.go.dev/google.golang.org/grpc#MaxRecvMsgSize
}

message InputResponse {}

message Message {
  oneof Input {
    InitMessage Init = 1;
    // FdMessage used from client to server for input (stdin) and
    // from server to client for output (stdout, stderr)
    FdMessage File = 2;
    // ResizeMessage used from client to server for terminal resize events
    ResizeMessage Resize = 3;
    // SignalMessage is used from client to server to send signal events
    SignalMessage Signal = 4;
  }
}

message InitMessage {
  string SessionID = 1;

  // If ProcessID already exists in the server, it tries to connect to it
  // instead of invoking the new one. In this case, InvokeConfig will be ignored.
  string ProcessID = 2;
  InvokeConfig InvokeConfig = 3;
}

message InvokeConfig {
  repeated string Entrypoint = 1;
  repeated string Cmd = 2;
  bool NoCmd = 11; // Do not set cmd but use the image's default
  repeated string Env = 3;
  string User = 4;
  bool NoUser = 5; // Do not set user but use the image's default
  string Cwd = 6;
  bool NoCwd = 7; // Do not set cwd but use the image's default
  bool Tty = 8;
  bool Rollback = 9; // Kill all process in the container and recreate it.
  bool Initial = 10; // Run container from the initial state of that stage (supported only on the failed step)
}

message FdMessage {
  uint32 Fd = 1;   // what fd the data was from
  bool EOF = 2;    // true if eof was reached
  bytes Data = 3;  // should be chunked smaller than 4MB:
                   // https://pkg.go.dev/google.golang.org/grpc#MaxRecvMsgSize
}

message ResizeMessage {
  uint32 Rows = 1;
  uint32 Cols = 2;
}

message SignalMessage {
  // we only send name (ie HUP, INT) because the int values
  // are platform dependent.
  string Name = 1;
}

message StatusRequest {
  string SessionID = 1;
}

message StatusResponse {
  repeated moby.buildkit.v1.Vertex vertexes = 1;
  repeated moby.buildkit.v1.VertexStatus statuses = 2;
  repeated moby.buildkit.v1.VertexLog logs = 3;
  repeated moby.buildkit.v1.VertexWarning warnings = 4;
}

message InfoRequest {}

message InfoResponse {
  BuildxVersion buildxVersion = 1;
}

message BuildxVersion {
  string package = 1;
  string version = 2;
  string revision = 3;
}
