@@ -27,7 +27,7 @@ use stackable_operator::{
2727 DeepMerge ,
2828 api:: {
2929 apps:: v1:: { StatefulSet , StatefulSetSpec } ,
30- core:: v1:: { ConfigMap , Service , ServiceAccount , ServicePort , ServiceSpec } ,
30+ core:: v1:: { ConfigMap , ServiceAccount } ,
3131 } ,
3232 apimachinery:: pkg:: apis:: meta:: v1:: LabelSelector ,
3333 } ,
@@ -37,7 +37,7 @@ use stackable_operator::{
3737 core:: { DeserializeGuard , error_boundary} ,
3838 runtime:: { controller:: Action , events:: Recorder , reflector:: ObjectRef } ,
3939 } ,
40- kvp:: { Annotations , Label , LabelError , Labels } ,
40+ kvp:: { LabelError , Labels } ,
4141 logging:: controller:: ReconcilerError ,
4242 product_config_utils:: { transform_all_roles_to_config, validate_all_roles_and_groups_config} ,
4343 role_utils:: { GenericRoleConfig , RoleGroupRef } ,
@@ -69,6 +69,10 @@ use crate::{
6969 } ,
7070 product_logging:: extend_role_group_config_map,
7171 security:: { self , kerberos, opa:: HdfsOpaConfig } ,
72+ service:: {
73+ self , rolegroup_headless_service, rolegroup_metrics_service,
74+ rolegroup_native_metrics_service,
75+ } ,
7276} ;
7377
7478pub const RESOURCE_MANAGER_HDFS_CONTROLLER : & str = "hdfs-operator-hdfs-controller" ;
@@ -218,15 +222,9 @@ pub enum Error {
218222 #[ snafu( display( "failed to build roleGroup selector labels" ) ) ]
219223 RoleGroupSelectorLabels { source : crate :: crd:: Error } ,
220224
221- #[ snafu( display( "failed to build prometheus label" ) ) ]
222- BuildPrometheusLabel { source : LabelError } ,
223-
224225 #[ snafu( display( "failed to build cluster resources label" ) ) ]
225226 BuildClusterResourcesLabel { source : LabelError } ,
226227
227- #[ snafu( display( "failed to build role-group selector label" ) ) ]
228- BuildRoleGroupSelectorLabel { source : LabelError } ,
229-
230228 #[ snafu( display( "failed to build role-group volume claim templates from config" ) ) ]
231229 BuildRoleGroupVolumeClaimTemplates { source : container:: Error } ,
232230
@@ -250,6 +248,9 @@ pub enum Error {
250248 ResolveProductImage {
251249 source : product_image_selection:: Error ,
252250 } ,
251+
252+ #[ snafu( display( "failed to builds service" ) ) ]
253+ BuildService { source : service:: Error } ,
253254}
254255
255256impl ReconcilerError for Error {
@@ -392,6 +393,20 @@ pub async fn reconcile_hdfs(
392393
393394 let rolegroup_ref = hdfs. rolegroup_ref ( role_name, rolegroup_name) ;
394395
396+ let rg_service =
397+ rolegroup_headless_service ( hdfs, & role, & rolegroup_ref, & resolved_product_image)
398+ . context ( BuildServiceSnafu ) ?;
399+ let rg_metrics_service =
400+ rolegroup_metrics_service ( hdfs, & role, & rolegroup_ref, & resolved_product_image)
401+ . context ( BuildServiceSnafu ) ?;
402+ let rg_native_metrics_service = rolegroup_native_metrics_service (
403+ hdfs,
404+ & role,
405+ & rolegroup_ref,
406+ & resolved_product_image,
407+ )
408+ . context ( BuildServiceSnafu ) ?;
409+
395410 // We need to split the creation and the usage of the "metadata" variable in two statements.
396411 // to avoid the compiler error "E0716 (temporary value dropped while borrowed)".
397412 let mut metadata = ObjectMetaBuilder :: new ( ) ;
@@ -411,17 +426,6 @@ pub async fn reconcile_hdfs(
411426 ) )
412427 . context ( ObjectMetaSnafu ) ?;
413428
414- let rg_service = rolegroup_service ( hdfs, metadata, & role, & rolegroup_ref) ?;
415-
416- let rg_metrics_service =
417- rolegroup_metrics_service ( hdfs, & role, & rolegroup_ref, & resolved_product_image) ?;
418- let rg_native_metrics_service = rolegroup_native_metrics_service (
419- hdfs,
420- & role,
421- & rolegroup_ref,
422- & resolved_product_image,
423- ) ?;
424-
425429 let rg_configmap = rolegroup_config_map (
426430 hdfs,
427431 & client. kubernetes_cluster_info ,
@@ -584,195 +588,6 @@ pub async fn reconcile_hdfs(
584588 Ok ( Action :: await_change ( ) )
585589}
586590
587- fn rolegroup_service (
588- hdfs : & v1alpha1:: HdfsCluster ,
589- metadata : & ObjectMetaBuilder ,
590- role : & HdfsNodeRole ,
591- rolegroup_ref : & RoleGroupRef < v1alpha1:: HdfsCluster > ,
592- ) -> HdfsOperatorResult < Service > {
593- tracing:: info!( "Setting up Service for {:?}" , rolegroup_ref) ;
594-
595- let service_spec = ServiceSpec {
596- // Internal communication does not need to be exposed
597- type_ : Some ( "ClusterIP" . to_string ( ) ) ,
598- cluster_ip : Some ( "None" . to_string ( ) ) ,
599- ports : Some (
600- hdfs. ports ( role)
601- . into_iter ( )
602- . map ( |( name, value) | ServicePort {
603- name : Some ( name) ,
604- port : i32:: from ( value) ,
605- protocol : Some ( "TCP" . to_string ( ) ) ,
606- ..ServicePort :: default ( )
607- } )
608- . collect ( ) ,
609- ) ,
610- selector : Some (
611- hdfs. rolegroup_selector_labels ( rolegroup_ref)
612- . context ( RoleGroupSelectorLabelsSnafu ) ?
613- . into ( ) ,
614- ) ,
615- publish_not_ready_addresses : Some ( true ) ,
616- ..ServiceSpec :: default ( )
617- } ;
618-
619- Ok ( Service {
620- metadata : metadata. build ( ) ,
621- spec : Some ( service_spec) ,
622- status : None ,
623- } )
624- }
625-
626- fn rolegroup_metrics_service (
627- hdfs : & v1alpha1:: HdfsCluster ,
628- role : & HdfsNodeRole ,
629- rolegroup_ref : & RoleGroupRef < v1alpha1:: HdfsCluster > ,
630- resolved_product_image : & ResolvedProductImage ,
631- ) -> HdfsOperatorResult < Service > {
632- tracing:: info!( "Setting up metrics Service for {:?}" , rolegroup_ref) ;
633-
634- let service_spec = ServiceSpec {
635- // Internal communication does not need to be exposed
636- type_ : Some ( "ClusterIP" . to_string ( ) ) ,
637- cluster_ip : Some ( "None" . to_string ( ) ) ,
638- ports : Some (
639- hdfs. metrics_ports ( role)
640- . into_iter ( )
641- . map ( |( name, value) | ServicePort {
642- name : Some ( name) ,
643- port : i32:: from ( value) ,
644- protocol : Some ( "TCP" . to_string ( ) ) ,
645- ..ServicePort :: default ( )
646- } )
647- . collect ( ) ,
648- ) ,
649- selector : Some (
650- hdfs. rolegroup_selector_labels ( rolegroup_ref)
651- . context ( RoleGroupSelectorLabelsSnafu ) ?
652- . into ( ) ,
653- ) ,
654- publish_not_ready_addresses : Some ( true ) ,
655- ..ServiceSpec :: default ( )
656- } ;
657-
658- Ok ( Service {
659- metadata : ObjectMetaBuilder :: new ( )
660- . name_and_namespace ( hdfs)
661- . name ( rolegroup_ref. rolegroup_metrics_service_name ( ) )
662- . ownerreference_from_resource ( hdfs, None , Some ( true ) )
663- . with_context ( |_| ObjectMissingMetadataForOwnerRefSnafu {
664- obj_ref : ObjectRef :: from_obj ( hdfs) ,
665- } ) ?
666- . with_recommended_labels ( build_recommended_labels (
667- hdfs,
668- RESOURCE_MANAGER_HDFS_CONTROLLER ,
669- & resolved_product_image. app_version_label_value ,
670- & rolegroup_ref. role ,
671- & rolegroup_ref. role_group ,
672- ) )
673- . context ( ObjectMetaSnafu ) ?
674- . with_label (
675- Label :: try_from ( ( "prometheus.io/scrape" , "true" ) )
676- . context ( BuildPrometheusLabelSnafu ) ?,
677- )
678- . with_annotations (
679- Annotations :: try_from ( [
680- ( "prometheus.io/path" . to_owned ( ) , "/metrics" . to_owned ( ) ) ,
681- (
682- "prometheus.io/port" . to_owned ( ) ,
683- hdfs. metrics_port ( role) . to_string ( ) ,
684- ) ,
685- ( "prometheus.io/scheme" . to_owned ( ) , "http" . to_owned ( ) ) ,
686- ( "prometheus.io/scrape" . to_owned ( ) , "true" . to_owned ( ) ) ,
687- ] )
688- . expect ( "should be valid annotations" ) ,
689- )
690- . build ( ) ,
691- spec : Some ( service_spec) ,
692- status : None ,
693- } )
694- }
695-
696- fn rolegroup_native_metrics_service (
697- hdfs : & v1alpha1:: HdfsCluster ,
698- role : & HdfsNodeRole ,
699- rolegroup_ref : & RoleGroupRef < v1alpha1:: HdfsCluster > ,
700- resolved_product_image : & ResolvedProductImage ,
701- ) -> HdfsOperatorResult < Service > {
702- tracing:: info!( "Setting up native metrics Service for {:?}" , rolegroup_ref) ;
703-
704- let service_spec = ServiceSpec {
705- // Internal communication does not need to be exposed
706- type_ : Some ( "ClusterIP" . to_string ( ) ) ,
707- cluster_ip : Some ( "None" . to_string ( ) ) ,
708- ports : Some (
709- hdfs. native_metrics_ports ( role)
710- . into_iter ( )
711- . map ( |( name, value) | ServicePort {
712- name : Some ( name) ,
713- port : i32:: from ( value) ,
714- protocol : Some ( "TCP" . to_string ( ) ) ,
715- ..ServicePort :: default ( )
716- } )
717- . collect ( ) ,
718- ) ,
719- selector : Some (
720- hdfs. rolegroup_selector_labels ( rolegroup_ref)
721- . context ( RoleGroupSelectorLabelsSnafu ) ?
722- . into ( ) ,
723- ) ,
724- publish_not_ready_addresses : Some ( true ) ,
725- ..ServiceSpec :: default ( )
726- } ;
727-
728- Ok ( Service {
729- metadata : ObjectMetaBuilder :: new ( )
730- . name_and_namespace ( hdfs)
731- . name ( format ! (
732- "{name}-native-metrics" ,
733- name = rolegroup_ref. object_name( )
734- ) )
735- . ownerreference_from_resource ( hdfs, None , Some ( true ) )
736- . with_context ( |_| ObjectMissingMetadataForOwnerRefSnafu {
737- obj_ref : ObjectRef :: from_obj ( hdfs) ,
738- } ) ?
739- . with_recommended_labels ( build_recommended_labels (
740- hdfs,
741- RESOURCE_MANAGER_HDFS_CONTROLLER ,
742- & resolved_product_image. app_version_label_value ,
743- & rolegroup_ref. role ,
744- & rolegroup_ref. role_group ,
745- ) )
746- . context ( ObjectMetaSnafu ) ?
747- . with_label (
748- Label :: try_from ( ( "prometheus.io/scrape" , "true" ) )
749- . context ( BuildPrometheusLabelSnafu ) ?,
750- )
751- . with_annotations (
752- Annotations :: try_from ( [
753- ( "prometheus.io/path" . to_owned ( ) , "/prom" . to_owned ( ) ) ,
754- (
755- "prometheus.io/port" . to_owned ( ) ,
756- hdfs. native_metrics_port ( role) . to_string ( ) ,
757- ) ,
758- (
759- "prometheus.io/scheme" . to_owned ( ) ,
760- if hdfs. has_https_enabled ( ) {
761- "https" . to_owned ( )
762- } else {
763- "http" . to_owned ( )
764- } ,
765- ) ,
766- ( "prometheus.io/scrape" . to_owned ( ) , "true" . to_owned ( ) ) ,
767- ] )
768- . expect ( "should be valid annotations" ) ,
769- )
770- . build ( ) ,
771- spec : Some ( service_spec) ,
772- status : None ,
773- } )
774- }
775-
776591#[ allow( clippy:: too_many_arguments) ]
777592fn rolegroup_config_map (
778593 hdfs : & v1alpha1:: HdfsCluster ,
@@ -1026,7 +841,6 @@ fn rolegroup_statefulset(
1026841) -> HdfsOperatorResult < StatefulSet > {
1027842 tracing:: info!( "Setting up StatefulSet for {:?}" , rolegroup_ref) ;
1028843
1029- let object_name = rolegroup_ref. object_name ( ) ;
1030844 // PodBuilder for StatefulSet Pod template.
1031845 let mut pb = PodBuilder :: new ( ) ;
1032846
@@ -1061,7 +875,7 @@ fn rolegroup_statefulset(
1061875 merged_config,
1062876 env_overrides,
1063877 & hdfs. spec . cluster_config . zookeeper_config_map_name ,
1064- & object_name,
878+ & rolegroup_ref . object_name ( ) ,
1065879 namenode_podrefs,
1066880 & rolegroup_selector_labels,
1067881 )
@@ -1091,7 +905,7 @@ fn rolegroup_statefulset(
1091905 match_labels : Some ( rolegroup_selector_labels. into ( ) ) ,
1092906 ..LabelSelector :: default ( )
1093907 } ,
1094- service_name : Some ( object_name ) ,
908+ service_name : Some ( rolegroup_ref . rolegroup_headless_service_name ( ) ) ,
1095909 template : pod_template,
1096910
1097911 volume_claim_templates : Some ( pvcs) ,
0 commit comments