@@ -159,6 +159,183 @@ pub mod versioned {
159159 }
160160}
161161
162+ impl HasStatusCondition for v1alpha1:: HbaseCluster {
163+ fn conditions ( & self ) -> Vec < ClusterCondition > {
164+ match & self . status {
165+ Some ( status) => status. conditions . clone ( ) ,
166+ None => vec ! [ ] ,
167+ }
168+ }
169+ }
170+
171+ impl v1alpha1:: HbaseCluster {
172+ /// The name of the role-level load-balanced Kubernetes `Service`
173+ pub fn server_role_service_name ( & self ) -> Option < String > {
174+ self . metadata . name . clone ( )
175+ }
176+
177+ /// Metadata about a server rolegroup
178+ pub fn server_rolegroup_ref (
179+ & self ,
180+ role_name : impl Into < String > ,
181+ group_name : impl Into < String > ,
182+ ) -> RoleGroupRef < v1alpha1:: HbaseCluster > {
183+ RoleGroupRef {
184+ cluster : ObjectRef :: from_obj ( self ) ,
185+ role : role_name. into ( ) ,
186+ role_group : group_name. into ( ) ,
187+ }
188+ }
189+
190+ pub fn get_role (
191+ & self ,
192+ role : & HbaseRole ,
193+ ) -> Option < & Role < HbaseConfigFragment , GenericRoleConfig , JavaCommonConfig > > {
194+ match role {
195+ HbaseRole :: Master => self . spec . masters . as_ref ( ) ,
196+ HbaseRole :: RegionServer => self . spec . region_servers . as_ref ( ) ,
197+ HbaseRole :: RestServer => self . spec . rest_servers . as_ref ( ) ,
198+ }
199+ }
200+
201+ /// Get the RoleGroup struct for the given ref
202+ pub fn get_role_group (
203+ & self ,
204+ rolegroup_ref : & RoleGroupRef < v1alpha1:: HbaseCluster > ,
205+ ) -> Result < & RoleGroup < HbaseConfigFragment , JavaCommonConfig > , Error > {
206+ let role_variant =
207+ HbaseRole :: from_str ( & rolegroup_ref. role ) . with_context ( |_| InvalidRoleSnafu {
208+ role : rolegroup_ref. role . to_owned ( ) ,
209+ } ) ?;
210+ let role = self
211+ . get_role ( & role_variant)
212+ . with_context ( || MissingHbaseRoleSnafu {
213+ role : role_variant. to_string ( ) ,
214+ } ) ?;
215+ role. role_groups
216+ . get ( & rolegroup_ref. role_group )
217+ . with_context ( || MissingHbaseRoleGroupSnafu {
218+ role_group : rolegroup_ref. role_group . to_owned ( ) ,
219+ } )
220+ }
221+
222+ pub fn role_config ( & self , role : & HbaseRole ) -> Option < & GenericRoleConfig > {
223+ match role {
224+ HbaseRole :: Master => self . spec . masters . as_ref ( ) . map ( |m| & m. role_config ) ,
225+ HbaseRole :: RegionServer => self . spec . region_servers . as_ref ( ) . map ( |rs| & rs. role_config ) ,
226+ HbaseRole :: RestServer => self . spec . rest_servers . as_ref ( ) . map ( |rs| & rs. role_config ) ,
227+ }
228+ }
229+
230+ pub fn has_kerberos_enabled ( & self ) -> bool {
231+ self . kerberos_secret_class ( ) . is_some ( )
232+ }
233+
234+ pub fn kerberos_secret_class ( & self ) -> Option < String > {
235+ self . spec
236+ . cluster_config
237+ . authentication
238+ . as_ref ( )
239+ . map ( |a| & a. kerberos )
240+ . map ( |k| k. secret_class . clone ( ) )
241+ }
242+
243+ pub fn has_https_enabled ( & self ) -> bool {
244+ self . https_secret_class ( ) . is_some ( )
245+ }
246+
247+ pub fn https_secret_class ( & self ) -> Option < String > {
248+ self . spec
249+ . cluster_config
250+ . authentication
251+ . as_ref ( )
252+ . map ( |a| a. tls_secret_class . clone ( ) )
253+ }
254+
255+ /// Returns required port name and port number tuples depending on the role.
256+ /// Hbase versions 2.4.* will have three ports for each role
257+ /// Hbase versions 2.6.* will have two ports for each role. The metrics are available over the
258+ /// UI port.
259+ pub fn ports ( & self , role : & HbaseRole , hbase_version : & str ) -> Vec < ( String , u16 ) > {
260+ let result_without_metric_port: Vec < ( String , u16 ) > = match role {
261+ HbaseRole :: Master => vec ! [
262+ ( "master" . to_string( ) , HBASE_MASTER_PORT ) ,
263+ ( self . ui_port_name( ) , HBASE_MASTER_UI_PORT ) ,
264+ ] ,
265+ HbaseRole :: RegionServer => vec ! [
266+ ( "regionserver" . to_string( ) , HBASE_REGIONSERVER_PORT ) ,
267+ ( self . ui_port_name( ) , HBASE_REGIONSERVER_UI_PORT ) ,
268+ ] ,
269+ HbaseRole :: RestServer => vec ! [
270+ (
271+ if self . has_https_enabled( ) {
272+ HBASE_REST_PORT_NAME_HTTPS
273+ } else {
274+ HBASE_REST_PORT_NAME_HTTP
275+ }
276+ . to_string( ) ,
277+ HBASE_REST_PORT ,
278+ ) ,
279+ ( self . ui_port_name( ) , HBASE_REST_UI_PORT ) ,
280+ ] ,
281+ } ;
282+ if hbase_version. starts_with ( r"2.4" ) {
283+ result_without_metric_port
284+ . into_iter ( )
285+ . chain ( vec ! [ ( METRICS_PORT_NAME . to_string( ) , METRICS_PORT ) ] )
286+ . collect ( )
287+ } else {
288+ result_without_metric_port
289+ }
290+ }
291+
292+ /// Name of the port used by the Web UI, which depends on HTTPS usage
293+ fn ui_port_name ( & self ) -> String {
294+ if self . has_https_enabled ( ) {
295+ HBASE_UI_PORT_NAME_HTTPS
296+ } else {
297+ HBASE_UI_PORT_NAME_HTTP
298+ }
299+ . to_string ( )
300+ }
301+
302+ /// Retrieve and merge resource configs for role and role groups
303+ pub fn merged_config (
304+ & self ,
305+ role : & HbaseRole ,
306+ role_group : & str ,
307+ hdfs_discovery_cm_name : & str ,
308+ ) -> Result < HbaseConfig , Error > {
309+ // Initialize the result with all default values as baseline
310+ let conf_defaults = role. default_config ( & self . name_any ( ) , hdfs_discovery_cm_name) ;
311+
312+ let role = self . get_role ( role) . context ( MissingHbaseRoleSnafu {
313+ role : role. to_string ( ) ,
314+ } ) ?;
315+
316+ // Retrieve role resource config
317+ let mut conf_role = role. config . config . to_owned ( ) ;
318+
319+ // Retrieve rolegroup specific resource config
320+ let mut conf_rolegroup = role
321+ . role_groups
322+ . get ( role_group)
323+ . map ( |rg| rg. config . config . clone ( ) )
324+ . unwrap_or_default ( ) ;
325+
326+ // Merge more specific configs into default config
327+ // Hierarchy is:
328+ // 1. RoleGroup
329+ // 2. Role
330+ // 3. Default
331+ conf_role. merge ( & conf_defaults) ;
332+ conf_rolegroup. merge ( & conf_role) ;
333+
334+ tracing:: debug!( "Merged config: {:?}" , conf_rolegroup) ;
335+ fragment:: validate ( conf_rolegroup) . context ( FragmentValidationFailureSnafu )
336+ }
337+ }
338+
162339#[ derive( Snafu , Debug ) ]
163340pub enum Error {
164341 #[ snafu( display( "the role [{role}] is invalid and does not exist in HBase" ) ) ]
@@ -502,183 +679,6 @@ pub struct HbaseClusterStatus {
502679 pub conditions : Vec < ClusterCondition > ,
503680}
504681
505- impl HasStatusCondition for v1alpha1:: HbaseCluster {
506- fn conditions ( & self ) -> Vec < ClusterCondition > {
507- match & self . status {
508- Some ( status) => status. conditions . clone ( ) ,
509- None => vec ! [ ] ,
510- }
511- }
512- }
513-
514- impl v1alpha1:: HbaseCluster {
515- /// The name of the role-level load-balanced Kubernetes `Service`
516- pub fn server_role_service_name ( & self ) -> Option < String > {
517- self . metadata . name . clone ( )
518- }
519-
520- /// Metadata about a server rolegroup
521- pub fn server_rolegroup_ref (
522- & self ,
523- role_name : impl Into < String > ,
524- group_name : impl Into < String > ,
525- ) -> RoleGroupRef < v1alpha1:: HbaseCluster > {
526- RoleGroupRef {
527- cluster : ObjectRef :: from_obj ( self ) ,
528- role : role_name. into ( ) ,
529- role_group : group_name. into ( ) ,
530- }
531- }
532-
533- pub fn get_role (
534- & self ,
535- role : & HbaseRole ,
536- ) -> Option < & Role < HbaseConfigFragment , GenericRoleConfig , JavaCommonConfig > > {
537- match role {
538- HbaseRole :: Master => self . spec . masters . as_ref ( ) ,
539- HbaseRole :: RegionServer => self . spec . region_servers . as_ref ( ) ,
540- HbaseRole :: RestServer => self . spec . rest_servers . as_ref ( ) ,
541- }
542- }
543-
544- /// Get the RoleGroup struct for the given ref
545- pub fn get_role_group (
546- & self ,
547- rolegroup_ref : & RoleGroupRef < v1alpha1:: HbaseCluster > ,
548- ) -> Result < & RoleGroup < HbaseConfigFragment , JavaCommonConfig > , Error > {
549- let role_variant =
550- HbaseRole :: from_str ( & rolegroup_ref. role ) . with_context ( |_| InvalidRoleSnafu {
551- role : rolegroup_ref. role . to_owned ( ) ,
552- } ) ?;
553- let role = self
554- . get_role ( & role_variant)
555- . with_context ( || MissingHbaseRoleSnafu {
556- role : role_variant. to_string ( ) ,
557- } ) ?;
558- role. role_groups
559- . get ( & rolegroup_ref. role_group )
560- . with_context ( || MissingHbaseRoleGroupSnafu {
561- role_group : rolegroup_ref. role_group . to_owned ( ) ,
562- } )
563- }
564-
565- pub fn role_config ( & self , role : & HbaseRole ) -> Option < & GenericRoleConfig > {
566- match role {
567- HbaseRole :: Master => self . spec . masters . as_ref ( ) . map ( |m| & m. role_config ) ,
568- HbaseRole :: RegionServer => self . spec . region_servers . as_ref ( ) . map ( |rs| & rs. role_config ) ,
569- HbaseRole :: RestServer => self . spec . rest_servers . as_ref ( ) . map ( |rs| & rs. role_config ) ,
570- }
571- }
572-
573- pub fn has_kerberos_enabled ( & self ) -> bool {
574- self . kerberos_secret_class ( ) . is_some ( )
575- }
576-
577- pub fn kerberos_secret_class ( & self ) -> Option < String > {
578- self . spec
579- . cluster_config
580- . authentication
581- . as_ref ( )
582- . map ( |a| & a. kerberos )
583- . map ( |k| k. secret_class . clone ( ) )
584- }
585-
586- pub fn has_https_enabled ( & self ) -> bool {
587- self . https_secret_class ( ) . is_some ( )
588- }
589-
590- pub fn https_secret_class ( & self ) -> Option < String > {
591- self . spec
592- . cluster_config
593- . authentication
594- . as_ref ( )
595- . map ( |a| a. tls_secret_class . clone ( ) )
596- }
597-
598- /// Returns required port name and port number tuples depending on the role.
599- /// Hbase versions 2.4.* will have three ports for each role
600- /// Hbase versions 2.6.* will have two ports for each role. The metrics are available over the
601- /// UI port.
602- pub fn ports ( & self , role : & HbaseRole , hbase_version : & str ) -> Vec < ( String , u16 ) > {
603- let result_without_metric_port: Vec < ( String , u16 ) > = match role {
604- HbaseRole :: Master => vec ! [
605- ( "master" . to_string( ) , HBASE_MASTER_PORT ) ,
606- ( self . ui_port_name( ) , HBASE_MASTER_UI_PORT ) ,
607- ] ,
608- HbaseRole :: RegionServer => vec ! [
609- ( "regionserver" . to_string( ) , HBASE_REGIONSERVER_PORT ) ,
610- ( self . ui_port_name( ) , HBASE_REGIONSERVER_UI_PORT ) ,
611- ] ,
612- HbaseRole :: RestServer => vec ! [
613- (
614- if self . has_https_enabled( ) {
615- HBASE_REST_PORT_NAME_HTTPS
616- } else {
617- HBASE_REST_PORT_NAME_HTTP
618- }
619- . to_string( ) ,
620- HBASE_REST_PORT ,
621- ) ,
622- ( self . ui_port_name( ) , HBASE_REST_UI_PORT ) ,
623- ] ,
624- } ;
625- if hbase_version. starts_with ( r"2.4" ) {
626- result_without_metric_port
627- . into_iter ( )
628- . chain ( vec ! [ ( METRICS_PORT_NAME . to_string( ) , METRICS_PORT ) ] )
629- . collect ( )
630- } else {
631- result_without_metric_port
632- }
633- }
634-
635- /// Name of the port used by the Web UI, which depends on HTTPS usage
636- fn ui_port_name ( & self ) -> String {
637- if self . has_https_enabled ( ) {
638- HBASE_UI_PORT_NAME_HTTPS
639- } else {
640- HBASE_UI_PORT_NAME_HTTP
641- }
642- . to_string ( )
643- }
644-
645- /// Retrieve and merge resource configs for role and role groups
646- pub fn merged_config (
647- & self ,
648- role : & HbaseRole ,
649- role_group : & str ,
650- hdfs_discovery_cm_name : & str ,
651- ) -> Result < HbaseConfig , Error > {
652- // Initialize the result with all default values as baseline
653- let conf_defaults = role. default_config ( & self . name_any ( ) , hdfs_discovery_cm_name) ;
654-
655- let role = self . get_role ( role) . context ( MissingHbaseRoleSnafu {
656- role : role. to_string ( ) ,
657- } ) ?;
658-
659- // Retrieve role resource config
660- let mut conf_role = role. config . config . to_owned ( ) ;
661-
662- // Retrieve rolegroup specific resource config
663- let mut conf_rolegroup = role
664- . role_groups
665- . get ( role_group)
666- . map ( |rg| rg. config . config . clone ( ) )
667- . unwrap_or_default ( ) ;
668-
669- // Merge more specific configs into default config
670- // Hierarchy is:
671- // 1. RoleGroup
672- // 2. Role
673- // 3. Default
674- conf_role. merge ( & conf_defaults) ;
675- conf_rolegroup. merge ( & conf_role) ;
676-
677- tracing:: debug!( "Merged config: {:?}" , conf_rolegroup) ;
678- fragment:: validate ( conf_rolegroup) . context ( FragmentValidationFailureSnafu )
679- }
680- }
681-
682682pub fn merged_env ( rolegroup_config : Option < & BTreeMap < String , String > > ) -> Vec < EnvVar > {
683683 let merged_env: Vec < EnvVar > = if let Some ( rolegroup_config) = rolegroup_config {
684684 let env_vars_from_config: BTreeMap < String , EnvVar > = rolegroup_config
0 commit comments