@@ -65,20 +65,27 @@ pub struct ListenerClassSpec {
6565 pub service_external_traffic_policy : KubernetesTrafficPolicy ,
6666
6767 /// Whether addresses should prefer using the IP address (`IP`) or the hostname (`Hostname`).
68+ /// Can also be set to `HostnameConservative`, which will use `IP` for `NodePort` service types, but `Hostname` for everything else.
6869 ///
6970 /// The other type will be used if the preferred type is not available.
70- /// By default `Hostname` is used.
71+ ///
72+ /// Defaults to `HostnameConservative`.
7173 #[ serde( default = "ListenerClassSpec::default_preferred_address_type" ) ]
72- pub preferred_address_type : AddressType ,
74+ pub preferred_address_type : PreferredAddressType ,
7375}
7476
7577impl ListenerClassSpec {
7678 const fn default_service_external_traffic_policy ( ) -> KubernetesTrafficPolicy {
7779 KubernetesTrafficPolicy :: Local
7880 }
7981
80- const fn default_preferred_address_type ( ) -> AddressType {
81- AddressType :: Hostname
82+ const fn default_preferred_address_type ( ) -> PreferredAddressType {
83+ PreferredAddressType :: HostnameConservative
84+ }
85+
86+ /// Resolves [`Self::preferred_address_type`]'s "smart" modes depending on the rest of `self`.
87+ pub fn resolve_preferred_address_type ( & self ) -> AddressType {
88+ self . preferred_address_type . resolve ( self )
8289 }
8390}
8491
@@ -197,14 +204,41 @@ pub struct ListenerIngress {
197204 pub ports : BTreeMap < String , i32 > ,
198205}
199206
207+ /// The type of a given address.
200208#[ derive( Serialize , Deserialize , Clone , Copy , Debug , JsonSchema , PartialEq , Eq ) ]
201209#[ serde( rename_all = "PascalCase" ) ]
202210pub enum AddressType {
211+ /// A resolvable DNS hostname.
203212 Hostname ,
213+ /// A resolved IP address.
204214 #[ serde( rename = "IP" ) ]
205215 Ip ,
206216}
207217
218+ /// A mode for deciding the preferred [`AddressType`].
219+ ///
220+ /// These can vary depending on the rest of the [`ListenerClass`].
221+ #[ derive( Serialize , Deserialize , Clone , Copy , Debug , JsonSchema , PartialEq , Eq ) ]
222+ #[ serde( rename_all = "PascalCase" ) ]
223+ pub enum PreferredAddressType {
224+ /// Like [`AddressType::Hostname`], but prefers [`AddressType::Ip`] for [`ServiceType::NodePort`], since their hostnames are less likely to be resolvable.
225+ HostnameConservative ,
226+ #[ serde( untagged) ]
227+ AddressType ( AddressType ) ,
228+ }
229+
230+ impl PreferredAddressType {
231+ pub fn resolve ( self , listener_class : & ListenerClassSpec ) -> AddressType {
232+ match self {
233+ PreferredAddressType :: AddressType ( tpe) => tpe,
234+ PreferredAddressType :: HostnameConservative => match listener_class. service_type {
235+ ServiceType :: NodePort => AddressType :: Ip ,
236+ _ => AddressType :: Hostname ,
237+ } ,
238+ }
239+ }
240+ }
241+
208242/// Informs users about Listeners that are bound by a given Pod.
209243///
210244/// This is not expected to be created or modified by users. It will be created by
0 commit comments