Skip to content

Commit 956ec8b

Browse files
committed
Add "smart" preferred address types
1 parent e3deebb commit 956ec8b

File tree

1 file changed

+38
-4
lines changed

1 file changed

+38
-4
lines changed

crates/stackable-operator/src/commons/listener.rs

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

7577
impl 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")]
202210
pub 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

Comments
 (0)