// This proto is expected to be provided on disk or via the command-line to
// Envoy. It provides sufficient information for Envoy to fetch the rest of
// its configuration from either disk or management server(s).

syntax = "proto3";

package envoy.api.v2;

import "api/address.proto";
import "api/base.proto";
import "api/discovery.proto";
import "api/cds.proto";
import "api/lds.proto";

import "google/protobuf/duration.proto";
import "google/protobuf/struct.proto";

message LightstepConfig {
  // The cluster manager cluster that hosts the LightStep collectors.
  string collector_cluster = 1;
  // File containing the access token to the LightStep API.
  string access_token_file = 2;
}

message ZipkinConfig {
  // The cluster manager cluster that hosts the Zipkin collectors. Note that the
  // Zipkin cluster must be defined under clusters in the cluster manager
  // configuration section.
  string collector_cluster = 1;
  // The API endpoint of the Zipkin service where the spans will be sent. When
  // using a standard Zipkin installation, the API endpoint is typically
  // /api/v1/spans, which is the default value.
  string collector_endpoint = 2;
}

message Tracing {
  // Provides configuration for the HTTP tracer.
  message Http {
    // The name of the HTTP trace driver to instantiate. The name must match a
    // supported HTTP trace driver. "envoy.lightstep" and "envoy.zipkin" are built-in
    // trace drivers.
    string name = 1;
    // Trace driver specific configuration which depends on the driver being
    // instantiated. See the trace drivers for further documentation.
    google.protobuf.Struct config = 2;
  }
  Http http = 1;
}

message Admin {
  // The path to write the access log for the administration server. If no
  // access log is desired specify ‘/dev/null’.
  string access_log_path = 1;
  // The cpu profiler output path for the administration server. If no profile
  // path is specified, the default is ‘/var/log/envoy/envoy.prof’.
  string profile_path = 2;
  // The TCP address that the administration server will listen on.
  Address address = 3;
}

message ClusterManager {
  // Name of the local cluster (i.e., the cluster that owns the Envoy running
  // this configuration). In order to enable zone aware routing this option must
  // be set. If local_cluster_name is defined then clusters must contain a
  // definition of a cluster with the same name.
  string local_cluster_name = 1;

  // Optional global configuration for outlier detection.
  message OutlierDetection {
    string event_log_path = 1;
  }
  OutlierDetection outlier_detection = 2;

  // Optional configuration used to bind newly established upstream connections.
  // This may be overridden on a per-cluster basis by upstream_bind_config in the cds_config.
  BindConfig upstream_bind_config = 3;
}

// Stats proto for built-in "envoy.statsd" sink.
message StatsdSink {
  oneof statsd_specifier {
    // The UDP address of a running statsd compliant listener. If specified,
    // statistics will be flushed to this address.
    Address address = 1;
    // The name of a cluster manager cluster that is running a TCP statsd
    // compliant listener. If specified, Envoy will connect to this cluster to
    // flush statistics.
    string tcp_cluster_name = 2;
  }
}

message StatsSink {
  // The name of the stats sink to instantiate. The name must match a supported
  // stats sink. "envoy.statsd" is a built-in sink suitable for emitting to
  // statsd.
  string name = 1;
  // Stats sink specific configuration which depends on the sink being
  // instantiated. See the supported sinks for further documentation.
  google.protobuf.Struct config = 2;
}

message Watchdog {
  // The duration after which Envoy counts a nonresponsive thread in the
  // “server.watchdog_miss” statistic. If not specified the default is 200ms.
  google.protobuf.Duration miss_timeout = 1;
  // The duration after which Envoy counts a nonresponsive thread in the
  // “server.watchdog_mega_miss” statistic. If not specified the default is
  // 1000ms.
  google.protobuf.Duration megamiss_timeout = 2;
  // If a watched thread has been nonresponsive for this duration, assume a
  // programming error and kill the entire Envoy process. Set to 0 to disable
  // kill behavior. If not specified the default is 0 (disabled).
  google.protobuf.Duration kill_timeout = 3;
  // If at least two watched threads have been nonresponsive for at least this
  // duration assume a true deadlock and kill the entire Envoy process. Set to 0
  // to disable this behavior. If not specified the default is 0 (disabled).
  google.protobuf.Duration multikill_timeout = 4;
}

message Runtime {
  // The implementation assumes that the file system tree is accessed via a
  // symbolic link. An atomic link swap is used when a new tree should be
  // switched to. This parameter specifies the path to the symbolic link. Envoy
  // will watch the location for changes and reload the file system tree when
  // they happen.
  string symlink_root = 1;
  // Specifies the subdirectory to load within the root directory. This is
  // useful if multiple systems share the same delivery mechanism. Envoy
  // configuration elements can be contained in a dedicated subdirectory.
  string subdirectory = 2;
  // Specifies an optional subdirectory to load within the root directory. If
  // specified and the directory exists, configuration values within this
  // directory will override those found in the primary subdirectory. This is
  // useful when Envoy is deployed across many different types of servers.
  // Sometimes it is useful to have a per service cluster directory for runtime
  // configuration. See below for exactly how the override directory is used.
  string override_subdirectory = 3;
}

message RateLimitServiceConfig {
  // Specifies the cluster manager cluster name that hosts the rate limit
  // service. The client will connect to this cluster when it needs to make rate
  // limit service requests.
  string cluster_name = 1;
}

message Bootstrap {
  // Node identity to present to the management server and for instance
  // identification purposes (e.g. in generated headers).
  Node node = 1;

  // Statically specified resources.
  message StaticResources {
    repeated Listener listeners = 1;
    // If a network based configuration source is specified for cds_config, it's
    // necessary to have some initial cluster definitions available to allow Envoy
    // to know how to speak to the management server. These cluster definitions
    // may not use EDS (i.e. they should be static IP or DNS-based).
    repeated Cluster clusters = 2;
  }
  StaticResources static_resources = 2;

  // xDS configuration sources.
  message DynamicResources {
    // All Listeners are provided by a single LDS configuration source.
    ConfigSource lds_config = 1;
    // All post-bootstrap Cluster definitions are provided by a single CDS
    // configuration source.
    ConfigSource cds_config = 2;
    // A single ADS source may be optionally specified. This must have api_type GRPC.
    ApiConfigSource ads_config = 3;

    message DeprecatedV1 {
      // This is the global SDS config when using v1 REST for CDS/EDS.
      ConfigSource sds_config = 1;
    }
    DeprecatedV1 deprecated_v1 = 4;
  }
  DynamicResources dynamic_resources = 3;

  // Configuration for the cluster manager which owns all upstream clusters
  // within the server.
  ClusterManager cluster_manager = 4;

  // Optional file system path to search for startup flag files.
  string flags_path = 5;

  // Optional set of stats sinks.
  repeated StatsSink stats_sinks = 6;

  // Optional duration between flushes to configured stats sinks. For
  // performance reasons Envoy latches counters and only flushes counters and
  // gauges at a periodic interval. If not specified the default is 5000ms (5
  // seconds).
  google.protobuf.Duration stats_flush_interval = 7;

  // Optional watchdog configuration.
  Watchdog watchdog = 8;

  // Configuration for an external tracing provider. If not specified, no
  // tracing will be performed.
  Tracing tracing = 9;

  // Configuration for an external rate limit service provider. If not
  // specified, any calls to the rate limit service will immediately return
  // success.
  RateLimitServiceConfig rate_limit_service = 10;

  // Configuration for the runtime configuration provider. If not specified, a
  // “null” provider will be used which will result in all defaults being used.
  Runtime runtime = 11;

  // Configuration for the local administration HTTP server.
  Admin admin = 12;
}