Skip to content

Commit 5996f78

Browse files
committed
Adopting to listenerClass per role rather then roleGroup
1 parent 50029ef commit 5996f78

4 files changed

Lines changed: 108 additions & 73 deletions

File tree

rust/operator-binary/src/config/jvm.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
use snafu::{OptionExt, ResultExt, Snafu};
22
use stackable_operator::{
33
memory::{BinaryMultiple, MemoryQuantity},
4-
role_utils::{self, GenericRoleConfig, JavaCommonConfig, JvmArgumentOverrides, Role},
4+
role_utils::{self, JavaCommonConfig, JvmArgumentOverrides, Role},
55
};
66

77
use crate::crd::{
88
JVM_SECURITY_PROPERTIES_FILE, METRICS_PORT, MetaStoreConfig, MetaStoreConfigFragment,
99
STACKABLE_CONFIG_DIR, STACKABLE_TRUST_STORE, STACKABLE_TRUST_STORE_PASSWORD,
10-
v1alpha1::HiveCluster,
10+
v1alpha1::{HiveCluster, HiveMetastoreRoleConfig},
1111
};
1212

1313
const JAVA_HEAP_FACTOR: f32 = 0.8;
@@ -29,7 +29,7 @@ pub enum Error {
2929
/// All JVM arguments.
3030
fn construct_jvm_args(
3131
hive: &HiveCluster,
32-
role: &Role<MetaStoreConfigFragment, GenericRoleConfig, JavaCommonConfig>,
32+
role: &Role<MetaStoreConfigFragment, HiveMetastoreRoleConfig, JavaCommonConfig>,
3333
role_group: &str,
3434
) -> Result<Vec<String>, Error> {
3535
let mut jvm_args = vec![
@@ -60,7 +60,7 @@ fn construct_jvm_args(
6060
/// [`construct_hadoop_heapsize_env`]).
6161
pub fn construct_non_heap_jvm_args(
6262
hive: &HiveCluster,
63-
role: &Role<MetaStoreConfigFragment, GenericRoleConfig, JavaCommonConfig>,
63+
role: &Role<MetaStoreConfigFragment, HiveMetastoreRoleConfig, JavaCommonConfig>,
6464
role_group: &str,
6565
) -> Result<String, Error> {
6666
let mut jvm_args = construct_jvm_args(hive, role, role_group)?;
@@ -193,7 +193,7 @@ mod tests {
193193
) -> (
194194
HiveCluster,
195195
MetaStoreConfig,
196-
Role<MetaStoreConfigFragment, GenericRoleConfig, JavaCommonConfig>,
196+
Role<MetaStoreConfigFragment, HiveMetastoreRoleConfig, JavaCommonConfig>,
197197
String,
198198
) {
199199
let hive: HiveCluster = serde_yaml::from_str(hive_cluster).expect("illegal test input");

rust/operator-binary/src/controller.rs

Lines changed: 41 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,11 @@ use crate::{
9292
APP_NAME, CORE_SITE_XML, Container, DB_PASSWORD_ENV, DB_USERNAME_ENV, HIVE_PORT,
9393
HIVE_PORT_NAME, HIVE_SITE_XML, HiveClusterStatus, HiveRole, JVM_SECURITY_PROPERTIES_FILE,
9494
LISTENER_VOLUME_DIR, LISTENER_VOLUME_NAME, METRICS_PORT, METRICS_PORT_NAME,
95-
MetaStoreConfig, STACKABLE_CONFIG_DIR, STACKABLE_CONFIG_DIR_NAME,
95+
MetaStoreConfig, MetaStoreConfigFragment, STACKABLE_CONFIG_DIR, STACKABLE_CONFIG_DIR_NAME,
9696
STACKABLE_CONFIG_MOUNT_DIR, STACKABLE_CONFIG_MOUNT_DIR_NAME,
9797
STACKABLE_LOG_CONFIG_MOUNT_DIR, STACKABLE_LOG_CONFIG_MOUNT_DIR_NAME, STACKABLE_LOG_DIR,
98-
STACKABLE_LOG_DIR_NAME, v1alpha1,
98+
STACKABLE_LOG_DIR_NAME,
99+
v1alpha1::{self, HiveMetastoreRoleConfig},
99100
},
100101
discovery::{self, build_headless_listener_service_name},
101102
kerberos::{
@@ -335,10 +336,10 @@ pub enum Error {
335336
#[snafu(display("failed to construct JVM arguments"))]
336337
ConstructJvmArguments { source: crate::config::jvm::Error },
337338

338-
#[snafu(display("failed to apply group listener for {rolegroup}"))]
339+
#[snafu(display("failed to apply group listener for {role}"))]
339340
ApplyGroupListener {
340341
source: stackable_operator::cluster_resources::Error,
341-
rolegroup: RoleGroupRef<v1alpha1::HiveCluster>,
342+
role: String,
342343
},
343344
#[snafu(display("failed to build listener volume"))]
344345
BuildListenerVolume {
@@ -370,7 +371,11 @@ pub async fn reconcile_hive(
370371
.spec
371372
.image
372373
.resolve(DOCKER_IMAGE_BASE_NAME, crate::built_info::PKG_VERSION);
373-
let role = hive.spec.metastore.as_ref().context(NoMetaStoreRoleSnafu)?;
374+
let role: &stackable_operator::role_utils::Role<
375+
MetaStoreConfigFragment,
376+
v1alpha1::HiveMetastoreRoleConfig,
377+
stackable_operator::role_utils::JavaCommonConfig,
378+
> = hive.spec.metastore.as_ref().context(NoMetaStoreRoleSnafu)?;
374379
let hive_role = HiveRole::MetaStore;
375380

376381
let s3_connection_spec: Option<s3::v1alpha1::ConnectionSpec> =
@@ -440,14 +445,15 @@ pub async fn reconcile_hive(
440445
.add(client, rbac_sa)
441446
.await
442447
.context(ApplyServiceAccountSnafu)?;
448+
443449
cluster_resources
444450
.add(client, rbac_rolebinding)
445451
.await
446452
.context(ApplyRoleBindingSnafu)?;
447453

448454
let mut ss_cond_builder = StatefulSetConditionBuilder::default();
449455
// Collecting listener objects with corresponding rolegroup to fill the discovery configMap later on
450-
let mut listener_refs = BTreeMap::<&String, Listener>::new();
456+
// let mut listener_refs = BTreeMap::<&String, Listener>::new();
451457
for (rolegroup_name, rolegroup_config) in metastore_config.iter() {
452458
let rolegroup = hive.metastore_rolegroup_ref(rolegroup_name);
453459

@@ -477,28 +483,14 @@ pub async fn reconcile_hive(
477483
&rbac_sa.name_any(),
478484
)?;
479485

480-
let rg_group_listener: Listener = build_group_listener(
481-
hive,
482-
&resolved_product_image,
483-
&rolegroup,
484-
config.listener_class,
485-
)?;
486-
487-
let listener = cluster_resources
488-
.add(client, rg_group_listener)
489-
.await
490-
.with_context(|_| ApplyGroupListenerSnafu {
491-
rolegroup: rolegroup.clone(),
492-
})?;
493-
494486
cluster_resources
495487
.add(client, rg_service)
496488
.await
497489
.context(ApplyRoleGroupServiceSnafu {
498490
rolegroup: rolegroup.clone(),
499491
})?;
500492

501-
listener_refs.insert(rolegroup_name, listener);
493+
// listener_refs.insert(rolegroup_name, listener);
502494

503495
cluster_resources
504496
.add(client, rg_configmap)
@@ -516,15 +508,29 @@ pub async fn reconcile_hive(
516508
})?,
517509
);
518510
}
519-
511+
// Init listener struct. Collect listener after applied to cluster_resources
512+
// to use listener object in later created discovery configMap
513+
let mut listener = Listener::new("name", ListenerSpec::default());
520514
let role_config = hive.role_config(&hive_role);
521-
if let Some(GenericRoleConfig {
522-
pod_disruption_budget: pdb,
515+
if let Some(HiveMetastoreRoleConfig {
516+
common: GenericRoleConfig {
517+
pod_disruption_budget: pdb,
518+
},
519+
listener_class,
523520
}) = role_config
524521
{
525522
add_pdbs(pdb, hive, &hive_role, client, &mut cluster_resources)
526523
.await
527524
.context(FailedToCreatePdbSnafu)?;
525+
526+
let group_listener: Listener =
527+
build_group_listener(hive, &resolved_product_image, &hive_role, listener_class)?;
528+
listener = cluster_resources
529+
.add(client, group_listener)
530+
.await
531+
.with_context(|_| ApplyGroupListenerSnafu {
532+
role: hive_role.to_string(),
533+
})?;
528534
}
529535

530536
// std's SipHasher is deprecated, and DefaultHasher is unstable across Rust releases.
@@ -534,9 +540,10 @@ pub async fn reconcile_hive(
534540
for discovery_cm in discovery::build_discovery_configmaps(
535541
hive,
536542
hive,
543+
hive_role,
537544
&resolved_product_image,
538545
None,
539-
listener_refs,
546+
listener,
540547
)
541548
.await
542549
.context(BuildDiscoveryConfigSnafu)?
@@ -573,28 +580,30 @@ pub async fn reconcile_hive(
573580
Ok(Action::await_change())
574581
}
575582

583+
// Designed to build a listener per role
584+
// In case of Hive we expect only one role: Metastore
576585
pub fn build_group_listener(
577586
hive: &v1alpha1::HiveCluster,
578587
resolved_product_image: &ResolvedProductImage,
579-
rolegroup: &RoleGroupRef<v1alpha1::HiveCluster>,
580-
listener_class: String,
588+
hive_role: &HiveRole,
589+
listener_class: &String,
581590
) -> Result<Listener> {
582591
let metadata = ObjectMetaBuilder::new()
583592
.name_and_namespace(hive)
584-
.name(hive.group_listener_name(rolegroup))
593+
.name(hive.group_listener_name(hive_role))
585594
.ownerreference_from_resource(hive, None, Some(true))
586595
.context(ObjectMissingMetadataForOwnerRefSnafu)?
587596
.with_recommended_labels(build_recommended_labels(
588597
hive,
589598
&resolved_product_image.app_version_label,
590-
&rolegroup.role,
591-
&rolegroup.role_group,
599+
&hive_role.to_string(),
600+
"none",
592601
))
593602
.context(MetadataBuildSnafu)?
594603
.build();
595604

596605
let spec = ListenerSpec {
597-
class_name: Some(listener_class),
606+
class_name: Some(listener_class.to_owned()),
598607
ports: Some(listener_ports()),
599608
..Default::default()
600609
};
@@ -1004,7 +1013,7 @@ fn build_metastore_rolegroup_statefulset(
10041013
.build();
10051014

10061015
let pvc = ListenerOperatorVolumeSourceBuilder::new(
1007-
&ListenerReference::ListenerName(hive.group_listener_name(rolegroup_ref)),
1016+
&ListenerReference::ListenerName(hive.group_listener_name(&hive_role)),
10081017
&unversioned_recommended_labels,
10091018
)
10101019
.context(BuildListenerVolumeSnafu)?

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

Lines changed: 42 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ use stackable_operator::{
3030
versioned::versioned,
3131
};
3232
use strum::{Display, EnumIter, EnumString, IntoEnumIterator};
33+
use v1alpha1::HiveMetastoreRoleConfig;
3334

3435
use crate::crd::affinity::get_affinity;
3536

@@ -134,7 +135,20 @@ pub mod versioned {
134135

135136
// no doc - docs in Role struct.
136137
#[serde(default, skip_serializing_if = "Option::is_none")]
137-
pub metastore: Option<Role<MetaStoreConfigFragment, GenericRoleConfig, JavaCommonConfig>>,
138+
pub metastore:
139+
Option<Role<MetaStoreConfigFragment, HiveMetastoreRoleConfig, JavaCommonConfig>>,
140+
}
141+
142+
// TODO: move generic version to op-rs?
143+
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
144+
#[serde(rename_all = "camelCase")]
145+
pub struct HiveMetastoreRoleConfig {
146+
#[serde(flatten)]
147+
pub common: GenericRoleConfig,
148+
149+
/// This field controls which [ListenerClass](DOCS_BASE_URL_PLACEHOLDER/listener-operator/listenerclass.html) is used to expose the coordinator.
150+
#[serde(default = "metastore_default_listener_class")]
151+
pub listener_class: String,
138152
}
139153

140154
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
@@ -164,6 +178,19 @@ pub mod versioned {
164178
}
165179
}
166180

181+
impl Default for v1alpha1::HiveMetastoreRoleConfig {
182+
fn default() -> Self {
183+
v1alpha1::HiveMetastoreRoleConfig {
184+
listener_class: metastore_default_listener_class(),
185+
common: Default::default(),
186+
}
187+
}
188+
}
189+
190+
fn metastore_default_listener_class() -> String {
191+
"cluster-internal".to_string()
192+
}
193+
167194
impl HasStatusCondition for v1alpha1::HiveCluster {
168195
fn conditions(&self) -> Vec<ClusterCondition> {
169196
match &self.status {
@@ -211,7 +238,8 @@ impl v1alpha1::HiveCluster {
211238
pub fn role(
212239
&self,
213240
role_variant: &HiveRole,
214-
) -> Result<&Role<MetaStoreConfigFragment, GenericRoleConfig, JavaCommonConfig>, Error> {
241+
) -> Result<&Role<MetaStoreConfigFragment, HiveMetastoreRoleConfig, JavaCommonConfig>, Error>
242+
{
215243
match role_variant {
216244
HiveRole::MetaStore => self.spec.metastore.as_ref(),
217245
}
@@ -220,11 +248,14 @@ impl v1alpha1::HiveCluster {
220248
})
221249
}
222250

223-
/// The name of the group-listener provided for a specific role-group.
224-
/// The UI will use this group listener so that only one load balancer
225-
/// is needed (per role group).
226-
pub fn group_listener_name(&self, rolegroup: &RoleGroupRef<Self>) -> String {
227-
rolegroup.object_name()
251+
/// The name of the group-listener provided for a specific role.
252+
/// returns a name <cluster>-<role>
253+
pub fn group_listener_name(&self, hive_role: &HiveRole) -> String {
254+
format!(
255+
"{name}-{role}",
256+
name = self.name_any(),
257+
role = hive_role.to_string()
258+
)
228259
}
229260

230261
pub fn rolegroup(
@@ -246,7 +277,7 @@ impl v1alpha1::HiveCluster {
246277
.cloned()
247278
}
248279

249-
pub fn role_config(&self, role: &HiveRole) -> Option<&GenericRoleConfig> {
280+
pub fn role_config(&self, role: &HiveRole) -> Option<&HiveMetastoreRoleConfig> {
250281
match role {
251282
HiveRole::MetaStore => self.spec.metastore.as_ref().map(|m| &m.role_config),
252283
}
@@ -417,10 +448,9 @@ pub struct MetaStoreConfig {
417448
/// Time period Pods have to gracefully shut down, e.g. `30m`, `1h` or `2d`. Consult the operator documentation for details.
418449
#[fragment_attrs(serde(default))]
419450
pub graceful_shutdown_timeout: Option<Duration>,
420-
421-
/// This field controls which [ListenerClass](DOCS_BASE_URL_PLACEHOLDER/listener-operator/listenerclass.html) is used to expose the webserver.
422-
#[serde(default)]
423-
pub listener_class: String,
451+
// This field controls which [ListenerClass](DOCS_BASE_URL_PLACEHOLDER/listener-operator/listenerclass.html) is used to expose the webserver.
452+
// #[serde(default)]
453+
// pub listener_class: String,
424454
}
425455

426456
impl MetaStoreConfig {
@@ -462,7 +492,6 @@ impl MetaStoreConfig {
462492
logging: product_logging::spec::default_logging(),
463493
affinity: get_affinity(cluster_name, role),
464494
graceful_shutdown_timeout: Some(DEFAULT_METASTORE_GRACEFUL_SHUTDOWN_TIMEOUT),
465-
listener_class: Some("cluster-internal".to_owned()),
466495
}
467496
}
468497
}

0 commit comments

Comments
 (0)