Skip to content

Commit 3b4c662

Browse files
committed
refactor: append trailing dot only to cluster domain
1 parent e286c12 commit 3b4c662

File tree

4 files changed

+30
-34
lines changed

4 files changed

+30
-34
lines changed

crates/stackable-operator/src/commons/authentication/oidc.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ mod test {
323323

324324
assert_eq!(
325325
oidc.endpoint_url().unwrap().as_str(),
326-
"http://my.keycloak.server.:12345/my-root-path"
326+
"http://my.keycloak.server:12345/my-root-path"
327327
);
328328
}
329329

@@ -345,7 +345,7 @@ mod test {
345345

346346
assert_eq!(
347347
oidc.endpoint_url().unwrap().as_str(),
348-
"https://my.keycloak.server./"
348+
"https://my.keycloak.server/"
349349
);
350350
}
351351

@@ -369,13 +369,13 @@ mod test {
369369
}
370370

371371
#[rstest]
372-
#[case("/", "http://my.keycloak.server.:1234/")]
373-
#[case("/realms/sdp", "http://my.keycloak.server.:1234/realms/sdp")]
374-
#[case("/realms/sdp/", "http://my.keycloak.server.:1234/realms/sdp")]
375-
#[case("/realms/sdp//////", "http://my.keycloak.server.:1234/realms/sdp")]
372+
#[case("/", "http://my.keycloak.server:1234/")]
373+
#[case("/realms/sdp", "http://my.keycloak.server:1234/realms/sdp")]
374+
#[case("/realms/sdp/", "http://my.keycloak.server:1234/realms/sdp")]
375+
#[case("/realms/sdp//////", "http://my.keycloak.server:1234/realms/sdp")]
376376
#[case(
377377
"/realms/my/realm/with/slashes//////",
378-
"http://my.keycloak.server.:1234/realms/my/realm/with/slashes"
378+
"http://my.keycloak.server:1234/realms/my/realm/with/slashes"
379379
)]
380380
fn root_path_endpoint_url(#[case] root_path: String, #[case] expected_endpoint_url: &str) {
381381
let oidc = serde_yaml::from_str::<AuthenticationProvider>(&format!(
@@ -393,22 +393,22 @@ mod test {
393393
}
394394

395395
#[rstest]
396-
#[case("/", "https://my.keycloak.server./.well-known/openid-configuration")]
396+
#[case("/", "https://my.keycloak.server/.well-known/openid-configuration")]
397397
#[case(
398398
"/realms/sdp",
399-
"https://my.keycloak.server./realms/sdp/.well-known/openid-configuration"
399+
"https://my.keycloak.server/realms/sdp/.well-known/openid-configuration"
400400
)]
401401
#[case(
402402
"/realms/sdp/",
403-
"https://my.keycloak.server./realms/sdp/.well-known/openid-configuration"
403+
"https://my.keycloak.server/realms/sdp/.well-known/openid-configuration"
404404
)]
405405
#[case(
406406
"/realms/sdp//////",
407-
"https://my.keycloak.server./realms/sdp/.well-known/openid-configuration"
407+
"https://my.keycloak.server/realms/sdp/.well-known/openid-configuration"
408408
)]
409409
#[case(
410410
"/realms/my/realm/with/slashes//////",
411-
"https://my.keycloak.server./realms/my/realm/with/slashes/.well-known/openid-configuration"
411+
"https://my.keycloak.server/realms/my/realm/with/slashes/.well-known/openid-configuration"
412412
)]
413413
fn root_path_well_known_url(#[case] root_path: String, #[case] expected_well_known_url: &str) {
414414
let oidc = serde_yaml::from_str::<AuthenticationProvider>(&format!(

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

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,8 @@ impl FromStr for DomainName {
1818

1919
fn from_str(value: &str) -> Result<Self, Self::Err> {
2020
// Remove optional trailing dot before validation, logic taken from https://github.com/kubernetes/kubernetes/blob/30de989fb57fb5921a7ae3e3203cf7ecac9cf3f0/staging/src/k8s.io/apimachinery/pkg/util/validation/validation.go#L100
21-
let value = value.strip_suffix('.').unwrap_or(value);
22-
validation::is_rfc_1123_subdomain(value)?;
23-
// Append trailing dot to make the domain name a FQDN to improve DNS lookup performance, see https://github.com/stackabletech/issues/issues/656
24-
Ok(DomainName(format!("{}.", value)))
21+
validation::is_rfc_1123_subdomain(value.strip_suffix('.').unwrap_or(value))?;
22+
Ok(DomainName(value.to_owned()))
2523
}
2624
}
2725

@@ -185,22 +183,17 @@ mod tests {
185183
use rstest::rstest;
186184

187185
#[rstest]
188-
#[case("foo", "foo.")]
189-
#[case("foo.", "foo.")]
190-
#[case("foo.bar", "foo.bar.")]
191-
#[case("foo.bar.", "foo.bar.")]
192-
fn test_domain_name_and_host_name_parsing_success(
193-
#[case] domain_name: String,
194-
#[case] expected_domain_name: &str,
195-
) {
186+
#[case("foo")]
187+
#[case("foo.bar")]
188+
fn test_domain_name_and_host_name_parsing_success(#[case] domain_name: String) {
196189
let parsed_domain_name: DomainName =
197190
domain_name.parse().expect("domain name can not be parsed");
198191
// Every domain name is also a valid host name
199192
let parsed_host_name: HostName = domain_name.parse().expect("host name can not be parsed");
200193

201194
// Also test the round-trip
202-
assert_eq!(parsed_domain_name.to_string(), expected_domain_name);
203-
assert_eq!(parsed_host_name.to_string(), expected_domain_name);
195+
assert_eq!(parsed_domain_name.to_string(), domain_name);
196+
assert_eq!(parsed_host_name.to_string(), domain_name);
204197
}
205198

206199
#[rstest]
@@ -214,8 +207,8 @@ mod tests {
214207
}
215208

216209
#[rstest]
217-
#[case("foo.", "foo.")]
218-
#[case("foo.bar.", "foo.bar.")]
210+
#[case("foo", "foo")]
211+
#[case("foo.bar", "foo.bar")]
219212
#[case("1.2.3.4", "1.2.3.4")]
220213
#[case("fe80::1", "[fe80::1]")]
221214
fn test_host_name_parsing_success(#[case] host: &str, #[case] expected_url_host: &str) {

crates/stackable-operator/src/commons/s3/helpers.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ mod tests {
204204
};
205205
let (volumes, mounts) = s3.volumes_and_mounts().unwrap();
206206

207-
assert_eq!(s3.endpoint().unwrap(), Url::parse("http://minio.").unwrap());
207+
assert_eq!(s3.endpoint().unwrap(), Url::parse("http://minio").unwrap());
208208
assert_eq!(volumes, vec![]);
209209
assert_eq!(mounts, vec![]);
210210
}
@@ -231,7 +231,7 @@ mod tests {
231231

232232
assert_eq!(
233233
s3.endpoint().unwrap(),
234-
Url::parse("https://s3-eu-central-2.ionoscloud.com.").unwrap()
234+
Url::parse("https://s3-eu-central-2.ionoscloud.com").unwrap()
235235
);
236236
assert_eq!(volumes.len(), 1);
237237
let volume = volumes.remove(0);
@@ -283,7 +283,7 @@ mod tests {
283283

284284
assert_eq!(
285285
s3.endpoint().unwrap(),
286-
Url::parse("https://minio.:1234").unwrap()
286+
Url::parse("https://minio:1234").unwrap()
287287
);
288288
assert_eq!(volumes, vec![]);
289289
assert_eq!(mounts, vec![]);

crates/stackable-operator/src/utils/cluster_info.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::str::FromStr;
22

33
use crate::commons::networking::DomainName;
44

5-
const KUBERNETES_CLUSTER_DOMAIN_DEFAULT: &str = "cluster.local";
5+
const KUBERNETES_CLUSTER_DOMAIN_DEFAULT: &str = "cluster.local.";
66

77
/// Some information that we know about the Kubernetes cluster.
88
#[derive(Debug, Clone)]
@@ -24,16 +24,19 @@ impl KubernetesClusterInfo {
2424
pub fn new(cluster_info_opts: &KubernetesClusterInfoOpts) -> Self {
2525
let cluster_domain = match &cluster_info_opts.kubernetes_cluster_domain {
2626
Some(cluster_domain) => {
27+
// Append trailing dot to make the domain name a FQDN to improve DNS lookup performance, see https://github.com/stackabletech/issues/issues/656
28+
let cluster_domain = DomainName::from_str(&format!("{}.", cluster_domain))
29+
.expect("cluster_domain should already have been validated");
2730
tracing::info!(%cluster_domain, "Using configured Kubernetes cluster domain");
2831

29-
cluster_domain.clone()
32+
cluster_domain
3033
}
3134
None => {
3235
// TODO(sbernauer): Do some sort of advanced auto-detection, see https://github.com/stackabletech/issues/issues/436.
3336
// There have been attempts of parsing the `/etc/resolv.conf`, but they have been
3437
// reverted. Please read on the linked issue for details.
3538
let cluster_domain = DomainName::from_str(KUBERNETES_CLUSTER_DOMAIN_DEFAULT)
36-
.expect("KUBERNETES_CLUSTER_DOMAIN_DEFAULT constant must a valid domain");
39+
.expect("KUBERNETES_CLUSTER_DOMAIN_DEFAULT constant must be a valid domain");
3740
tracing::info!(%cluster_domain, "Defaulting Kubernetes cluster domain as it has not been configured");
3841

3942
cluster_domain

0 commit comments

Comments
 (0)