@@ -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
576585pub 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 ) ?
0 commit comments