@@ -583,6 +583,12 @@ impl v1alpha1::HbaseCluster {
583
583
}
584
584
}
585
585
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.
586
592
pub fn rolegroup_ref_and_replicas (
587
593
& self ,
588
594
role : & HbaseRole ,
@@ -596,6 +602,9 @@ impl v1alpha1::HbaseCluster {
596
602
// Order rolegroups consistently, to avoid spurious downstream rewrites
597
603
. collect :: < BTreeMap < _ , _ > > ( )
598
604
. into_iter ( )
605
+ . filter ( |( rolegroup_name, _) | {
606
+ self . resolved_listener_class_discoverable ( role, rolegroup_name)
607
+ } )
599
608
. map ( |( rolegroup_name, role_group) | {
600
609
(
601
610
self . rolegroup_ref ( HbaseRole :: Master . to_string ( ) , rolegroup_name) ,
@@ -611,6 +620,9 @@ impl v1alpha1::HbaseCluster {
611
620
// Order rolegroups consistently, to avoid spurious downstream rewrites
612
621
. collect :: < BTreeMap < _ , _ > > ( )
613
622
. into_iter ( )
623
+ . filter ( |( rolegroup_name, _) | {
624
+ self . resolved_listener_class_discoverable ( role, rolegroup_name)
625
+ } )
614
626
. map ( |( rolegroup_name, role_group) | {
615
627
(
616
628
self . rolegroup_ref ( HbaseRole :: RegionServer . to_string ( ) , rolegroup_name) ,
@@ -626,6 +638,9 @@ impl v1alpha1::HbaseCluster {
626
638
// Order rolegroups consistently, to avoid spurious downstream rewrites
627
639
. collect :: < BTreeMap < _ , _ > > ( )
628
640
. into_iter ( )
641
+ . filter ( |( rolegroup_name, _) | {
642
+ self . resolved_listener_class_discoverable ( role, rolegroup_name)
643
+ } )
629
644
. map ( |( rolegroup_name, role_group) | {
630
645
(
631
646
self . rolegroup_ref ( HbaseRole :: RestServer . to_string ( ) , rolegroup_name) ,
@@ -636,6 +651,19 @@ impl v1alpha1::HbaseCluster {
636
651
}
637
652
}
638
653
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
+
639
667
pub fn pod_refs (
640
668
& self ,
641
669
role : & HbaseRole ,
@@ -667,53 +695,113 @@ impl v1alpha1::HbaseCluster {
667
695
& self ,
668
696
client : & stackable_operator:: client:: Client ,
669
697
role : & HbaseRole ,
670
- merged_config : & AnyServiceConfig ,
671
698
hbase_version : & str ,
672
699
) -> 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
+ }
717
805
}
718
806
}
719
807
}
0 commit comments