@@ -12,6 +12,7 @@ use stackable_operator::{
1212 k8s_openapi:: apimachinery:: pkg:: api:: resource:: Quantity ,
1313 kube:: { runtime:: reflector:: ObjectRef , CustomResource } ,
1414 product_config_utils:: { ConfigError , Configuration } ,
15+ product_logging:: { self , spec:: Logging } ,
1516 role_utils:: { Role , RoleGroup , RoleGroupRef } ,
1617 schemars:: { self , JsonSchema } ,
1718} ;
@@ -86,14 +87,18 @@ pub struct HbaseClusterSpec {
8687 pub zookeeper_config_map_name : String ,
8788 /// HDFS cluster connection details from discovery config map
8889 pub hdfs_config_map_name : String ,
90+ /// Name of the Vector aggregator discovery ConfigMap.
91+ /// It must contain the key `ADDRESS` with the address of the Vector aggregator.
92+ #[ serde( skip_serializing_if = "Option::is_none" ) ]
93+ pub vector_aggregator_config_map_name : Option < String > ,
8994 #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
90- pub config : Option < HbaseConfig > ,
95+ pub config : Option < HbaseConfigFragment > ,
9196 #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
92- pub masters : Option < Role < HbaseConfig > > ,
97+ pub masters : Option < Role < HbaseConfigFragment > > ,
9398 #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
94- pub region_servers : Option < Role < HbaseConfig > > ,
99+ pub region_servers : Option < Role < HbaseConfigFragment > > ,
95100 #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
96- pub rest_servers : Option < Role < HbaseConfig > > ,
101+ pub rest_servers : Option < Role < HbaseConfigFragment > > ,
97102}
98103
99104#[ derive(
@@ -161,33 +166,72 @@ impl HbaseRole {
161166) ]
162167pub struct HbaseStorageConfig { }
163168
164- #[ derive( Clone , Debug , Default , Deserialize , JsonSchema , PartialEq , Serialize ) ]
169+ #[ derive(
170+ Clone ,
171+ Debug ,
172+ Deserialize ,
173+ Display ,
174+ Eq ,
175+ EnumIter ,
176+ JsonSchema ,
177+ Ord ,
178+ PartialEq ,
179+ PartialOrd ,
180+ Serialize ,
181+ ) ]
165182#[ serde( rename_all = "camelCase" ) ]
183+ pub enum Container {
184+ Hbase ,
185+ Vector ,
186+ }
187+
188+ #[ derive( Clone , Debug , Default , Fragment , JsonSchema , PartialEq ) ]
189+ #[ fragment_attrs(
190+ derive(
191+ Clone ,
192+ Debug ,
193+ Default ,
194+ Deserialize ,
195+ Merge ,
196+ JsonSchema ,
197+ PartialEq ,
198+ Serialize
199+ ) ,
200+ serde( rename_all = "camelCase" )
201+ ) ]
166202pub struct HbaseConfig {
167203 #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
168204 pub hbase_rootdir : Option < String > ,
169205 #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
170206 pub hbase_opts : Option < String > ,
171- pub resources : Option < ResourcesFragment < HbaseStorageConfig , NoRuntimeLimits > > ,
207+ #[ fragment_attrs( serde( default ) ) ]
208+ pub resources : Resources < HbaseStorageConfig , NoRuntimeLimits > ,
209+ #[ fragment_attrs( serde( default ) ) ]
210+ pub logging : Logging < Container > ,
172211}
173212
174213impl HbaseConfig {
175- fn default_resources ( ) -> ResourcesFragment < HbaseStorageConfig , NoRuntimeLimits > {
176- ResourcesFragment {
177- cpu : CpuLimitsFragment {
178- min : Some ( Quantity ( "200m" . to_owned ( ) ) ) ,
179- max : Some ( Quantity ( "4" . to_owned ( ) ) ) ,
180- } ,
181- memory : MemoryLimitsFragment {
182- limit : Some ( Quantity ( "2Gi" . to_owned ( ) ) ) ,
183- runtime_limits : NoRuntimeLimitsFragment { } ,
214+ fn default_config ( ) -> HbaseConfigFragment {
215+ HbaseConfigFragment {
216+ hbase_rootdir : None ,
217+ hbase_opts : None ,
218+ resources : ResourcesFragment {
219+ cpu : CpuLimitsFragment {
220+ min : Some ( Quantity ( "200m" . to_owned ( ) ) ) ,
221+ max : Some ( Quantity ( "4" . to_owned ( ) ) ) ,
222+ } ,
223+ memory : MemoryLimitsFragment {
224+ limit : Some ( Quantity ( "2Gi" . to_owned ( ) ) ) ,
225+ runtime_limits : NoRuntimeLimitsFragment { } ,
226+ } ,
227+ storage : HbaseStorageConfigFragment { } ,
184228 } ,
185- storage : HbaseStorageConfigFragment { } ,
229+ logging : product_logging :: spec :: default_logging ( ) ,
186230 }
187231 }
188232}
189233
190- impl Configuration for HbaseConfig {
234+ impl Configuration for HbaseConfigFragment {
191235 type Configurable = HbaseCluster ;
192236
193237 fn compute_env (
@@ -277,7 +321,7 @@ impl HbaseCluster {
277321 }
278322 }
279323
280- pub fn get_role ( & self , role : & HbaseRole ) -> Option < & Role < HbaseConfig > > {
324+ pub fn get_role ( & self , role : & HbaseRole ) -> Option < & Role < HbaseConfigFragment > > {
281325 match role {
282326 HbaseRole :: Master => self . spec . masters . as_ref ( ) ,
283327 HbaseRole :: RegionServer => self . spec . region_servers . as_ref ( ) ,
@@ -289,7 +333,7 @@ impl HbaseCluster {
289333 pub fn get_role_group (
290334 & self ,
291335 rolegroup_ref : & RoleGroupRef < HbaseCluster > ,
292- ) -> Result < & RoleGroup < HbaseConfig > , Error > {
336+ ) -> Result < & RoleGroup < HbaseConfigFragment > , Error > {
293337 let role_variant =
294338 HbaseRole :: from_str ( & rolegroup_ref. role ) . with_context ( |_| InvalidRoleSnafu {
295339 role : rolegroup_ref. role . to_owned ( ) ,
@@ -316,27 +360,26 @@ impl HbaseCluster {
316360 }
317361
318362 /// Retrieve and merge resource configs for role and role groups
319- pub fn resolve_resource_config_for_role_and_rolegroup (
363+ pub fn merged_config (
320364 & self ,
321365 role : & HbaseRole ,
322366 rolegroup_ref : & RoleGroupRef < HbaseCluster > ,
323- ) -> Result < Resources < HbaseStorageConfig , NoRuntimeLimits > , Error > {
367+ ) -> Result < HbaseConfig , Error > {
324368 // Initialize the result with all default values as baseline
325- let conf_defaults = HbaseConfig :: default_resources ( ) ;
369+ let conf_defaults = HbaseConfig :: default_config ( ) ;
326370
327371 let role = self . get_role ( role) . context ( MissingHbaseRoleSnafu {
328372 role : role. to_string ( ) ,
329373 } ) ?;
330374
331375 // Retrieve role resource config
332- let mut conf_role: ResourcesFragment < HbaseStorageConfig , NoRuntimeLimits > =
333- role. config . config . resources . clone ( ) . unwrap_or_default ( ) ;
376+ let mut conf_role = role. config . config . to_owned ( ) ;
334377
335378 // Retrieve rolegroup specific resource config
336- let mut conf_rolegroup: ResourcesFragment < HbaseStorageConfig , NoRuntimeLimits > = role
379+ let mut conf_rolegroup = role
337380 . role_groups
338381 . get ( & rolegroup_ref. role_group )
339- . and_then ( |rg| rg. config . config . resources . clone ( ) )
382+ . map ( |rg| rg. config . config . clone ( ) )
340383 . unwrap_or_default ( ) ;
341384
342385 // Merge more specific configs into default config
@@ -347,7 +390,7 @@ impl HbaseCluster {
347390 conf_role. merge ( & conf_defaults) ;
348391 conf_rolegroup. merge ( & conf_role) ;
349392
350- tracing:: debug!( "Merged resource config: {:?}" , conf_rolegroup) ;
393+ tracing:: debug!( "Merged config: {:?}" , conf_rolegroup) ;
351394 fragment:: validate ( conf_rolegroup) . context ( FragmentValidationFailureSnafu )
352395 }
353396}
0 commit comments