@@ -115,3 +115,125 @@ pub(crate) fn build_server_rolegroup_metrics_service(
115115 status : None ,
116116 }
117117}
118+
119+ #[ cfg( test) ]
120+ mod tests {
121+ use std:: str:: FromStr ;
122+
123+ use super :: * ;
124+ use crate :: {
125+ crd:: ZookeeperRole ,
126+ zk_controller:: test_support:: { minimal_zk, validated_cluster} ,
127+ } ;
128+
129+ const DEFAULT_ZK : & str = r#"
130+ apiVersion: zookeeper.stackable.tech/v1alpha1
131+ kind: ZookeeperCluster
132+ metadata:
133+ name: simple-zookeeper
134+ spec:
135+ image:
136+ productVersion: "3.9.5"
137+ servers:
138+ roleGroups:
139+ default:
140+ replicas: 3
141+ "# ;
142+
143+ fn port ( service : & Service , name : & str ) -> i32 {
144+ service
145+ . spec
146+ . as_ref ( )
147+ . unwrap ( )
148+ . ports
149+ . as_ref ( )
150+ . unwrap ( )
151+ . iter ( )
152+ . find ( |p| p. name . as_deref ( ) == Some ( name) )
153+ . unwrap_or_else ( || panic ! ( "missing service port {name}" ) )
154+ . port
155+ }
156+
157+ #[ test]
158+ fn headless_service_shape ( ) {
159+ let validated = validated_cluster ( & minimal_zk ( DEFAULT_ZK ) ) ;
160+ let rg = RoleGroupName :: from_str ( "default" ) . expect ( "valid role group name" ) ;
161+ let service = build_server_rolegroup_headless_service ( & validated, & rg) ;
162+
163+ assert_eq ! (
164+ service. metadata. name. as_deref( ) ,
165+ Some ( "simple-zookeeper-server-default-headless" )
166+ ) ;
167+
168+ let spec = service. spec . as_ref ( ) . unwrap ( ) ;
169+ assert_eq ! ( spec. type_. as_deref( ) , Some ( "ClusterIP" ) ) ;
170+ assert_eq ! ( spec. cluster_ip. as_deref( ) , Some ( "None" ) ) ;
171+ assert_eq ! ( spec. publish_not_ready_addresses, Some ( true ) ) ;
172+
173+ // Only the leader/election ports (independent of the client TLS matrix).
174+ assert_eq ! ( port( & service, ZOOKEEPER_LEADER_PORT_NAME ) , 2888 ) ;
175+ assert_eq ! ( port( & service, ZOOKEEPER_ELECTION_PORT_NAME ) , 3888 ) ;
176+ assert_eq ! ( spec. ports. as_ref( ) . unwrap( ) . len( ) , 2 ) ;
177+
178+ let selector = spec. selector . as_ref ( ) . unwrap ( ) ;
179+ assert_eq ! (
180+ selector
181+ . get( "app.kubernetes.io/component" )
182+ . map( String :: as_str) ,
183+ Some ( "server" )
184+ ) ;
185+ assert_eq ! (
186+ selector
187+ . get( "app.kubernetes.io/role-group" )
188+ . map( String :: as_str) ,
189+ Some ( "default" )
190+ ) ;
191+ }
192+
193+ #[ test]
194+ fn metrics_service_shape_and_prometheus_annotations ( ) {
195+ let validated = validated_cluster ( & minimal_zk ( DEFAULT_ZK ) ) ;
196+ let rg = RoleGroupName :: from_str ( "default" ) . expect ( "valid role group name" ) ;
197+ let rg_config = validated. role_group_configs [ & ZookeeperRole :: Server ] [ & rg] . clone ( ) ;
198+ let service = build_server_rolegroup_metrics_service ( & validated, & rg, & rg_config) ;
199+
200+ assert_eq ! (
201+ service. metadata. name. as_deref( ) ,
202+ Some ( "simple-zookeeper-server-default-metrics" )
203+ ) ;
204+
205+ // Prometheus scrape annotations.
206+ let annotations = service. metadata . annotations . as_ref ( ) . unwrap ( ) ;
207+ assert_eq ! (
208+ annotations. get( "prometheus.io/path" ) . map( String :: as_str) ,
209+ Some ( "/metrics" )
210+ ) ;
211+ assert_eq ! (
212+ annotations. get( "prometheus.io/port" ) . map( String :: as_str) ,
213+ Some ( "7000" )
214+ ) ;
215+ assert_eq ! (
216+ annotations. get( "prometheus.io/scheme" ) . map( String :: as_str) ,
217+ Some ( "http" )
218+ ) ;
219+ assert_eq ! (
220+ annotations. get( "prometheus.io/scrape" ) . map( String :: as_str) ,
221+ Some ( "true" )
222+ ) ;
223+ // ... and the scrape label.
224+ assert_eq ! (
225+ service
226+ . metadata
227+ . labels
228+ . as_ref( )
229+ . unwrap( )
230+ . get( "prometheus.io/scrape" )
231+ . map( String :: as_str) ,
232+ Some ( "true" )
233+ ) ;
234+
235+ // Legacy JMX port plus the Prometheus http port.
236+ assert_eq ! ( port( & service, JMX_METRICS_PORT_NAME ) , 9505 ) ;
237+ assert_eq ! ( port( & service, METRICS_PROVIDER_HTTP_PORT_NAME ) , 7000 ) ;
238+ }
239+ }
0 commit comments