@@ -43,8 +43,8 @@ use stackable_operator::{
4343 api:: {
4444 apps:: v1:: { StatefulSet , StatefulSetSpec } ,
4545 core:: v1:: {
46- ConfigMap , ConfigMapVolumeSource , EmptyDirVolumeSource , Probe , Service ,
47- ServiceSpec , TCPSocketAction , Volume ,
46+ ConfigMap , ConfigMapVolumeSource , EmptyDirVolumeSource , Probe , TCPSocketAction ,
47+ Volume ,
4848 } ,
4949 } ,
5050 apimachinery:: pkg:: {
@@ -56,7 +56,7 @@ use stackable_operator::{
5656 core:: { DeserializeGuard , error_boundary} ,
5757 runtime:: controller:: Action ,
5858 } ,
59- kvp:: { Label , Labels , ObjectLabels } ,
59+ kvp:: { Labels , ObjectLabels } ,
6060 logging:: controller:: ReconcilerError ,
6161 memory:: { BinaryMultiple , MemoryQuantity } ,
6262 product_config_utils:: { transform_all_roles_to_config, validate_all_roles_and_groups_config} ,
@@ -102,6 +102,10 @@ use crate::{
102102 listener:: { LISTENER_VOLUME_DIR , LISTENER_VOLUME_NAME , build_role_listener} ,
103103 operations:: { graceful_shutdown:: add_graceful_shutdown_config, pdb:: add_pdbs} ,
104104 product_logging:: extend_role_group_config_map,
105+ service:: {
106+ build_rolegroup_headless_service, build_rolegroup_metrics_service,
107+ rolegroup_metrics_service_name,
108+ } ,
105109} ;
106110
107111pub const HIVE_CONTROLLER_NAME : & str = "hivecluster" ;
@@ -345,6 +349,9 @@ pub enum Error {
345349 BuildListenerVolume {
346350 source : ListenerOperatorVolumeSourceBuilderError ,
347351 } ,
352+
353+ #[ snafu( display( "faild to configure service" ) ) ]
354+ ServiceConfiguration { source : crate :: service:: Error } ,
348355}
349356type Result < T , E = Error > = std:: result:: Result < T , E > ;
350357
@@ -456,7 +463,14 @@ pub async fn reconcile_hive(
456463 . merged_config ( & HiveRole :: MetaStore , & rolegroup)
457464 . context ( FailedToResolveResourceConfigSnafu ) ?;
458465
459- let rg_services = build_rolegroup_services ( hive, & resolved_product_image, & rolegroup) ?;
466+ let rg_metrics_service =
467+ build_rolegroup_metrics_service ( hive, & resolved_product_image, & rolegroup)
468+ . context ( ServiceConfigurationSnafu ) ?;
469+
470+ let rg_headless_service =
471+ build_rolegroup_headless_service ( hive, & resolved_product_image, & rolegroup)
472+ . context ( ServiceConfigurationSnafu ) ?;
473+
460474 let rg_configmap = build_metastore_rolegroup_config_map (
461475 hive,
462476 & hive_namespace,
@@ -478,13 +492,19 @@ pub async fn reconcile_hive(
478492 & rbac_sa. name_any ( ) ,
479493 ) ?;
480494
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- }
495+ cluster_resources
496+ . add ( client, rg_metrics_service)
497+ . await
498+ . context ( ApplyRoleGroupServiceSnafu {
499+ rolegroup : rolegroup. clone ( ) ,
500+ } ) ?;
501+
502+ cluster_resources
503+ . add ( client, rg_headless_service)
504+ . await
505+ . context ( ApplyRoleGroupServiceSnafu {
506+ rolegroup : rolegroup. clone ( ) ,
507+ } ) ?;
488508
489509 cluster_resources
490510 . add ( client, rg_configmap)
@@ -714,97 +734,10 @@ fn build_metastore_rolegroup_config_map(
714734 } )
715735}
716736
717- /// The rolegroup [`Service`] is a headless service that allows direct access to the instances of a certain rolegroup
718- ///
719- /// This is mostly useful for internal communication between peers, or for clients that perform client-side load balancing.
720- fn build_rolegroup_services (
721- hive : & v1alpha1:: HiveCluster ,
722- resolved_product_image : & ResolvedProductImage ,
723- rolegroup : & RoleGroupRef < v1alpha1:: HiveCluster > ,
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- )
756- . context( LabelBuildSnafu ) ?
757- . into( ) ,
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)
802- }
803-
804737/// The rolegroup [`StatefulSet`] runs the rolegroup, as configured by the administrator.
805738///
806739/// The [`Pod`](`stackable_operator::k8s_openapi::api::core::v1::Pod`)s are accessible through the
807- /// corresponding [`Service`] (from [`build_rolegroup_services `]).
740+ /// corresponding [`Service`] (from [`build_rolegroup_headless_service`] and [`build_rolegroup_metrics_service `]).
808741#[ allow( clippy:: too_many_arguments) ]
809742fn build_metastore_rolegroup_statefulset (
810743 hive : & v1alpha1:: HiveCluster ,
@@ -1147,7 +1080,7 @@ fn build_metastore_rolegroup_statefulset(
11471080 ..LabelSelector :: default ( )
11481081 } ,
11491082 // TODO: Use method on RoleGroupRef once op-rs is released
1150- service_name : Some ( hive . rolegroup_headless_metrics_service_name ( rolegroup_ref) ) ,
1083+ service_name : Some ( rolegroup_metrics_service_name ( rolegroup_ref) ) ,
11511084 template : pod_template,
11521085 volume_claim_templates : Some ( vec ! [ pvc] ) ,
11531086 ..StatefulSetSpec :: default ( )
0 commit comments