@@ -94,12 +94,12 @@ use crate::{
9494 STACKABLE_LOG_DIR_NAME ,
9595 v1alpha1:: { self , HiveMetastoreRoleConfig } ,
9696 } ,
97- discovery:: { self , build_headless_role_group_metrics_service_name } ,
97+ discovery:: { self } ,
9898 kerberos:: {
9999 self , add_kerberos_pod_config, kerberos_config_properties,
100100 kerberos_container_start_commands,
101101 } ,
102- listener:: { LISTENER_VOLUME_DIR , LISTENER_VOLUME_NAME , build_role_listener} ,
102+ listener:: { LISTENER_VOLUME_DIR , LISTENER_VOLUME_NAME , build_role_listener, listener_ports } ,
103103 operations:: { graceful_shutdown:: add_graceful_shutdown_config, pdb:: add_pdbs} ,
104104 product_logging:: extend_role_group_config_map,
105105} ;
@@ -456,7 +456,7 @@ pub async fn reconcile_hive(
456456 . merged_config ( & HiveRole :: MetaStore , & rolegroup)
457457 . context ( FailedToResolveResourceConfigSnafu ) ?;
458458
459- let rg_service = build_rolegroup_service ( hive, & resolved_product_image, & rolegroup) ?;
459+ let rg_services = build_rolegroup_service ( hive, & resolved_product_image, & rolegroup) ?;
460460 let rg_configmap = build_metastore_rolegroup_config_map (
461461 hive,
462462 & hive_namespace,
@@ -478,12 +478,13 @@ pub async fn reconcile_hive(
478478 & rbac_sa. name_any ( ) ,
479479 ) ?;
480480
481- cluster_resources
482- . add ( client, rg_service)
483- . await
484- . context ( ApplyRoleGroupServiceSnafu {
485- rolegroup : rolegroup. clone ( ) ,
486- } ) ?;
481+ for rg_service in rg_services {
482+ cluster_resources. add ( client, rg_service) . await . context (
483+ ApplyRoleGroupServiceSnafu {
484+ rolegroup : rolegroup. clone ( ) ,
485+ } ,
486+ ) ?;
487+ }
487488
488489 cluster_resources
489490 . add ( client, rg_configmap)
@@ -720,39 +721,84 @@ fn build_rolegroup_service(
720721 hive : & v1alpha1:: HiveCluster ,
721722 resolved_product_image : & ResolvedProductImage ,
722723 rolegroup : & RoleGroupRef < v1alpha1:: HiveCluster > ,
723- ) -> Result < Service > {
724- Ok ( Service {
725- metadata : ObjectMetaBuilder :: new ( )
726- . name_and_namespace ( hive)
727- . name ( build_headless_role_group_metrics_service_name (
728- rolegroup. object_name ( ) ,
729- ) )
730- . ownerreference_from_resource ( hive, None , Some ( true ) )
731- . context ( ObjectMissingMetadataForOwnerRefSnafu ) ?
732- . with_recommended_labels ( build_recommended_labels (
733- hive,
734- & resolved_product_image. app_version_label ,
735- & rolegroup. role ,
736- & rolegroup. role_group ,
737- ) )
738- . context ( MetadataBuildSnafu ) ?
739- . with_label ( Label :: try_from ( ( "prometheus.io/scrape" , "true" ) ) . context ( LabelBuildSnafu ) ?)
740- . build ( ) ,
741- spec : Some ( ServiceSpec {
742- // Internal communication does not need to be exposed
743- type_ : Some ( "ClusterIP" . to_string ( ) ) ,
744- cluster_ip : Some ( "None" . to_string ( ) ) ,
745- ports : Some ( service_ports ( ) ) ,
746- selector : Some (
747- Labels :: role_group_selector ( hive, APP_NAME , & rolegroup. role , & rolegroup. role_group )
724+ ) -> Result < Vec < Service > > {
725+ let services = vec ! [
726+ Service {
727+ metadata: ObjectMetaBuilder :: new( )
728+ . name_and_namespace( hive)
729+ // TODO: Use method on RoleGroupRef once op-rs is released
730+ . name( hive. rolegroup_headless_metrics_service_name( rolegroup) )
731+ . ownerreference_from_resource( hive, None , Some ( true ) )
732+ . context( ObjectMissingMetadataForOwnerRefSnafu ) ?
733+ . with_recommended_labels( build_recommended_labels(
734+ hive,
735+ & resolved_product_image. app_version_label,
736+ & rolegroup. role,
737+ & rolegroup. role_group,
738+ ) )
739+ . context( MetadataBuildSnafu ) ?
740+ . with_label(
741+ Label :: try_from( ( "prometheus.io/scrape" , "true" ) ) . context( LabelBuildSnafu ) ?,
742+ )
743+ . build( ) ,
744+ spec: Some ( ServiceSpec {
745+ // Internal communication does not need to be exposed
746+ type_: Some ( "ClusterIP" . to_string( ) ) ,
747+ cluster_ip: Some ( "None" . to_string( ) ) ,
748+ ports: Some ( hive. metrics_ports( ) ) ,
749+ selector: Some (
750+ Labels :: role_group_selector(
751+ hive,
752+ APP_NAME ,
753+ & rolegroup. role,
754+ & rolegroup. role_group,
755+ )
748756 . context( LabelBuildSnafu ) ?
749757 . into( ) ,
750- ) ,
751- publish_not_ready_addresses : Some ( true ) ,
752- ..ServiceSpec :: default ( )
753- } ) ,
754- status : None ,
755- } )
758+ ) ,
759+ publish_not_ready_addresses: Some ( true ) ,
760+ ..ServiceSpec :: default ( )
761+ } ) ,
762+ status: None ,
763+ } ,
764+ Service {
765+ metadata: ObjectMetaBuilder :: new( )
766+ . name_and_namespace( hive)
767+ // TODO: Use method on RoleGroupRef once op-rs is released
768+ . name( hive. rolegroup_headless_service_name( rolegroup) )
769+ . ownerreference_from_resource( hive, None , Some ( true ) )
770+ . context( ObjectMissingMetadataForOwnerRefSnafu ) ?
771+ . with_recommended_labels( build_recommended_labels(
772+ hive,
773+ & resolved_product_image. app_version_label,
774+ & rolegroup. role,
775+ & rolegroup. role_group,
776+ ) )
777+ . context( MetadataBuildSnafu ) ?
778+ . build( ) ,
779+ spec: Some ( ServiceSpec {
780+ // Internal communication does not need to be exposed
781+ type_: Some ( "ClusterIP" . to_string( ) ) ,
782+ cluster_ip: Some ( "None" . to_string( ) ) ,
783+ // Expecting same ports as on listener service, just as a headless, internal service
784+ ports: Some ( hive. service_ports( ) ) ,
785+ selector: Some (
786+ Labels :: role_group_selector(
787+ hive,
788+ APP_NAME ,
789+ & rolegroup. role,
790+ & rolegroup. role_group,
791+ )
792+ . context( LabelBuildSnafu ) ?
793+ . into( ) ,
794+ ) ,
795+ publish_not_ready_addresses: Some ( true ) ,
796+ ..ServiceSpec :: default ( )
797+ } ) ,
798+ status: None ,
799+ } ,
800+ ] ;
801+ Ok ( services)
756802}
757803
758804/// The rolegroup [`StatefulSet`] runs the rolegroup, as configured by the administrator.
@@ -1100,9 +1146,8 @@ fn build_metastore_rolegroup_statefulset(
11001146 ) ,
11011147 ..LabelSelector :: default ( )
11021148 } ,
1103- service_name : Some ( build_headless_role_group_metrics_service_name (
1104- rolegroup_ref. object_name ( ) ,
1105- ) ) ,
1149+ // TODO: Use method on RoleGroupRef once op-rs is released
1150+ service_name : Some ( hive. rolegroup_headless_metrics_service_name ( rolegroup_ref) ) ,
11061151 template : pod_template,
11071152 volume_claim_templates : Some ( vec ! [ pvc] ) ,
11081153 ..StatefulSetSpec :: default ( )
@@ -1123,15 +1168,6 @@ pub fn error_policy(
11231168 }
11241169}
11251170
1126- pub fn service_ports ( ) -> Vec < ServicePort > {
1127- vec ! [ ServicePort {
1128- name: Some ( METRICS_PORT_NAME . to_string( ) ) ,
1129- port: METRICS_PORT . into( ) ,
1130- protocol: Some ( "TCP" . to_string( ) ) ,
1131- ..ServicePort :: default ( )
1132- } ]
1133- }
1134-
11351171/// Creates recommended `ObjectLabels` to be used in deployed resources
11361172pub fn build_recommended_labels < ' a , T > (
11371173 owner : & ' a T ,
0 commit comments