...
1syntax = "proto3";
2
3package envoy.config.bootstrap.v3;
4
5import "envoy/config/cluster/v3/cluster.proto";
6import "envoy/config/core/v3/address.proto";
7import "envoy/config/core/v3/base.proto";
8import "envoy/config/core/v3/config_source.proto";
9import "envoy/config/core/v3/event_service_config.proto";
10import "envoy/config/core/v3/extension.proto";
11import "envoy/config/core/v3/socket_option.proto";
12import "envoy/config/listener/v3/listener.proto";
13import "envoy/config/metrics/v3/stats.proto";
14import "envoy/config/overload/v3/overload.proto";
15import "envoy/config/trace/v3/http_tracer.proto";
16import "envoy/extensions/transport_sockets/tls/v3/secret.proto";
17import "envoy/type/v3/percent.proto";
18
19import "google/protobuf/duration.proto";
20import "google/protobuf/struct.proto";
21import "google/protobuf/wrappers.proto";
22
23import "envoy/annotations/deprecation.proto";
24import "udpa/annotations/migrate.proto";
25import "udpa/annotations/security.proto";
26import "udpa/annotations/status.proto";
27import "udpa/annotations/versioning.proto";
28import "validate/validate.proto";
29
30option java_package = "io.envoyproxy.envoy.config.bootstrap.v3";
31option java_outer_classname = "BootstrapProto";
32option java_multiple_files = true;
33option (udpa.annotations.file_status).package_version_status = ACTIVE;
34
35// [#protodoc-title: Bootstrap]
36// This proto is supplied via the :option:`-c` CLI flag and acts as the root
37// of the Envoy v2 configuration. See the :ref:`v2 configuration overview
38// <config_overview_bootstrap>` for more detail.
39
40// Bootstrap :ref:`configuration overview <config_overview_bootstrap>`.
41// [#next-free-field: 30]
42message Bootstrap {
43 option (udpa.annotations.versioning).previous_message_type =
44 "envoy.config.bootstrap.v2.Bootstrap";
45
46 message StaticResources {
47 option (udpa.annotations.versioning).previous_message_type =
48 "envoy.config.bootstrap.v2.Bootstrap.StaticResources";
49
50 // Static :ref:`Listeners <envoy_api_msg_config.listener.v3.Listener>`. These listeners are
51 // available regardless of LDS configuration.
52 repeated listener.v3.Listener listeners = 1;
53
54 // If a network based configuration source is specified for :ref:`cds_config
55 // <envoy_api_field_config.bootstrap.v3.Bootstrap.DynamicResources.cds_config>`, it's necessary
56 // to have some initial cluster definitions available to allow Envoy to know
57 // how to speak to the management server. These cluster definitions may not
58 // use :ref:`EDS <arch_overview_dynamic_config_eds>` (i.e. they should be static
59 // IP or DNS-based).
60 repeated cluster.v3.Cluster clusters = 2;
61
62 // These static secrets can be used by :ref:`SdsSecretConfig
63 // <envoy_api_msg_extensions.transport_sockets.tls.v3.SdsSecretConfig>`
64 repeated envoy.extensions.transport_sockets.tls.v3.Secret secrets = 3;
65 }
66
67 // [#next-free-field: 7]
68 message DynamicResources {
69 option (udpa.annotations.versioning).previous_message_type =
70 "envoy.config.bootstrap.v2.Bootstrap.DynamicResources";
71
72 reserved 4;
73
74 // All :ref:`Listeners <envoy_api_msg_config.listener.v3.Listener>` are provided by a single
75 // :ref:`LDS <arch_overview_dynamic_config_lds>` configuration source.
76 core.v3.ConfigSource lds_config = 1;
77
78 // xdstp:// resource locator for listener collection.
79 // [#not-implemented-hide:]
80 string lds_resources_locator = 5;
81
82 // All post-bootstrap :ref:`Cluster <envoy_api_msg_config.cluster.v3.Cluster>` definitions are
83 // provided by a single :ref:`CDS <arch_overview_dynamic_config_cds>`
84 // configuration source.
85 core.v3.ConfigSource cds_config = 2;
86
87 // xdstp:// resource locator for cluster collection.
88 // [#not-implemented-hide:]
89 string cds_resources_locator = 6;
90
91 // A single :ref:`ADS <config_overview_ads>` source may be optionally
92 // specified. This must have :ref:`api_type
93 // <envoy_api_field_config.core.v3.ApiConfigSource.api_type>` :ref:`GRPC
94 // <envoy_api_enum_value_config.core.v3.ApiConfigSource.ApiType.GRPC>`. Only
95 // :ref:`ConfigSources <envoy_api_msg_config.core.v3.ConfigSource>` that have
96 // the :ref:`ads <envoy_api_field_config.core.v3.ConfigSource.ads>` field set will be
97 // streamed on the ADS channel.
98 core.v3.ApiConfigSource ads_config = 3;
99 }
100
101 reserved 10, 11;
102
103 reserved "runtime";
104
105 // Node identity to present to the management server and for instance
106 // identification purposes (e.g. in generated headers).
107 core.v3.Node node = 1;
108
109 // A list of :ref:`Node <envoy_v3_api_msg_config.core.v3.Node>` field names
110 // that will be included in the context parameters of the effective
111 // xdstp:// URL that is sent in a discovery request when resource
112 // locators are used for LDS/CDS. Any non-string field will have its JSON
113 // encoding set as the context parameter value, with the exception of
114 // metadata, which will be flattened (see example below). The supported field
115 // names are:
116 // - "cluster"
117 // - "id"
118 // - "locality.region"
119 // - "locality.sub_zone"
120 // - "locality.zone"
121 // - "metadata"
122 // - "user_agent_build_version.metadata"
123 // - "user_agent_build_version.version"
124 // - "user_agent_name"
125 // - "user_agent_version"
126 //
127 // The node context parameters act as a base layer dictionary for the context
128 // parameters (i.e. more specific resource specific context parameters will
129 // override). Field names will be prefixed with “udpa.node.” when included in
130 // context parameters.
131 //
132 // For example, if node_context_params is ``["user_agent_name", "metadata"]``,
133 // the implied context parameters might be::
134 //
135 // node.user_agent_name: "envoy"
136 // node.metadata.foo: "{\"bar\": \"baz\"}"
137 // node.metadata.some: "42"
138 // node.metadata.thing: "\"thing\""
139 //
140 // [#not-implemented-hide:]
141 repeated string node_context_params = 26;
142
143 // Statically specified resources.
144 StaticResources static_resources = 2;
145
146 // xDS configuration sources.
147 DynamicResources dynamic_resources = 3;
148
149 // Configuration for the cluster manager which owns all upstream clusters
150 // within the server.
151 ClusterManager cluster_manager = 4;
152
153 // Health discovery service config option.
154 // (:ref:`core.ApiConfigSource <envoy_api_msg_config.core.v3.ApiConfigSource>`)
155 core.v3.ApiConfigSource hds_config = 14;
156
157 // Optional file system path to search for startup flag files.
158 string flags_path = 5;
159
160 // Optional set of stats sinks.
161 repeated metrics.v3.StatsSink stats_sinks = 6;
162
163 // Configuration for internal processing of stats.
164 metrics.v3.StatsConfig stats_config = 13;
165
166 // Optional duration between flushes to configured stats sinks. For
167 // performance reasons Envoy latches counters and only flushes counters and
168 // gauges at a periodic interval. If not specified the default is 5000ms (5
169 // seconds). Only one of `stats_flush_interval` or `stats_flush_on_admin`
170 // can be set.
171 // Duration must be at least 1ms and at most 5 min.
172 google.protobuf.Duration stats_flush_interval = 7 [
173 (validate.rules).duration = {
174 lt {seconds: 300}
175 gte {nanos: 1000000}
176 },
177 (udpa.annotations.field_migrate).oneof_promotion = "stats_flush"
178 ];
179
180 oneof stats_flush {
181 // Flush stats to sinks only when queried for on the admin interface. If set,
182 // a flush timer is not created. Only one of `stats_flush_on_admin` or
183 // `stats_flush_interval` can be set.
184 bool stats_flush_on_admin = 29 [(validate.rules).bool = {const: true}];
185 }
186
187 // Optional watchdog configuration.
188 // This is for a single watchdog configuration for the entire system.
189 // Deprecated in favor of *watchdogs* which has finer granularity.
190 Watchdog watchdog = 8 [deprecated = true];
191
192 // Optional watchdogs configuration.
193 // This is used for specifying different watchdogs for the different subsystems.
194 Watchdogs watchdogs = 27;
195
196 // Configuration for an external tracing provider.
197 //
198 // .. attention::
199 // This field has been deprecated in favor of :ref:`HttpConnectionManager.Tracing.provider
200 // <envoy_api_field_extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.Tracing.provider>`.
201 trace.v3.Tracing tracing = 9 [deprecated = true];
202
203 // Configuration for the runtime configuration provider. If not
204 // specified, a “null” provider will be used which will result in all defaults
205 // being used.
206 LayeredRuntime layered_runtime = 17;
207
208 // Configuration for the local administration HTTP server.
209 Admin admin = 12;
210
211 // Optional overload manager configuration.
212 overload.v3.OverloadManager overload_manager = 15 [
213 (udpa.annotations.security).configure_for_untrusted_downstream = true,
214 (udpa.annotations.security).configure_for_untrusted_upstream = true
215 ];
216
217 // Enable :ref:`stats for event dispatcher <operations_performance>`, defaults to false.
218 // Note that this records a value for each iteration of the event loop on every thread. This
219 // should normally be minimal overhead, but when using
220 // :ref:`statsd <envoy_api_msg_config.metrics.v3.StatsdSink>`, it will send each observed value
221 // over the wire individually because the statsd protocol doesn't have any way to represent a
222 // histogram summary. Be aware that this can be a very large volume of data.
223 bool enable_dispatcher_stats = 16;
224
225 // Optional string which will be used in lieu of x-envoy in prefixing headers.
226 //
227 // For example, if this string is present and set to X-Foo, then x-envoy-retry-on will be
228 // transformed into x-foo-retry-on etc.
229 //
230 // Note this applies to the headers Envoy will generate, the headers Envoy will sanitize, and the
231 // headers Envoy will trust for core code and core extensions only. Be VERY careful making
232 // changes to this string, especially in multi-layer Envoy deployments or deployments using
233 // extensions which are not upstream.
234 string header_prefix = 18;
235
236 // Optional proxy version which will be used to set the value of :ref:`server.version statistic
237 // <server_statistics>` if specified. Envoy will not process this value, it will be sent as is to
238 // :ref:`stats sinks <envoy_api_msg_config.metrics.v3.StatsSink>`.
239 google.protobuf.UInt64Value stats_server_version_override = 19;
240
241 // Always use TCP queries instead of UDP queries for DNS lookups.
242 // This may be overridden on a per-cluster basis in cds_config,
243 // when :ref:`dns_resolvers <envoy_api_field_config.cluster.v3.Cluster.dns_resolvers>` and
244 // :ref:`use_tcp_for_dns_lookups <envoy_api_field_config.cluster.v3.Cluster.use_tcp_for_dns_lookups>` are
245 // specified.
246 // Setting this value causes failure if the
247 // ``envoy.restart_features.use_apple_api_for_dns_lookups`` runtime value is true during
248 // server startup. Apple' API only uses UDP for DNS resolution.
249 bool use_tcp_for_dns_lookups = 20;
250
251 // Specifies optional bootstrap extensions to be instantiated at startup time.
252 // Each item contains extension specific configuration.
253 repeated core.v3.TypedExtensionConfig bootstrap_extensions = 21;
254
255 // Specifies optional extensions instantiated at startup time and
256 // invoked during crash time on the request that caused the crash.
257 repeated FatalAction fatal_actions = 28;
258
259 // Configuration sources that will participate in
260 // xdstp:// URL authority resolution. The algorithm is as
261 // follows:
262 // 1. The authority field is taken from the xdstp:// URL, call
263 // this *resource_authority*.
264 // 2. *resource_authority* is compared against the authorities in any peer
265 // *ConfigSource*. The peer *ConfigSource* is the configuration source
266 // message which would have been used unconditionally for resolution
267 // with opaque resource names. If there is a match with an authority, the
268 // peer *ConfigSource* message is used.
269 // 3. *resource_authority* is compared sequentially with the authorities in
270 // each configuration source in *config_sources*. The first *ConfigSource*
271 // to match wins.
272 // 4. As a fallback, if no configuration source matches, then
273 // *default_config_source* is used.
274 // 5. If *default_config_source* is not specified, resolution fails.
275 // [#not-implemented-hide:]
276 repeated core.v3.ConfigSource config_sources = 22;
277
278 // Default configuration source for xdstp:// URLs if all
279 // other resolution fails.
280 // [#not-implemented-hide:]
281 core.v3.ConfigSource default_config_source = 23;
282
283 // Optional overriding of default socket interface. The value must be the name of one of the
284 // socket interface factories initialized through a bootstrap extension
285 string default_socket_interface = 24;
286
287 // Global map of CertificateProvider instances. These instances are referred to by name in the
288 // :ref:`CommonTlsContext.CertificateProviderInstance.instance_name
289 // <envoy_api_field_extensions.transport_sockets.tls.v3.CommonTlsContext.CertificateProviderInstance.instance_name>`
290 // field.
291 // [#not-implemented-hide:]
292 map<string, core.v3.TypedExtensionConfig> certificate_provider_instances = 25;
293}
294
295// Administration interface :ref:`operations documentation
296// <operations_admin_interface>`.
297message Admin {
298 option (udpa.annotations.versioning).previous_message_type = "envoy.config.bootstrap.v2.Admin";
299
300 // The path to write the access log for the administration server. If no
301 // access log is desired specify ‘/dev/null’. This is only required if
302 // :ref:`address <envoy_api_field_config.bootstrap.v3.Admin.address>` is set.
303 string access_log_path = 1;
304
305 // The cpu profiler output path for the administration server. If no profile
306 // path is specified, the default is ‘/var/log/envoy/envoy.prof’.
307 string profile_path = 2;
308
309 // The TCP address that the administration server will listen on.
310 // If not specified, Envoy will not start an administration server.
311 core.v3.Address address = 3;
312
313 // Additional socket options that may not be present in Envoy source code or
314 // precompiled binaries.
315 repeated core.v3.SocketOption socket_options = 4;
316}
317
318// Cluster manager :ref:`architecture overview <arch_overview_cluster_manager>`.
319message ClusterManager {
320 option (udpa.annotations.versioning).previous_message_type =
321 "envoy.config.bootstrap.v2.ClusterManager";
322
323 message OutlierDetection {
324 option (udpa.annotations.versioning).previous_message_type =
325 "envoy.config.bootstrap.v2.ClusterManager.OutlierDetection";
326
327 // Specifies the path to the outlier event log.
328 string event_log_path = 1;
329
330 // [#not-implemented-hide:]
331 // The gRPC service for the outlier detection event service.
332 // If empty, outlier detection events won't be sent to a remote endpoint.
333 core.v3.EventServiceConfig event_service = 2;
334 }
335
336 // Name of the local cluster (i.e., the cluster that owns the Envoy running
337 // this configuration). In order to enable :ref:`zone aware routing
338 // <arch_overview_load_balancing_zone_aware_routing>` this option must be set.
339 // If *local_cluster_name* is defined then :ref:`clusters
340 // <envoy_api_msg_config.cluster.v3.Cluster>` must be defined in the :ref:`Bootstrap
341 // static cluster resources
342 // <envoy_api_field_config.bootstrap.v3.Bootstrap.StaticResources.clusters>`. This is unrelated to
343 // the :option:`--service-cluster` option which does not `affect zone aware
344 // routing <https://github.com/envoyproxy/envoy/issues/774>`_.
345 string local_cluster_name = 1;
346
347 // Optional global configuration for outlier detection.
348 OutlierDetection outlier_detection = 2;
349
350 // Optional configuration used to bind newly established upstream connections.
351 // This may be overridden on a per-cluster basis by upstream_bind_config in the cds_config.
352 core.v3.BindConfig upstream_bind_config = 3;
353
354 // A management server endpoint to stream load stats to via
355 // *StreamLoadStats*. This must have :ref:`api_type
356 // <envoy_api_field_config.core.v3.ApiConfigSource.api_type>` :ref:`GRPC
357 // <envoy_api_enum_value_config.core.v3.ApiConfigSource.ApiType.GRPC>`.
358 core.v3.ApiConfigSource load_stats_config = 4;
359}
360
361// Allows you to specify different watchdog configs for different subsystems.
362// This allows finer tuned policies for the watchdog. If a subsystem is omitted
363// the default values for that system will be used.
364message Watchdogs {
365 // Watchdog for the main thread.
366 Watchdog main_thread_watchdog = 1;
367
368 // Watchdog for the worker threads.
369 Watchdog worker_watchdog = 2;
370}
371
372// Envoy process watchdog configuration. When configured, this monitors for
373// nonresponsive threads and kills the process after the configured thresholds.
374// See the :ref:`watchdog documentation <operations_performance_watchdog>` for more information.
375// [#next-free-field: 8]
376message Watchdog {
377 option (udpa.annotations.versioning).previous_message_type = "envoy.config.bootstrap.v2.Watchdog";
378
379 message WatchdogAction {
380 // The events are fired in this order: KILL, MULTIKILL, MEGAMISS, MISS.
381 // Within an event type, actions execute in the order they are configured.
382 // For KILL/MULTIKILL there is a default PANIC that will run after the
383 // registered actions and kills the process if it wasn't already killed.
384 // It might be useful to specify several debug actions, and possibly an
385 // alternate FATAL action.
386 enum WatchdogEvent {
387 UNKNOWN = 0;
388 KILL = 1;
389 MULTIKILL = 2;
390 MEGAMISS = 3;
391 MISS = 4;
392 }
393
394 // Extension specific configuration for the action.
395 core.v3.TypedExtensionConfig config = 1;
396
397 WatchdogEvent event = 2 [(validate.rules).enum = {defined_only: true}];
398 }
399
400 // Register actions that will fire on given WatchDog events.
401 // See *WatchDogAction* for priority of events.
402 repeated WatchdogAction actions = 7;
403
404 // The duration after which Envoy counts a nonresponsive thread in the
405 // *watchdog_miss* statistic. If not specified the default is 200ms.
406 google.protobuf.Duration miss_timeout = 1;
407
408 // The duration after which Envoy counts a nonresponsive thread in the
409 // *watchdog_mega_miss* statistic. If not specified the default is
410 // 1000ms.
411 google.protobuf.Duration megamiss_timeout = 2;
412
413 // If a watched thread has been nonresponsive for this duration, assume a
414 // programming error and kill the entire Envoy process. Set to 0 to disable
415 // kill behavior. If not specified the default is 0 (disabled).
416 google.protobuf.Duration kill_timeout = 3;
417
418 // Defines the maximum jitter used to adjust the *kill_timeout* if *kill_timeout* is
419 // enabled. Enabling this feature would help to reduce risk of synchronized
420 // watchdog kill events across proxies due to external triggers. Set to 0 to
421 // disable. If not specified the default is 0 (disabled).
422 google.protobuf.Duration max_kill_timeout_jitter = 6 [(validate.rules).duration = {gte {}}];
423
424 // If max(2, ceil(registered_threads * Fraction(*multikill_threshold*)))
425 // threads have been nonresponsive for at least this duration kill the entire
426 // Envoy process. Set to 0 to disable this behavior. If not specified the
427 // default is 0 (disabled).
428 google.protobuf.Duration multikill_timeout = 4;
429
430 // Sets the threshold for *multikill_timeout* in terms of the percentage of
431 // nonresponsive threads required for the *multikill_timeout*.
432 // If not specified the default is 0.
433 type.v3.Percent multikill_threshold = 5;
434}
435
436// Fatal actions to run while crashing. Actions can be safe (meaning they are
437// async-signal safe) or unsafe. We run all safe actions before we run unsafe actions.
438// If using an unsafe action that could get stuck or deadlock, it important to
439// have an out of band system to terminate the process.
440//
441// The interface for the extension is ``Envoy::Server::Configuration::FatalAction``.
442// *FatalAction* extensions live in the ``envoy.extensions.fatal_actions`` API
443// namespace.
444message FatalAction {
445 // Extension specific configuration for the action. It's expected to conform
446 // to the ``Envoy::Server::Configuration::FatalAction`` interface.
447 core.v3.TypedExtensionConfig config = 1;
448}
449
450// Runtime :ref:`configuration overview <config_runtime>` (deprecated).
451message Runtime {
452 option (udpa.annotations.versioning).previous_message_type = "envoy.config.bootstrap.v2.Runtime";
453
454 // The implementation assumes that the file system tree is accessed via a
455 // symbolic link. An atomic link swap is used when a new tree should be
456 // switched to. This parameter specifies the path to the symbolic link. Envoy
457 // will watch the location for changes and reload the file system tree when
458 // they happen. If this parameter is not set, there will be no disk based
459 // runtime.
460 string symlink_root = 1;
461
462 // Specifies the subdirectory to load within the root directory. This is
463 // useful if multiple systems share the same delivery mechanism. Envoy
464 // configuration elements can be contained in a dedicated subdirectory.
465 string subdirectory = 2;
466
467 // Specifies an optional subdirectory to load within the root directory. If
468 // specified and the directory exists, configuration values within this
469 // directory will override those found in the primary subdirectory. This is
470 // useful when Envoy is deployed across many different types of servers.
471 // Sometimes it is useful to have a per service cluster directory for runtime
472 // configuration. See below for exactly how the override directory is used.
473 string override_subdirectory = 3;
474
475 // Static base runtime. This will be :ref:`overridden
476 // <config_runtime_layering>` by other runtime layers, e.g.
477 // disk or admin. This follows the :ref:`runtime protobuf JSON representation
478 // encoding <config_runtime_proto_json>`.
479 google.protobuf.Struct base = 4;
480}
481
482// [#next-free-field: 6]
483message RuntimeLayer {
484 option (udpa.annotations.versioning).previous_message_type =
485 "envoy.config.bootstrap.v2.RuntimeLayer";
486
487 // :ref:`Disk runtime <config_runtime_local_disk>` layer.
488 message DiskLayer {
489 option (udpa.annotations.versioning).previous_message_type =
490 "envoy.config.bootstrap.v2.RuntimeLayer.DiskLayer";
491
492 // The implementation assumes that the file system tree is accessed via a
493 // symbolic link. An atomic link swap is used when a new tree should be
494 // switched to. This parameter specifies the path to the symbolic link.
495 // Envoy will watch the location for changes and reload the file system tree
496 // when they happen. See documentation on runtime :ref:`atomicity
497 // <config_runtime_atomicity>` for further details on how reloads are
498 // treated.
499 string symlink_root = 1;
500
501 // Specifies the subdirectory to load within the root directory. This is
502 // useful if multiple systems share the same delivery mechanism. Envoy
503 // configuration elements can be contained in a dedicated subdirectory.
504 string subdirectory = 3;
505
506 // :ref:`Append <config_runtime_local_disk_service_cluster_subdirs>` the
507 // service cluster to the path under symlink root.
508 bool append_service_cluster = 2;
509 }
510
511 // :ref:`Admin console runtime <config_runtime_admin>` layer.
512 message AdminLayer {
513 option (udpa.annotations.versioning).previous_message_type =
514 "envoy.config.bootstrap.v2.RuntimeLayer.AdminLayer";
515 }
516
517 // :ref:`Runtime Discovery Service (RTDS) <config_runtime_rtds>` layer.
518 message RtdsLayer {
519 option (udpa.annotations.versioning).previous_message_type =
520 "envoy.config.bootstrap.v2.RuntimeLayer.RtdsLayer";
521
522 // Resource to subscribe to at *rtds_config* for the RTDS layer.
523 string name = 1;
524
525 // RTDS configuration source.
526 core.v3.ConfigSource rtds_config = 2;
527 }
528
529 // Descriptive name for the runtime layer. This is only used for the runtime
530 // :http:get:`/runtime` output.
531 string name = 1 [(validate.rules).string = {min_len: 1}];
532
533 oneof layer_specifier {
534 option (validate.required) = true;
535
536 // :ref:`Static runtime <config_runtime_bootstrap>` layer.
537 // This follows the :ref:`runtime protobuf JSON representation encoding
538 // <config_runtime_proto_json>`. Unlike static xDS resources, this static
539 // layer is overridable by later layers in the runtime virtual filesystem.
540 google.protobuf.Struct static_layer = 2;
541
542 DiskLayer disk_layer = 3;
543
544 AdminLayer admin_layer = 4;
545
546 RtdsLayer rtds_layer = 5;
547 }
548}
549
550// Runtime :ref:`configuration overview <config_runtime>`.
551message LayeredRuntime {
552 option (udpa.annotations.versioning).previous_message_type =
553 "envoy.config.bootstrap.v2.LayeredRuntime";
554
555 // The :ref:`layers <config_runtime_layering>` of the runtime. This is ordered
556 // such that later layers in the list overlay earlier entries.
557 repeated RuntimeLayer layers = 1;
558}
View as plain text