// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0

// Package dataplane provides a service on Consul servers for the Consul Dataplane

syntax = "proto3";

package hashicorp.consul.dataplane;

import "annotations/ratelimit/ratelimit.proto";
import "google/protobuf/struct.proto";

message GetSupportedDataplaneFeaturesRequest {}

enum DataplaneFeatures {
  DATAPLANE_FEATURES_UNSPECIFIED = 0;
  DATAPLANE_FEATURES_WATCH_SERVERS = 1;
  DATAPLANE_FEATURES_EDGE_CERTIFICATE_MANAGEMENT = 2;
  DATAPLANE_FEATURES_ENVOY_BOOTSTRAP_CONFIGURATION = 3;
  DATAPLANE_FEATURES_FIPS = 4;
}

message DataplaneFeatureSupport {
  DataplaneFeatures feature_name = 1;
  bool supported = 2;
}

message GetSupportedDataplaneFeaturesResponse {
  repeated DataplaneFeatureSupport supported_dataplane_features = 1;
}

message GetEnvoyBootstrapParamsRequest {
  oneof node_spec {
    string node_id = 1;
    string node_name = 2;
  }
  // The proxy service ID
  string service_id = 3;
  string partition = 4;
  string namespace = 5;
}

enum ServiceKind {
  // ServiceKind UNSPECIFIED is a sentinel value for when a request
  // did not specify a service kind. This will be treated the same
  // as if TYPICAL was explicitly used.
  SERVICE_KIND_UNSPECIFIED = 0;

  // ServiceKind Typical is a typical, classic Consul service. This is
  // represented by the absence of a value. This was chosen for ease of
  // backwards compatibility: existing services in the catalog would
  // default to the typical service.
  SERVICE_KIND_TYPICAL = 1;

  // ServiceKind Connect Proxy is a proxy for the Connect feature. This
  // service proxies another service within Consul and speaks the connect
  // protocol.
  SERVICE_KIND_CONNECT_PROXY = 2;

  // ServiceKind Mesh Gateway is a Mesh Gateway for the Connect feature. This
  // service will proxy connections based off the SNI header set by other
  // connect proxies.
  SERVICE_KIND_MESH_GATEWAY = 3;

  // ServiceKind Terminating Gateway is a Terminating Gateway for the Connect
  // feature. This service will proxy connections to services outside the mesh.
  SERVICE_KIND_TERMINATING_GATEWAY = 4;

  // ServiceKind Ingress Gateway is an Ingress Gateway for the Connect feature.
  // This service will ingress connections into the service mesh.
  SERVICE_KIND_INGRESS_GATEWAY = 5;

  // ServiceKind API Gateway is an API Gateway for the Connect feature.
  // This service will ingress connections in to the service mesh.
  SERVICE_KIND_API_GATEWAY = 6;
}

message GetEnvoyBootstrapParamsResponse {
  ServiceKind service_kind = 1;
  // service is be used to identify the service (as the local cluster name and
  // in metric tags). If the service is a connect proxy it will be the name of
  // the proxy's destination service, for gateways it will be the gateway
  // service's name.
  string service = 2;
  string namespace = 3;
  string partition = 4;
  string datacenter = 5;
  google.protobuf.Struct config = 6;
  string node_id = 7;
  string node_name = 8;
  repeated string access_logs = 9;
}

service DataplaneService {
  rpc GetSupportedDataplaneFeatures(GetSupportedDataplaneFeaturesRequest) returns (GetSupportedDataplaneFeaturesResponse) {
    option (hashicorp.consul.internal.ratelimit.spec) = {
      operation_type: OPERATION_TYPE_READ,
      operation_category: OPERATION_CATEGORY_DATAPLANE
    };
  }

  rpc GetEnvoyBootstrapParams(GetEnvoyBootstrapParamsRequest) returns (GetEnvoyBootstrapParamsResponse) {
    option (hashicorp.consul.internal.ratelimit.spec) = {
      operation_type: OPERATION_TYPE_READ,
      operation_category: OPERATION_CATEGORY_DATAPLANE
    };
  }
}
