syntax = "proto3";

package common;

option go_package = "github.com/siderolabs/talos/pkg/machinery/api/common";
option java_package = "dev.talos.api.common";

import "google/protobuf/any.proto";
import "google/protobuf/descriptor.proto";
import "google/rpc/status.proto";

// An alternative to using options could be extracting versions from comments.
// Unfortunately, they are not available: https://github.com/golang/protobuf/issues/1134
// Also, while option numbers can be the same,
// names should be different: https://github.com/protocolbuffers/protobuf/issues/4861

extend google.protobuf.MessageOptions {
  // Indicates the Talos version when this deprecated message will be removed from API.
  string remove_deprecated_message = 93117;
}

extend google.protobuf.FieldOptions {
  // Indicates the Talos version when this deprecated filed will be removed from API.
  string remove_deprecated_field = 93117;
}

extend google.protobuf.EnumOptions {
  // Indicates the Talos version when this deprecated enum will be removed from API.
  string remove_deprecated_enum = 93117;
}

extend google.protobuf.EnumValueOptions {
  // Indicates the Talos version when this deprecated enum value will be removed from API.
  string remove_deprecated_enum_value = 93117;
}

extend google.protobuf.MethodOptions {
  // Indicates the Talos version when this deprecated method will be removed from API.
  string remove_deprecated_method = 93117;
}

extend google.protobuf.ServiceOptions {
  // Indicates the Talos version when this deprecated service will be removed from API.
  string remove_deprecated_service = 93117;
}

enum Code {
  FATAL = 0;
  LOCKED = 1;
  CANCELED = 2;
}

message Error {
  Code code = 1;
  string message = 2;
  repeated google.protobuf.Any details = 3;
}

// Common metadata message nested in all reply message types
message Metadata {
  // hostname of the server response comes from (injected by proxy)
  string hostname = 1;
  // error is set if request failed to the upstream (rest of response is
  // undefined)
  string error = 2;
  // error as gRPC Status
  google.rpc.Status status = 3;
}

message Data {
  Metadata metadata = 1;
  bytes bytes = 2;
}

message DataResponse {
  repeated Data messages = 1;
}

message Empty {
  Metadata metadata = 1;
}

message EmptyResponse {
  repeated Empty messages = 1;
}

enum ContainerDriver {
  CONTAINERD = 0;
  CRI = 1;
}

enum ContainerdNamespace {
  NS_UNKNOWN = 0;
  NS_SYSTEM = 1;
  NS_CRI = 2;
}

message ContainerdInstance {
  // Containerd instance to use.
  ContainerDriver driver = 1;
  // Containerd namespace to use.
  ContainerdNamespace namespace = 2;
}

message URL {
  string full_path = 1;
}

message PEMEncodedCertificateAndKey {
  bytes crt = 1;
  bytes key = 2;
}

message PEMEncodedKey {
  bytes key = 1;
}

message PEMEncodedCertificate {
  bytes crt = 1;
}

message NetIP {
  bytes ip = 1;
}

message NetIPPort {
  bytes ip = 1;
  int32 port = 2;
}

message NetIPPrefix {
  bytes ip = 1;
  int32 prefix_length = 2;
}
