@@ -583,6 +583,12 @@ impl v1alpha1::HbaseCluster {
583583 }
584584 }
585585
586+ /// Returns rolegroup and replica information for a specific role.
587+ /// We can't pass through the merged config for a particular role-group
588+ /// here as we need more than the config. As this will be called by role,
589+ /// the merged listener-class is called so that only role-group information
590+ /// for externally-reachable services (based on their listener class) are
591+ /// included in the collection.
586592 pub fn rolegroup_ref_and_replicas (
587593 & self ,
588594 role : & HbaseRole ,
@@ -596,6 +602,9 @@ impl v1alpha1::HbaseCluster {
596602 // Order rolegroups consistently, to avoid spurious downstream rewrites
597603 . collect :: < BTreeMap < _ , _ > > ( )
598604 . into_iter ( )
605+ . filter ( |( rolegroup_name, _) | {
606+ self . resolved_listener_class_discoverable ( role, rolegroup_name)
607+ } )
599608 . map ( |( rolegroup_name, role_group) | {
600609 (
601610 self . rolegroup_ref ( HbaseRole :: Master . to_string ( ) , rolegroup_name) ,
@@ -611,6 +620,9 @@ impl v1alpha1::HbaseCluster {
611620 // Order rolegroups consistently, to avoid spurious downstream rewrites
612621 . collect :: < BTreeMap < _ , _ > > ( )
613622 . into_iter ( )
623+ . filter ( |( rolegroup_name, _) | {
624+ self . resolved_listener_class_discoverable ( role, rolegroup_name)
625+ } )
614626 . map ( |( rolegroup_name, role_group) | {
615627 (
616628 self . rolegroup_ref ( HbaseRole :: RegionServer . to_string ( ) , rolegroup_name) ,
@@ -626,6 +638,9 @@ impl v1alpha1::HbaseCluster {
626638 // Order rolegroups consistently, to avoid spurious downstream rewrites
627639 . collect :: < BTreeMap < _ , _ > > ( )
628640 . into_iter ( )
641+ . filter ( |( rolegroup_name, _) | {
642+ self . resolved_listener_class_discoverable ( role, rolegroup_name)
643+ } )
629644 . map ( |( rolegroup_name, role_group) | {
630645 (
631646 self . rolegroup_ref ( HbaseRole :: RestServer . to_string ( ) , rolegroup_name) ,
@@ -636,6 +651,19 @@ impl v1alpha1::HbaseCluster {
636651 }
637652 }
638653
654+ fn resolved_listener_class_discoverable (
655+ & self ,
656+ role : & HbaseRole ,
657+ rolegroup_name : & & String ,
658+ ) -> bool {
659+ let listener_class = self . merged_listener_class ( role, rolegroup_name) ;
660+ if let Some ( listener_class) = listener_class {
661+ listener_class. discoverable ( )
662+ } else {
663+ false
664+ }
665+ }
666+
639667 pub fn pod_refs (
640668 & self ,
641669 role : & HbaseRole ,
@@ -667,53 +695,113 @@ impl v1alpha1::HbaseCluster {
667695 & self ,
668696 client : & stackable_operator:: client:: Client ,
669697 role : & HbaseRole ,
670- merged_config : & AnyServiceConfig ,
671698 hbase_version : & str ,
672699 ) -> Result < Vec < HbasePodRef > , Error > {
673- // only externally-reachable listeners are relevant
674- if merged_config. listener_class ( ) . discoverable ( ) {
675- let pod_refs = self . pod_refs ( role, hbase_version) ?;
676- try_join_all ( pod_refs. into_iter ( ) . map ( |pod_ref| async {
677- // N.B. use the naming convention for persistent listener volumes as we
678- // have specified above that we only want externally-reachable endpoints.
679- let listener_name = format ! ( "{LISTENER_VOLUME_NAME}-{}" , pod_ref. pod_name) ;
680- let listener_ref =
681- || ObjectRef :: < Listener > :: new ( & listener_name) . within ( & pod_ref. namespace ) ;
682- let pod_obj_ref =
683- || ObjectRef :: < Pod > :: new ( & pod_ref. pod_name ) . within ( & pod_ref. namespace ) ;
684- let listener = client
685- . get :: < Listener > ( & listener_name, & pod_ref. namespace )
686- . await
687- . context ( GetPodListenerSnafu {
688- listener : listener_ref ( ) ,
689- pod : pod_obj_ref ( ) ,
690- } ) ?;
691- let listener_address = listener
692- . status
693- . and_then ( |s| s. ingress_addresses ?. into_iter ( ) . next ( ) )
694- . context ( PodListenerHasNoAddressSnafu {
695- listener : listener_ref ( ) ,
696- pod : pod_obj_ref ( ) ,
697- } ) ?;
698- Ok ( HbasePodRef {
699- fqdn_override : Some ( listener_address. address ) ,
700- ports : listener_address
701- . ports
702- . into_iter ( )
703- . map ( |( port_name, port) | {
704- let port = u16:: try_from ( port) . context ( PortOutOfBoundsSnafu {
705- port_name : & port_name,
706- port,
707- } ) ?;
708- Ok ( ( port_name, port) )
709- } )
710- . collect :: < Result < _ , _ > > ( ) ?,
711- ..pod_ref
712- } )
713- } ) )
714- . await
715- } else {
716- Ok ( vec ! [ ] )
700+ let pod_refs = self . pod_refs ( role, hbase_version) ?;
701+ try_join_all ( pod_refs. into_iter ( ) . map ( |pod_ref| async {
702+ // N.B. use the naming convention for persistent listener volumes as we
703+ // have specified above that we only want externally-reachable endpoints.
704+ let listener_name = format ! ( "{LISTENER_VOLUME_NAME}-{}" , pod_ref. pod_name) ;
705+ let listener_ref =
706+ || ObjectRef :: < Listener > :: new ( & listener_name) . within ( & pod_ref. namespace ) ;
707+ let pod_obj_ref =
708+ || ObjectRef :: < Pod > :: new ( & pod_ref. pod_name ) . within ( & pod_ref. namespace ) ;
709+ let listener = client
710+ . get :: < Listener > ( & listener_name, & pod_ref. namespace )
711+ . await
712+ . context ( GetPodListenerSnafu {
713+ listener : listener_ref ( ) ,
714+ pod : pod_obj_ref ( ) ,
715+ } ) ?;
716+ let listener_address = listener
717+ . status
718+ . and_then ( |s| s. ingress_addresses ?. into_iter ( ) . next ( ) )
719+ . context ( PodListenerHasNoAddressSnafu {
720+ listener : listener_ref ( ) ,
721+ pod : pod_obj_ref ( ) ,
722+ } ) ?;
723+ Ok ( HbasePodRef {
724+ fqdn_override : Some ( listener_address. address ) ,
725+ ports : listener_address
726+ . ports
727+ . into_iter ( )
728+ . map ( |( port_name, port) | {
729+ let port = u16:: try_from ( port) . context ( PortOutOfBoundsSnafu {
730+ port_name : & port_name,
731+ port,
732+ } ) ?;
733+ Ok ( ( port_name, port) )
734+ } )
735+ . collect :: < Result < _ , _ > > ( ) ?,
736+ ..pod_ref
737+ } )
738+ } ) )
739+ . await
740+ }
741+
742+ pub fn merged_listener_class (
743+ & self ,
744+ role : & HbaseRole ,
745+ rolegroup_name : & String ,
746+ ) -> Option < SupportedListenerClasses > {
747+ match role {
748+ HbaseRole :: Master => {
749+ if let Some ( masters) = self . spec . masters . as_ref ( ) {
750+ let conf_defaults = Some ( SupportedListenerClasses :: ClusterInternal ) ;
751+ let mut conf_role = masters. config . config . listener_class . to_owned ( ) ;
752+ let mut conf_rolegroup = masters
753+ . role_groups
754+ . get ( rolegroup_name)
755+ . map ( |rg| rg. config . config . listener_class . clone ( ) )
756+ . unwrap_or_default ( ) ;
757+
758+ conf_role. merge ( & conf_defaults) ;
759+ conf_rolegroup. merge ( & conf_role) ;
760+
761+ tracing:: debug!( "Merged listener-class: {:?} for {role}" , conf_rolegroup) ;
762+ conf_rolegroup
763+ } else {
764+ None
765+ }
766+ }
767+ HbaseRole :: RegionServer => {
768+ if let Some ( region_servers) = self . spec . region_servers . as_ref ( ) {
769+ let conf_defaults = Some ( SupportedListenerClasses :: ClusterInternal ) ;
770+ let mut conf_role = region_servers. config . config . listener_class . to_owned ( ) ;
771+ let mut conf_rolegroup = region_servers
772+ . role_groups
773+ . get ( rolegroup_name)
774+ . map ( |rg| rg. config . config . listener_class . clone ( ) )
775+ . unwrap_or_default ( ) ;
776+
777+ conf_role. merge ( & conf_defaults) ;
778+ conf_rolegroup. merge ( & conf_role) ;
779+
780+ tracing:: debug!( "Merged listener-class: {:?} for {role}" , conf_rolegroup) ;
781+ conf_rolegroup
782+ } else {
783+ None
784+ }
785+ }
786+ HbaseRole :: RestServer => {
787+ if let Some ( rest_servers) = self . spec . rest_servers . as_ref ( ) {
788+ let conf_defaults = Some ( SupportedListenerClasses :: ClusterInternal ) ;
789+ let mut conf_role = rest_servers. config . config . listener_class . to_owned ( ) ;
790+ let mut conf_rolegroup = rest_servers
791+ . role_groups
792+ . get ( rolegroup_name)
793+ . map ( |rg| rg. config . config . listener_class . clone ( ) )
794+ . unwrap_or_default ( ) ;
795+
796+ conf_role. merge ( & conf_defaults) ;
797+ conf_rolegroup. merge ( & conf_role) ;
798+
799+ tracing:: debug!( "Merged listener-class: {:?} for {role}" , conf_rolegroup) ;
800+ conf_rolegroup
801+ } else {
802+ None
803+ }
804+ }
717805 }
718806 }
719807}
0 commit comments