gateway_api/apis/experimental/
tlsroutes.rs

1// WARNING: generated by kopium - manual changes will be overwritten
2// kopium command: kopium --schema=derived --derive=JsonSchema --derive=Default --derive=PartialEq --docs -f -
3// kopium version: 0.21.2
4
5#[allow(unused_imports)]
6mod prelude {
7    pub use k8s_openapi::apimachinery::pkg::apis::meta::v1::Condition;
8    pub use kube::CustomResource;
9    pub use schemars::JsonSchema;
10    pub use serde::{Deserialize, Serialize};
11}
12use self::prelude::*;
13
14/// Spec defines the desired state of TLSRoute.
15#[derive(CustomResource, Serialize, Deserialize, Clone, Debug, JsonSchema, Default, PartialEq)]
16#[kube(
17    group = "gateway.networking.k8s.io",
18    version = "v1alpha2",
19    kind = "TLSRoute",
20    plural = "tlsroutes"
21)]
22#[kube(namespaced)]
23#[kube(status = "TLSRouteStatus")]
24#[kube(derive = "Default")]
25#[kube(derive = "PartialEq")]
26pub struct TLSRouteSpec {
27    /// Hostnames defines a set of SNI names that should match against the
28    /// SNI attribute of TLS ClientHello message in TLS handshake. This matches
29    /// the RFC 1123 definition of a hostname with 2 notable exceptions:
30    ///
31    /// 1. IPs are not allowed in SNI names per RFC 6066.
32    /// 2. A hostname may be prefixed with a wildcard label (`*.`). The wildcard
33    ///    label must appear by itself as the first label.
34    ///
35    /// If a hostname is specified by both the Listener and TLSRoute, there
36    /// must be at least one intersecting hostname for the TLSRoute to be
37    /// attached to the Listener. For example:
38    ///
39    /// * A Listener with `test.example.com` as the hostname matches TLSRoutes
40    ///   that have either not specified any hostnames, or have specified at
41    ///   least one of `test.example.com` or `*.example.com`.
42    /// * A Listener with `*.example.com` as the hostname matches TLSRoutes
43    ///   that have either not specified any hostnames or have specified at least
44    ///   one hostname that matches the Listener hostname. For example,
45    ///   `test.example.com` and `*.example.com` would both match. On the other
46    ///   hand, `example.com` and `test.example.net` would not match.
47    ///
48    /// If both the Listener and TLSRoute have specified hostnames, any
49    /// TLSRoute hostnames that do not match the Listener hostname MUST be
50    /// ignored. For example, if a Listener specified `*.example.com`, and the
51    /// TLSRoute specified `test.example.com` and `test.example.net`,
52    /// `test.example.net` must not be considered for a match.
53    ///
54    /// If both the Listener and TLSRoute have specified hostnames, and none
55    /// match with the criteria above, then the TLSRoute is not accepted. The
56    /// implementation must raise an 'Accepted' Condition with a status of
57    /// `False` in the corresponding RouteParentStatus.
58    ///
59    /// Support: Core
60    #[serde(default, skip_serializing_if = "Option::is_none")]
61    pub hostnames: Option<Vec<String>>,
62    /// ParentRefs references the resources (usually Gateways) that a Route wants
63    /// to be attached to. Note that the referenced parent resource needs to
64    /// allow this for the attachment to be complete. For Gateways, that means
65    /// the Gateway needs to allow attachment from Routes of this kind and
66    /// namespace. For Services, that means the Service must either be in the same
67    /// namespace for a "producer" route, or the mesh implementation must support
68    /// and allow "consumer" routes for the referenced Service. ReferenceGrant is
69    /// not applicable for governing ParentRefs to Services - it is not possible to
70    /// create a "producer" route for a Service in a different namespace from the
71    /// Route.
72    ///
73    /// There are two kinds of parent resources with "Core" support:
74    ///
75    /// * Gateway (Gateway conformance profile)
76    /// * Service (Mesh conformance profile, ClusterIP Services only)
77    ///
78    /// This API may be extended in the future to support additional kinds of parent
79    /// resources.
80    ///
81    /// ParentRefs must be _distinct_. This means either that:
82    ///
83    /// * They select different objects.  If this is the case, then parentRef
84    ///   entries are distinct. In terms of fields, this means that the
85    ///   multi-part key defined by `group`, `kind`, `namespace`, and `name` must
86    ///   be unique across all parentRef entries in the Route.
87    /// * They do not select different objects, but for each optional field used,
88    ///   each ParentRef that selects the same object must set the same set of
89    ///   optional fields to different values. If one ParentRef sets a
90    ///   combination of optional fields, all must set the same combination.
91    ///
92    /// Some examples:
93    ///
94    /// * If one ParentRef sets `sectionName`, all ParentRefs referencing the
95    ///   same object must also set `sectionName`.
96    /// * If one ParentRef sets `port`, all ParentRefs referencing the same
97    ///   object must also set `port`.
98    /// * If one ParentRef sets `sectionName` and `port`, all ParentRefs
99    ///   referencing the same object must also set `sectionName` and `port`.
100    ///
101    /// It is possible to separately reference multiple distinct objects that may
102    /// be collapsed by an implementation. For example, some implementations may
103    /// choose to merge compatible Gateway Listeners together. If that is the
104    /// case, the list of routes attached to those resources should also be
105    /// merged.
106    ///
107    /// Note that for ParentRefs that cross namespace boundaries, there are specific
108    /// rules. Cross-namespace references are only valid if they are explicitly
109    /// allowed by something in the namespace they are referring to. For example,
110    /// Gateway has the AllowedRoutes field, and ReferenceGrant provides a
111    /// generic way to enable other kinds of cross-namespace reference.
112    ///
113    ///
114    /// ParentRefs from a Route to a Service in the same namespace are "producer"
115    /// routes, which apply default routing rules to inbound connections from
116    /// any namespace to the Service.
117    ///
118    /// ParentRefs from a Route to a Service in a different namespace are
119    /// "consumer" routes, and these routing rules are only applied to outbound
120    /// connections originating from the same namespace as the Route, for which
121    /// the intended destination of the connections are a Service targeted as a
122    /// ParentRef of the Route.
123    ///
124    ///
125    ///
126    ///
127    ///
128    ///
129    #[serde(
130        default,
131        skip_serializing_if = "Option::is_none",
132        rename = "parentRefs"
133    )]
134    pub parent_refs: Option<Vec<TLSRouteParentRefs>>,
135    /// Rules are a list of TLS matchers and actions.
136    ///
137    ///
138    pub rules: Vec<TLSRouteRules>,
139}
140
141/// ParentReference identifies an API object (usually a Gateway) that can be considered
142/// a parent of this resource (usually a route). There are two kinds of parent resources
143/// with "Core" support:
144///
145/// * Gateway (Gateway conformance profile)
146/// * Service (Mesh conformance profile, ClusterIP Services only)
147///
148/// This API may be extended in the future to support additional kinds of parent
149/// resources.
150///
151/// The API object must be valid in the cluster; the Group and Kind must
152/// be registered in the cluster for this reference to be valid.
153#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, Default, PartialEq)]
154pub struct TLSRouteParentRefs {
155    /// Group is the group of the referent.
156    /// When unspecified, "gateway.networking.k8s.io" is inferred.
157    /// To set the core API group (such as for a "Service" kind referent),
158    /// Group must be explicitly set to "" (empty string).
159    ///
160    /// Support: Core
161    #[serde(default, skip_serializing_if = "Option::is_none")]
162    pub group: Option<String>,
163    /// Kind is kind of the referent.
164    ///
165    /// There are two kinds of parent resources with "Core" support:
166    ///
167    /// * Gateway (Gateway conformance profile)
168    /// * Service (Mesh conformance profile, ClusterIP Services only)
169    ///
170    /// Support for other resources is Implementation-Specific.
171    #[serde(default, skip_serializing_if = "Option::is_none")]
172    pub kind: Option<String>,
173    /// Name is the name of the referent.
174    ///
175    /// Support: Core
176    pub name: String,
177    /// Namespace is the namespace of the referent. When unspecified, this refers
178    /// to the local namespace of the Route.
179    ///
180    /// Note that there are specific rules for ParentRefs which cross namespace
181    /// boundaries. Cross-namespace references are only valid if they are explicitly
182    /// allowed by something in the namespace they are referring to. For example:
183    /// Gateway has the AllowedRoutes field, and ReferenceGrant provides a
184    /// generic way to enable any other kind of cross-namespace reference.
185    ///
186    ///
187    /// ParentRefs from a Route to a Service in the same namespace are "producer"
188    /// routes, which apply default routing rules to inbound connections from
189    /// any namespace to the Service.
190    ///
191    /// ParentRefs from a Route to a Service in a different namespace are
192    /// "consumer" routes, and these routing rules are only applied to outbound
193    /// connections originating from the same namespace as the Route, for which
194    /// the intended destination of the connections are a Service targeted as a
195    /// ParentRef of the Route.
196    ///
197    ///
198    /// Support: Core
199    #[serde(default, skip_serializing_if = "Option::is_none")]
200    pub namespace: Option<String>,
201    /// Port is the network port this Route targets. It can be interpreted
202    /// differently based on the type of parent resource.
203    ///
204    /// When the parent resource is a Gateway, this targets all listeners
205    /// listening on the specified port that also support this kind of Route(and
206    /// select this Route). It's not recommended to set `Port` unless the
207    /// networking behaviors specified in a Route must apply to a specific port
208    /// as opposed to a listener(s) whose port(s) may be changed. When both Port
209    /// and SectionName are specified, the name and port of the selected listener
210    /// must match both specified values.
211    ///
212    ///
213    /// When the parent resource is a Service, this targets a specific port in the
214    /// Service spec. When both Port (experimental) and SectionName are specified,
215    /// the name and port of the selected port must match both specified values.
216    ///
217    ///
218    /// Implementations MAY choose to support other parent resources.
219    /// Implementations supporting other types of parent resources MUST clearly
220    /// document how/if Port is interpreted.
221    ///
222    /// For the purpose of status, an attachment is considered successful as
223    /// long as the parent resource accepts it partially. For example, Gateway
224    /// listeners can restrict which Routes can attach to them by Route kind,
225    /// namespace, or hostname. If 1 of 2 Gateway listeners accept attachment
226    /// from the referencing Route, the Route MUST be considered successfully
227    /// attached. If no Gateway listeners accept attachment from this Route,
228    /// the Route MUST be considered detached from the Gateway.
229    ///
230    /// Support: Extended
231    #[serde(default, skip_serializing_if = "Option::is_none")]
232    pub port: Option<i32>,
233    /// SectionName is the name of a section within the target resource. In the
234    /// following resources, SectionName is interpreted as the following:
235    ///
236    /// * Gateway: Listener name. When both Port (experimental) and SectionName
237    /// are specified, the name and port of the selected listener must match
238    /// both specified values.
239    /// * Service: Port name. When both Port (experimental) and SectionName
240    /// are specified, the name and port of the selected listener must match
241    /// both specified values.
242    ///
243    /// Implementations MAY choose to support attaching Routes to other resources.
244    /// If that is the case, they MUST clearly document how SectionName is
245    /// interpreted.
246    ///
247    /// When unspecified (empty string), this will reference the entire resource.
248    /// For the purpose of status, an attachment is considered successful if at
249    /// least one section in the parent resource accepts it. For example, Gateway
250    /// listeners can restrict which Routes can attach to them by Route kind,
251    /// namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from
252    /// the referencing Route, the Route MUST be considered successfully
253    /// attached. If no Gateway listeners accept attachment from this Route, the
254    /// Route MUST be considered detached from the Gateway.
255    ///
256    /// Support: Core
257    #[serde(
258        default,
259        skip_serializing_if = "Option::is_none",
260        rename = "sectionName"
261    )]
262    pub section_name: Option<String>,
263}
264
265/// TLSRouteRule is the configuration for a given rule.
266#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, Default, PartialEq)]
267pub struct TLSRouteRules {
268    /// BackendRefs defines the backend(s) where matching requests should be
269    /// sent. If unspecified or invalid (refers to a non-existent resource or
270    /// a Service with no endpoints), the rule performs no forwarding; if no
271    /// filters are specified that would result in a response being sent, the
272    /// underlying implementation must actively reject request attempts to this
273    /// backend, by rejecting the connection or returning a 500 status code.
274    /// Request rejections must respect weight; if an invalid backend is
275    /// requested to have 80% of requests, then 80% of requests must be rejected
276    /// instead.
277    ///
278    /// Support: Core for Kubernetes Service
279    ///
280    /// Support: Extended for Kubernetes ServiceImport
281    ///
282    /// Support: Implementation-specific for any other resource
283    ///
284    /// Support for weight: Extended
285    #[serde(
286        default,
287        skip_serializing_if = "Option::is_none",
288        rename = "backendRefs"
289    )]
290    pub backend_refs: Option<Vec<TLSRouteRulesBackendRefs>>,
291    /// Name is the name of the route rule. This name MUST be unique within a Route if it is set.
292    ///
293    /// Support: Extended
294    #[serde(default, skip_serializing_if = "Option::is_none")]
295    pub name: Option<String>,
296}
297
298/// BackendRef defines how a Route should forward a request to a Kubernetes
299/// resource.
300///
301/// Note that when a namespace different than the local namespace is specified, a
302/// ReferenceGrant object is required in the referent namespace to allow that
303/// namespace's owner to accept the reference. See the ReferenceGrant
304/// documentation for details.
305///
306/// <gateway:experimental:description>
307///
308/// When the BackendRef points to a Kubernetes Service, implementations SHOULD
309/// honor the appProtocol field if it is set for the target Service Port.
310///
311/// Implementations supporting appProtocol SHOULD recognize the Kubernetes
312/// Standard Application Protocols defined in KEP-3726.
313///
314/// If a Service appProtocol isn't specified, an implementation MAY infer the
315/// backend protocol through its own means. Implementations MAY infer the
316/// protocol from the Route type referring to the backend Service.
317///
318/// If a Route is not able to send traffic to the backend using the specified
319/// protocol then the backend is considered invalid. Implementations MUST set the
320/// "ResolvedRefs" condition to "False" with the "UnsupportedProtocol" reason.
321///
322/// </gateway:experimental:description>
323///
324/// Note that when the BackendTLSPolicy object is enabled by the implementation,
325/// there are some extra rules about validity to consider here. See the fields
326/// where this struct is used for more information about the exact behavior.
327#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, Default, PartialEq)]
328pub struct TLSRouteRulesBackendRefs {
329    /// Group is the group of the referent. For example, "gateway.networking.k8s.io".
330    /// When unspecified or empty string, core API group is inferred.
331    #[serde(default, skip_serializing_if = "Option::is_none")]
332    pub group: Option<String>,
333    /// Kind is the Kubernetes resource kind of the referent. For example
334    /// "Service".
335    ///
336    /// Defaults to "Service" when not specified.
337    ///
338    /// ExternalName services can refer to CNAME DNS records that may live
339    /// outside of the cluster and as such are difficult to reason about in
340    /// terms of conformance. They also may not be safe to forward to (see
341    /// CVE-2021-25740 for more information). Implementations SHOULD NOT
342    /// support ExternalName Services.
343    ///
344    /// Support: Core (Services with a type other than ExternalName)
345    ///
346    /// Support: Implementation-specific (Services with type ExternalName)
347    #[serde(default, skip_serializing_if = "Option::is_none")]
348    pub kind: Option<String>,
349    /// Name is the name of the referent.
350    pub name: String,
351    /// Namespace is the namespace of the backend. When unspecified, the local
352    /// namespace is inferred.
353    ///
354    /// Note that when a namespace different than the local namespace is specified,
355    /// a ReferenceGrant object is required in the referent namespace to allow that
356    /// namespace's owner to accept the reference. See the ReferenceGrant
357    /// documentation for details.
358    ///
359    /// Support: Core
360    #[serde(default, skip_serializing_if = "Option::is_none")]
361    pub namespace: Option<String>,
362    /// Port specifies the destination port number to use for this resource.
363    /// Port is required when the referent is a Kubernetes Service. In this
364    /// case, the port number is the service port number, not the target port.
365    /// For other resources, destination port might be derived from the referent
366    /// resource or this field.
367    #[serde(default, skip_serializing_if = "Option::is_none")]
368    pub port: Option<i32>,
369    /// Weight specifies the proportion of requests forwarded to the referenced
370    /// backend. This is computed as weight/(sum of all weights in this
371    /// BackendRefs list). For non-zero values, there may be some epsilon from
372    /// the exact proportion defined here depending on the precision an
373    /// implementation supports. Weight is not a percentage and the sum of
374    /// weights does not need to equal 100.
375    ///
376    /// If only one backend is specified and it has a weight greater than 0, 100%
377    /// of the traffic is forwarded to that backend. If weight is set to 0, no
378    /// traffic should be forwarded for this entry. If unspecified, weight
379    /// defaults to 1.
380    ///
381    /// Support for this field varies based on the context where used.
382    #[serde(default, skip_serializing_if = "Option::is_none")]
383    pub weight: Option<i32>,
384}
385
386/// Status defines the current state of TLSRoute.
387#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, Default, PartialEq)]
388pub struct TLSRouteStatus {
389    /// Parents is a list of parent resources (usually Gateways) that are
390    /// associated with the route, and the status of the route with respect to
391    /// each parent. When this route attaches to a parent, the controller that
392    /// manages the parent must add an entry to this list when the controller
393    /// first sees the route and should update the entry as appropriate when the
394    /// route or gateway is modified.
395    ///
396    /// Note that parent references that cannot be resolved by an implementation
397    /// of this API will not be added to this list. Implementations of this API
398    /// can only populate Route status for the Gateways/parent resources they are
399    /// responsible for.
400    ///
401    /// A maximum of 32 Gateways will be represented in this list. An empty list
402    /// means the route has not been attached to any Gateway.
403    pub parents: Vec<TLSRouteStatusParents>,
404}
405
406/// RouteParentStatus describes the status of a route with respect to an
407/// associated Parent.
408#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, Default, PartialEq)]
409pub struct TLSRouteStatusParents {
410    /// Conditions describes the status of the route with respect to the Gateway.
411    /// Note that the route's availability is also subject to the Gateway's own
412    /// status conditions and listener status.
413    ///
414    /// If the Route's ParentRef specifies an existing Gateway that supports
415    /// Routes of this kind AND that Gateway's controller has sufficient access,
416    /// then that Gateway's controller MUST set the "Accepted" condition on the
417    /// Route, to indicate whether the route has been accepted or rejected by the
418    /// Gateway, and why.
419    ///
420    /// A Route MUST be considered "Accepted" if at least one of the Route's
421    /// rules is implemented by the Gateway.
422    ///
423    /// There are a number of cases where the "Accepted" condition may not be set
424    /// due to lack of controller visibility, that includes when:
425    ///
426    /// * The Route refers to a non-existent parent.
427    /// * The Route is of a type that the controller does not support.
428    /// * The Route is in a namespace the controller does not have access to.
429    #[serde(default, skip_serializing_if = "Option::is_none")]
430    pub conditions: Option<Vec<Condition>>,
431    /// ControllerName is a domain/path string that indicates the name of the
432    /// controller that wrote this status. This corresponds with the
433    /// controllerName field on GatewayClass.
434    ///
435    /// Example: "example.net/gateway-controller".
436    ///
437    /// The format of this field is DOMAIN "/" PATH, where DOMAIN and PATH are
438    /// valid Kubernetes names
439    /// (https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names).
440    ///
441    /// Controllers MUST populate this field when writing status. Controllers should ensure that
442    /// entries to status populated with their ControllerName are cleaned up when they are no
443    /// longer necessary.
444    #[serde(rename = "controllerName")]
445    pub controller_name: String,
446    /// ParentRef corresponds with a ParentRef in the spec that this
447    /// RouteParentStatus struct describes the status of.
448    #[serde(rename = "parentRef")]
449    pub parent_ref: TLSRouteStatusParentsParentRef,
450}
451
452/// ParentRef corresponds with a ParentRef in the spec that this
453/// RouteParentStatus struct describes the status of.
454#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema, Default, PartialEq)]
455pub struct TLSRouteStatusParentsParentRef {
456    /// Group is the group of the referent.
457    /// When unspecified, "gateway.networking.k8s.io" is inferred.
458    /// To set the core API group (such as for a "Service" kind referent),
459    /// Group must be explicitly set to "" (empty string).
460    ///
461    /// Support: Core
462    #[serde(default, skip_serializing_if = "Option::is_none")]
463    pub group: Option<String>,
464    /// Kind is kind of the referent.
465    ///
466    /// There are two kinds of parent resources with "Core" support:
467    ///
468    /// * Gateway (Gateway conformance profile)
469    /// * Service (Mesh conformance profile, ClusterIP Services only)
470    ///
471    /// Support for other resources is Implementation-Specific.
472    #[serde(default, skip_serializing_if = "Option::is_none")]
473    pub kind: Option<String>,
474    /// Name is the name of the referent.
475    ///
476    /// Support: Core
477    pub name: String,
478    /// Namespace is the namespace of the referent. When unspecified, this refers
479    /// to the local namespace of the Route.
480    ///
481    /// Note that there are specific rules for ParentRefs which cross namespace
482    /// boundaries. Cross-namespace references are only valid if they are explicitly
483    /// allowed by something in the namespace they are referring to. For example:
484    /// Gateway has the AllowedRoutes field, and ReferenceGrant provides a
485    /// generic way to enable any other kind of cross-namespace reference.
486    ///
487    ///
488    /// ParentRefs from a Route to a Service in the same namespace are "producer"
489    /// routes, which apply default routing rules to inbound connections from
490    /// any namespace to the Service.
491    ///
492    /// ParentRefs from a Route to a Service in a different namespace are
493    /// "consumer" routes, and these routing rules are only applied to outbound
494    /// connections originating from the same namespace as the Route, for which
495    /// the intended destination of the connections are a Service targeted as a
496    /// ParentRef of the Route.
497    ///
498    ///
499    /// Support: Core
500    #[serde(default, skip_serializing_if = "Option::is_none")]
501    pub namespace: Option<String>,
502    /// Port is the network port this Route targets. It can be interpreted
503    /// differently based on the type of parent resource.
504    ///
505    /// When the parent resource is a Gateway, this targets all listeners
506    /// listening on the specified port that also support this kind of Route(and
507    /// select this Route). It's not recommended to set `Port` unless the
508    /// networking behaviors specified in a Route must apply to a specific port
509    /// as opposed to a listener(s) whose port(s) may be changed. When both Port
510    /// and SectionName are specified, the name and port of the selected listener
511    /// must match both specified values.
512    ///
513    ///
514    /// When the parent resource is a Service, this targets a specific port in the
515    /// Service spec. When both Port (experimental) and SectionName are specified,
516    /// the name and port of the selected port must match both specified values.
517    ///
518    ///
519    /// Implementations MAY choose to support other parent resources.
520    /// Implementations supporting other types of parent resources MUST clearly
521    /// document how/if Port is interpreted.
522    ///
523    /// For the purpose of status, an attachment is considered successful as
524    /// long as the parent resource accepts it partially. For example, Gateway
525    /// listeners can restrict which Routes can attach to them by Route kind,
526    /// namespace, or hostname. If 1 of 2 Gateway listeners accept attachment
527    /// from the referencing Route, the Route MUST be considered successfully
528    /// attached. If no Gateway listeners accept attachment from this Route,
529    /// the Route MUST be considered detached from the Gateway.
530    ///
531    /// Support: Extended
532    #[serde(default, skip_serializing_if = "Option::is_none")]
533    pub port: Option<i32>,
534    /// SectionName is the name of a section within the target resource. In the
535    /// following resources, SectionName is interpreted as the following:
536    ///
537    /// * Gateway: Listener name. When both Port (experimental) and SectionName
538    /// are specified, the name and port of the selected listener must match
539    /// both specified values.
540    /// * Service: Port name. When both Port (experimental) and SectionName
541    /// are specified, the name and port of the selected listener must match
542    /// both specified values.
543    ///
544    /// Implementations MAY choose to support attaching Routes to other resources.
545    /// If that is the case, they MUST clearly document how SectionName is
546    /// interpreted.
547    ///
548    /// When unspecified (empty string), this will reference the entire resource.
549    /// For the purpose of status, an attachment is considered successful if at
550    /// least one section in the parent resource accepts it. For example, Gateway
551    /// listeners can restrict which Routes can attach to them by Route kind,
552    /// namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from
553    /// the referencing Route, the Route MUST be considered successfully
554    /// attached. If no Gateway listeners accept attachment from this Route, the
555    /// Route MUST be considered detached from the Gateway.
556    ///
557    /// Support: Core
558    #[serde(
559        default,
560        skip_serializing_if = "Option::is_none",
561        rename = "sectionName"
562    )]
563    pub section_name: Option<String>,
564}