Skip to content

Commit 546c733

Browse files
committed
Consolidate listener to module
1 parent 247b450 commit 546c733

5 files changed

Lines changed: 136 additions & 106 deletions

File tree

rust/operator-binary/src/controller.rs

Lines changed: 9 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,7 @@ use stackable_operator::{
3737
product_image_selection::ResolvedProductImage, rbac::build_rbac_resources,
3838
tls_verification::TlsClientDetailsError,
3939
},
40-
crd::{
41-
listener::v1alpha1::{Listener, ListenerPort, ListenerSpec},
42-
s3,
43-
},
40+
crd::{listener::v1alpha1::Listener, s3},
4441
k8s_openapi::{
4542
DeepMerge,
4643
api::{
@@ -91,9 +88,8 @@ use crate::{
9188
crd::{
9289
APP_NAME, CORE_SITE_XML, Container, DB_PASSWORD_ENV, DB_USERNAME_ENV, HIVE_PORT,
9390
HIVE_PORT_NAME, HIVE_SITE_XML, HiveClusterStatus, HiveRole, JVM_SECURITY_PROPERTIES_FILE,
94-
LISTENER_VOLUME_DIR, LISTENER_VOLUME_NAME, METRICS_PORT, METRICS_PORT_NAME,
95-
MetaStoreConfig, STACKABLE_CONFIG_DIR, STACKABLE_CONFIG_DIR_NAME,
96-
STACKABLE_CONFIG_MOUNT_DIR, STACKABLE_CONFIG_MOUNT_DIR_NAME,
91+
METRICS_PORT, METRICS_PORT_NAME, MetaStoreConfig, STACKABLE_CONFIG_DIR,
92+
STACKABLE_CONFIG_DIR_NAME, STACKABLE_CONFIG_MOUNT_DIR, STACKABLE_CONFIG_MOUNT_DIR_NAME,
9793
STACKABLE_LOG_CONFIG_MOUNT_DIR, STACKABLE_LOG_CONFIG_MOUNT_DIR_NAME, STACKABLE_LOG_DIR,
9894
STACKABLE_LOG_DIR_NAME,
9995
v1alpha1::{self, HiveMetastoreRoleConfig},
@@ -103,6 +99,7 @@ use crate::{
10399
self, add_kerberos_pod_config, kerberos_config_properties,
104100
kerberos_container_start_commands,
105101
},
102+
listener::{LISTENER_VOLUME_DIR, LISTENER_VOLUME_NAME, build_group_listener},
106103
operations::{graceful_shutdown::add_graceful_shutdown_config, pdb::add_pdbs},
107104
product_logging::extend_role_group_config_map,
108105
};
@@ -341,6 +338,9 @@ pub enum Error {
341338
source: stackable_operator::cluster_resources::Error,
342339
role: String,
343340
},
341+
#[snafu(display("failed to configure listener"))]
342+
ListenerConfiguration { source: crate::listener::Error },
343+
344344
#[snafu(display("failed to build listener volume"))]
345345
BuildListenerVolume {
346346
source: ListenerOperatorVolumeSourceBuilderError,
@@ -521,7 +521,8 @@ pub async fn reconcile_hive(
521521

522522
if let Some(HiveMetastoreRoleConfig { listener_class, .. }) = role_config {
523523
let group_listener: Listener =
524-
build_group_listener(hive, &resolved_product_image, &hive_role, listener_class)?;
524+
build_group_listener(hive, &resolved_product_image, &hive_role, listener_class)
525+
.context(ListenerConfigurationSnafu)?;
525526
let listener = cluster_resources
526527
.add(client, group_listener)
527528
.await
@@ -573,51 +574,6 @@ pub async fn reconcile_hive(
573574
Ok(Action::await_change())
574575
}
575576

576-
// Designed to build a listener per role
577-
// In case of Hive we expect only one role: Metastore
578-
pub fn build_group_listener(
579-
hive: &v1alpha1::HiveCluster,
580-
resolved_product_image: &ResolvedProductImage,
581-
hive_role: &HiveRole,
582-
listener_class: &String,
583-
) -> Result<Listener> {
584-
let metadata = ObjectMetaBuilder::new()
585-
.name_and_namespace(hive)
586-
.name(hive.group_listener_name(hive_role))
587-
.ownerreference_from_resource(hive, None, Some(true))
588-
.context(ObjectMissingMetadataForOwnerRefSnafu)?
589-
.with_recommended_labels(build_recommended_labels(
590-
hive,
591-
&resolved_product_image.app_version_label,
592-
&hive_role.to_string(),
593-
"none",
594-
))
595-
.context(MetadataBuildSnafu)?
596-
.build();
597-
598-
let spec = ListenerSpec {
599-
class_name: Some(listener_class.to_owned()),
600-
ports: Some(listener_ports()),
601-
..Default::default()
602-
};
603-
604-
let listener = Listener {
605-
metadata,
606-
spec,
607-
status: None,
608-
};
609-
610-
Ok(listener)
611-
}
612-
613-
fn listener_ports() -> Vec<ListenerPort> {
614-
vec![ListenerPort {
615-
name: HIVE_PORT_NAME.to_owned(),
616-
port: HIVE_PORT.into(),
617-
protocol: Some("TCP".to_owned()),
618-
}]
619-
}
620-
621577
/// The rolegroup [`ConfigMap`] configures the rolegroup based on the configuration given by the administrator
622578
#[allow(clippy::too_many_arguments)]
623579
fn build_metastore_rolegroup_config_map(

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

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ use stackable_operator::{
3232
use strum::{Display, EnumIter, EnumString, IntoEnumIterator};
3333
use v1alpha1::HiveMetastoreRoleConfig;
3434

35-
use crate::crd::affinity::get_affinity;
35+
use crate::{crd::affinity::get_affinity, listener::metastore_default_listener_class};
3636

3737
pub mod affinity;
3838
pub mod security;
@@ -61,13 +61,6 @@ pub const HIVE_PORT: u16 = 9083;
6161
pub const METRICS_PORT_NAME: &str = "metrics";
6262
pub const METRICS_PORT: u16 = 9084;
6363

64-
// Listener volumes
65-
pub const LISTENER_VOLUME_NAME: &str = "listener";
66-
pub const LISTENER_VOLUME_DIR: &str = "/stackable/listener";
67-
68-
// Listener defaults
69-
pub const DEFAULT_LISTENER_CLASS: &str = "cluster-internal";
70-
7164
// Certificates and trust stores
7265
pub const SYSTEM_TRUST_STORE: &str = "/etc/pki/java/cacerts";
7366
pub const SYSTEM_TRUST_STORE_PASSWORD: &str = "changeit";
@@ -190,10 +183,6 @@ impl Default for v1alpha1::HiveMetastoreRoleConfig {
190183
}
191184
}
192185

193-
fn metastore_default_listener_class() -> String {
194-
DEFAULT_LISTENER_CLASS.to_owned()
195-
}
196-
197186
impl HasStatusCondition for v1alpha1::HiveCluster {
198187
fn conditions(&self) -> Vec<ClusterCondition> {
199188
match &self.status {

rust/operator-binary/src/discovery.rs

Lines changed: 7 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ use stackable_operator::{
99

1010
use crate::{
1111
controller::build_recommended_labels,
12-
crd::{HIVE_PORT_NAME, HiveRole, v1alpha1},
12+
crd::{HiveRole, v1alpha1},
13+
listener::build_listener_connection_string,
1314
};
1415

1516
#[derive(Snafu, Debug)]
@@ -19,25 +20,21 @@ pub enum Error {
1920
source: stackable_operator::builder::meta::Error,
2021
hive: ObjectRef<v1alpha1::HiveCluster>,
2122
},
22-
#[snafu(display("chroot path {chroot} was relative (must be absolute)"))]
23-
RelativeChroot { chroot: String },
23+
2424
#[snafu(display("could not build discovery config map for {obj_ref}"))]
2525
DiscoveryConfigMap {
2626
source: stackable_operator::builder::configmap::Error,
2727
obj_ref: ObjectRef<v1alpha1::HiveCluster>,
2828
},
29-
#[snafu(display("could not find port [{port_name}] for rolegroup listener {role}"))]
30-
NoServicePort { port_name: String, role: String },
31-
3229
#[snafu(display("invalid owner name for discovery ConfigMap"))]
3330
InvalidOwnerNameForDiscoveryConfigMap,
3431

3532
#[snafu(display("failed to build Metadata"))]
3633
MetadataBuild {
3734
source: stackable_operator::builder::meta::Error,
3835
},
39-
#[snafu(display("{role} listener has no adress"))]
40-
RoleListenerHasNoAddress { role: String },
36+
#[snafu(display("failed to configure listener discovery configmap"))]
37+
ListenerConfiguration { source: crate::listener::Error },
4138
}
4239

4340
/// Builds discovery [`ConfigMap`]s for connecting to a [`v1alpha1::HiveCluster`] for all expected
@@ -104,7 +101,8 @@ fn build_discovery_configmap(
104101

105102
discovery_configmap.add_data(
106103
"HIVE".to_string(),
107-
build_listener_connection_string(listener, &hive_role.to_string(), chroot)?,
104+
build_listener_connection_string(listener, &hive_role.to_string(), chroot)
105+
.context(ListenerConfigurationSnafu)?,
108106
);
109107

110108
discovery_configmap
@@ -114,38 +112,6 @@ fn build_discovery_configmap(
114112
})
115113
}
116114

117-
// Builds the connection string with respect to the listener provided objects
118-
fn build_listener_connection_string(
119-
listener_ref: Listener,
120-
role: &String,
121-
chroot: Option<&str>,
122-
) -> Result<String, Error> {
123-
// We only need the first address corresponding to the role
124-
let listener_address = listener_ref
125-
.status
126-
.and_then(|s| s.ingress_addresses?.into_iter().next())
127-
.context(RoleListenerHasNoAddressSnafu { role })?;
128-
let mut conn_str = format!(
129-
"thrift://{address}:{port}",
130-
address = listener_address.address,
131-
port = listener_address
132-
.ports
133-
.get(HIVE_PORT_NAME)
134-
.copied()
135-
.context(NoServicePortSnafu {
136-
port_name: HIVE_PORT_NAME,
137-
role
138-
})?
139-
);
140-
if let Some(chroot) = chroot {
141-
if !chroot.starts_with('/') {
142-
return RelativeChrootSnafu { chroot }.fail();
143-
}
144-
conn_str.push_str(chroot);
145-
}
146-
Ok(conn_str)
147-
}
148-
149115
pub fn build_headless_role_group_metrics_service_name(name: String) -> String {
150116
format!("{name}-metrics", name = name)
151117
}
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
use snafu::{OptionExt, ResultExt, Snafu};
2+
use stackable_operator::{
3+
builder::meta::ObjectMetaBuilder,
4+
commons::product_image_selection::ResolvedProductImage,
5+
crd::listener::v1alpha1::{Listener, ListenerPort, ListenerSpec},
6+
};
7+
8+
use crate::{
9+
controller::build_recommended_labels,
10+
crd::{HIVE_PORT, HIVE_PORT_NAME, HiveRole, v1alpha1},
11+
};
12+
13+
// Listener volumes
14+
pub const LISTENER_VOLUME_NAME: &str = "listener";
15+
pub const LISTENER_VOLUME_DIR: &str = "/stackable/listener";
16+
17+
// Listener defaults
18+
pub const DEFAULT_LISTENER_CLASS: &str = "cluster-internal";
19+
20+
#[derive(Snafu, Debug)]
21+
pub enum Error {
22+
#[snafu(display("object is missing metadata to build owner reference"))]
23+
ObjectMissingMetadataForOwnerRef {
24+
source: stackable_operator::builder::meta::Error,
25+
},
26+
#[snafu(display("failed to build Metadata"))]
27+
MetadataBuild {
28+
source: stackable_operator::builder::meta::Error,
29+
},
30+
#[snafu(display("{role} listener has no adress"))]
31+
RoleListenerHasNoAddress { role: String },
32+
#[snafu(display("could not find port [{port_name}] for rolegroup listener {role}"))]
33+
NoServicePort { port_name: String, role: String },
34+
#[snafu(display("chroot path {chroot} was relative (must be absolute)"))]
35+
RelativeChroot { chroot: String },
36+
}
37+
38+
// Builds the connection string with respect to the listener provided objects
39+
pub fn build_listener_connection_string(
40+
listener_ref: Listener,
41+
role: &String,
42+
chroot: Option<&str>,
43+
) -> Result<String, Error> {
44+
// We only need the first address corresponding to the role
45+
let listener_address = listener_ref
46+
.status
47+
.and_then(|s| s.ingress_addresses?.into_iter().next())
48+
.context(RoleListenerHasNoAddressSnafu { role })?;
49+
let mut conn_str = format!(
50+
"thrift://{address}:{port}",
51+
address = listener_address.address,
52+
port = listener_address
53+
.ports
54+
.get(HIVE_PORT_NAME)
55+
.copied()
56+
.context(NoServicePortSnafu {
57+
port_name: HIVE_PORT_NAME,
58+
role
59+
})?
60+
);
61+
if let Some(chroot) = chroot {
62+
if !chroot.starts_with('/') {
63+
return RelativeChrootSnafu { chroot }.fail();
64+
}
65+
conn_str.push_str(chroot);
66+
}
67+
Ok(conn_str)
68+
}
69+
70+
// Designed to build a listener per role
71+
// In case of Hive we expect only one role: Metastore
72+
pub fn build_group_listener(
73+
hive: &v1alpha1::HiveCluster,
74+
resolved_product_image: &ResolvedProductImage,
75+
hive_role: &HiveRole,
76+
listener_class: &String,
77+
) -> Result<Listener, Error> {
78+
let metadata = ObjectMetaBuilder::new()
79+
.name_and_namespace(hive)
80+
.name(hive.group_listener_name(hive_role))
81+
.ownerreference_from_resource(hive, None, Some(true))
82+
.context(ObjectMissingMetadataForOwnerRefSnafu)?
83+
.with_recommended_labels(build_recommended_labels(
84+
hive,
85+
&resolved_product_image.app_version_label,
86+
&hive_role.to_string(),
87+
"none",
88+
))
89+
.context(MetadataBuildSnafu)?
90+
.build();
91+
92+
let spec = ListenerSpec {
93+
class_name: Some(listener_class.to_owned()),
94+
ports: Some(listener_ports()),
95+
..Default::default()
96+
};
97+
98+
let listener = Listener {
99+
metadata,
100+
spec,
101+
status: None,
102+
};
103+
104+
Ok(listener)
105+
}
106+
107+
fn listener_ports() -> Vec<ListenerPort> {
108+
vec![ListenerPort {
109+
name: HIVE_PORT_NAME.to_owned(),
110+
port: HIVE_PORT.into(),
111+
protocol: Some("TCP".to_owned()),
112+
}]
113+
}
114+
115+
// used by crds to define a default listener_class name
116+
pub fn metastore_default_listener_class() -> String {
117+
DEFAULT_LISTENER_CLASS.to_owned()
118+
}

rust/operator-binary/src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ mod controller;
44
mod crd;
55
mod discovery;
66
mod kerberos;
7+
mod listener;
78
mod operations;
89
mod product_logging;
910

0 commit comments

Comments
 (0)