Skip to content

Commit faade27

Browse files
committed
fix: use ListenerName type
1 parent 4ae00ad commit faade27

3 files changed

Lines changed: 50 additions & 20 deletions

File tree

extra/crds.yaml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,10 @@ spec:
233233
description: |-
234234
This field controls which [ListenerClass](https://docs.stackable.tech/home/nightly/listener-operator/listenerclass.html) is used to expose this rolegroup.
235235
DataNodes should have a direct ListenerClass, such as `cluster-internal` or `external-unstable`.
236+
maxLength: 253
237+
minLength: 1
236238
nullable: true
239+
pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
237240
type: string
238241
logging:
239242
default:
@@ -796,7 +799,10 @@ spec:
796799
description: |-
797800
This field controls which [ListenerClass](https://docs.stackable.tech/home/nightly/listener-operator/listenerclass.html) is used to expose this rolegroup.
798801
DataNodes should have a direct ListenerClass, such as `cluster-internal` or `external-unstable`.
802+
maxLength: 253
803+
minLength: 1
799804
nullable: true
805+
pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
800806
type: string
801807
logging:
802808
default:
@@ -2314,7 +2320,10 @@ spec:
23142320
description: |-
23152321
This field controls which [ListenerClass](https://docs.stackable.tech/home/nightly/listener-operator/listenerclass.html) is used to expose this rolegroup.
23162322
NameNodes should have a stable ListenerClass, such as `cluster-internal` or `external-stable`.
2323+
maxLength: 253
2324+
minLength: 1
23172325
nullable: true
2326+
pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
23182327
type: string
23192328
logging:
23202329
default:
@@ -3026,7 +3035,10 @@ spec:
30263035
description: |-
30273036
This field controls which [ListenerClass](https://docs.stackable.tech/home/nightly/listener-operator/listenerclass.html) is used to expose this rolegroup.
30283037
NameNodes should have a stable ListenerClass, such as `cluster-internal` or `external-stable`.
3038+
maxLength: 253
3039+
minLength: 1
30293040
nullable: true
3041+
pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
30303042
type: string
30313043
logging:
30323044
default:

rust/operator-binary/src/controller/build/mod.rs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
use std::collections::HashMap;
1+
use std::{collections::HashMap, str::FromStr};
22

33
use stackable_operator::{
44
builder::meta::ObjectMetaBuilder,
55
kvp::{LabelError, Labels},
66
v2::{
77
builder::meta::ownerreference_from_resource,
8-
types::{common::Port, operator::RoleGroupName},
8+
types::{common::Port, kubernetes::ServiceName, operator::RoleGroupName},
99
},
1010
};
1111

@@ -61,14 +61,21 @@ pub(crate) fn pod_refs(cluster: &ValidatedCluster, role: &HdfsNodeRole) -> Vec<H
6161
.into_iter()
6262
.flatten()
6363
.flat_map(|(role_group_name, role_group)| {
64-
let object_name = cluster
65-
.resource_names(role, role_group_name)
66-
.qualified_role_group_name()
67-
.to_string();
64+
// The headless Service that governs the pods is named after the qualified role group
65+
// name (see `build::resource::service::rolegroup_headless_service`).
66+
let service_name = ServiceName::from_str(
67+
cluster
68+
.resource_names(role, role_group_name)
69+
.qualified_role_group_name()
70+
.as_ref(),
71+
)
72+
.expect("a qualified role group name is a valid Service name");
73+
let object_name = service_name.to_string();
74+
let namespace = cluster.namespace.clone();
6875
let ports = ports.clone();
6976
(0..role_group.replicas.unwrap_or(1)).map(move |i| HdfsPodRef {
70-
namespace: cluster.namespace.to_string(),
71-
role_group_service_name: object_name.clone(),
77+
namespace: namespace.clone(),
78+
role_group_service_name: service_name.clone(),
7279
pod_name: format!("{object_name}-{i}"),
7380
ports: ports.clone(),
7481
fqdn_override: None,

rust/operator-binary/src/crd/mod.rs

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use std::{
33
collections::{BTreeMap, HashMap},
44
num::TryFromIntError,
55
ops::Deref,
6+
str::FromStr,
67
};
78

89
use futures::future::try_join_all;
@@ -39,7 +40,10 @@ use stackable_operator::{
3940
v2::{
4041
config_overrides::KeyValueConfigOverrides,
4142
role_utils::JavaCommonConfig,
42-
types::{common::Port, kubernetes::ConfigMapName},
43+
types::{
44+
common::Port,
45+
kubernetes::{ConfigMapName, ListenerClassName, NamespaceName, ServiceName},
46+
},
4347
},
4448
versioned::versioned,
4549
};
@@ -557,11 +561,12 @@ pub(crate) async fn namenode_listener_refs(
557561
let listener_name = format!("{}-{}", *LISTENER_VOLUME_NAME, pod_ref.pod_name);
558562
let listener_ref = || {
559563
ObjectRef::<listener::v1alpha1::Listener>::new(&listener_name)
560-
.within(&pod_ref.namespace)
564+
.within(pod_ref.namespace.as_ref())
561565
};
562-
let pod_obj_ref = || ObjectRef::<Pod>::new(&pod_ref.pod_name).within(&pod_ref.namespace);
566+
let pod_obj_ref =
567+
|| ObjectRef::<Pod>::new(&pod_ref.pod_name).within(pod_ref.namespace.as_ref());
563568
let listener = client
564-
.get::<listener::v1alpha1::Listener>(&listener_name, &pod_ref.namespace)
569+
.get::<listener::v1alpha1::Listener>(&listener_name, pod_ref.namespace.as_ref())
565570
.await
566571
.context(GetPodListenerSnafu {
567572
listener: listener_ref(),
@@ -598,8 +603,8 @@ pub(crate) async fn namenode_listener_refs(
598603
/// Used for service discovery.
599604
#[derive(Clone, Debug)]
600605
pub struct HdfsPodRef {
601-
pub namespace: String,
602-
pub role_group_service_name: String,
606+
pub namespace: NamespaceName,
607+
pub role_group_service_name: ServiceName,
603608
pub pod_name: String,
604609
pub fqdn_override: Option<String>,
605610
pub ports: HashMap<String, Port>,
@@ -671,7 +676,13 @@ pub enum NameNodeContainer {
671676
FormatZooKeeper,
672677
}
673678

674-
#[derive(Clone, Debug, Default, Fragment, JsonSchema, PartialEq)]
679+
/// The default [`ListenerClassName`] used to expose a role group.
680+
pub fn default_listener_class() -> ListenerClassName {
681+
ListenerClassName::from_str(DEFAULT_LISTENER_CLASS)
682+
.expect("the default listener class is a valid ListenerClassName")
683+
}
684+
685+
#[derive(Clone, Debug, Fragment, JsonSchema, PartialEq)]
675686
#[fragment_attrs(
676687
derive(
677688
Clone,
@@ -693,7 +704,7 @@ pub struct NameNodeConfig {
693704
/// This field controls which [ListenerClass](DOCS_BASE_URL_PLACEHOLDER/listener-operator/listenerclass.html) is used to expose this rolegroup.
694705
/// NameNodes should have a stable ListenerClass, such as `cluster-internal` or `external-stable`.
695706
#[fragment_attrs(serde(default))]
696-
pub listener_class: String,
707+
pub listener_class: ListenerClassName,
697708
#[fragment_attrs(serde(flatten))]
698709
pub common: CommonNodeConfig,
699710
}
@@ -721,7 +732,7 @@ impl NameNodeConfigFragment {
721732
},
722733
},
723734
logging: product_logging::spec::default_logging(),
724-
listener_class: Some(DEFAULT_LISTENER_CLASS.to_string()),
735+
listener_class: Some(default_listener_class()),
725736
common: CommonNodeConfigFragment {
726737
affinity: get_affinity(cluster_name, role),
727738
graceful_shutdown_timeout: Some(DEFAULT_NAME_NODE_GRACEFUL_SHUTDOWN_TIMEOUT),
@@ -754,7 +765,7 @@ pub enum DataNodeContainer {
754765
WaitForNameNodes,
755766
}
756767

757-
#[derive(Clone, Debug, Default, Fragment, JsonSchema, PartialEq)]
768+
#[derive(Clone, Debug, Fragment, JsonSchema, PartialEq)]
758769
#[fragment_attrs(
759770
derive(
760771
Clone,
@@ -776,7 +787,7 @@ pub struct DataNodeConfig {
776787
/// This field controls which [ListenerClass](DOCS_BASE_URL_PLACEHOLDER/listener-operator/listenerclass.html) is used to expose this rolegroup.
777788
/// DataNodes should have a direct ListenerClass, such as `cluster-internal` or `external-unstable`.
778789
#[fragment_attrs(serde(default))]
779-
pub listener_class: String,
790+
pub listener_class: ListenerClassName,
780791
#[fragment_attrs(serde(flatten))]
781792
pub common: CommonNodeConfig,
782793
}
@@ -809,7 +820,7 @@ impl DataNodeConfigFragment {
809820
)]),
810821
},
811822
logging: product_logging::spec::default_logging(),
812-
listener_class: Some(DEFAULT_LISTENER_CLASS.to_string()),
823+
listener_class: Some(default_listener_class()),
813824
common: CommonNodeConfigFragment {
814825
affinity: get_affinity(cluster_name, role),
815826
graceful_shutdown_timeout: Some(DEFAULT_DATA_NODE_GRACEFUL_SHUTDOWN_TIMEOUT),

0 commit comments

Comments
 (0)