@@ -368,7 +368,12 @@ impl AnyConfigFragment {
368368                    graceful_shutdown_timeout :  Some ( 
369369                        * DEFAULT_REGION_SERVER_GRACEFUL_SHUTDOWN_TIMEOUT , 
370370                    ) , 
371-                     region_mover :  RegionMoverFragment :: default ( ) , 
371+                     region_mover :  RegionMoverFragment  { 
372+                         run_before_shutdown :  Some ( false ) , 
373+                         max_threads :  Some ( 1 ) , 
374+                         ack :  Some ( true ) , 
375+                         cli_opts :  None , 
376+                     } , 
372377                } ) 
373378            } 
374379            HbaseRole :: RestServer  => AnyConfigFragment :: RestServer ( HbaseConfigFragment  { 
@@ -554,14 +559,14 @@ impl Configuration for HbaseConfigFragment {
554559) ] 
555560pub  struct  RegionMover  { 
556561    /// Move local regions to other servers before terminating a region server's pod. 
557-      run_before_shutdown :  Option < bool > , 
562+      run_before_shutdown :  bool , 
558563
559564    /// Maximum number of threads to use for moving regions. 
560-      max_threads :  Option < u16 > , 
565+      max_threads :  u16 , 
561566
562567    /// If enabled (default), the region mover will confirm that regions are available on the 
563568     /// source as well as the target pods before and after the move. 
564-      ack :  Option < bool > , 
569+      ack :  bool , 
565570
566571    #[ fragment_attrs( serde( flatten) ) ]  
567572    cli_opts :  Option < RegionMoverExtraCliOpts > , 
@@ -578,18 +583,7 @@ pub struct RegionMoverExtraCliOpts {
578583
579584impl  Atomic  for  RegionMoverExtraCliOpts  { } 
580585
581- impl  Default  for  RegionMover  { 
582-     fn  default ( )  -> Self  { 
583-         Self  { 
584-             run_before_shutdown :  Some ( false ) , 
585-             max_threads :  Some ( 1 ) , 
586-             ack :  Some ( true ) , 
587-             cli_opts :  None , 
588-         } 
589-     } 
590- } 
591- 
592- #[ derive( Clone ,  Debug ,  Default ,  Fragment ,  JsonSchema ,  PartialEq ) ]  
586+ #[ derive( Clone ,  Debug ,  Fragment ,  JsonSchema ,  PartialEq ) ]  
593587#[ fragment_attrs(  
594588    derive(  
595589        Clone ,  
@@ -637,8 +631,6 @@ impl Configuration for RegionServerConfigFragment {
637631        _role_name :  & str , 
638632    )  -> Result < BTreeMap < String ,  Option < String > > ,  stackable_operator:: product_config_utils:: Error > 
639633    { 
640-         // Maps env var name to env var object. This allows env_overrides to work 
641-         // as expected (i.e. users can override the env var value). 
642634        let  mut  vars:  BTreeMap < String ,  Option < String > >  = BTreeMap :: new ( ) ; 
643635
644636        vars. insert ( 
@@ -1137,8 +1129,7 @@ impl AnyServiceConfig {
11371129     pub  fn  region_mover_args ( & self )  -> String  { 
11381130        match  self  { 
11391131            AnyServiceConfig :: RegionServer ( config)  => { 
1140-                 // TODO: is unwrap_or() the correct way to do it ? (same below) 
1141-                 if  config. region_mover . run_before_shutdown . unwrap_or ( false )  { 
1132+                 if  config. region_mover . run_before_shutdown  { 
11421133                    let  timeout = config
11431134                        . graceful_shutdown_timeout 
11441135                        . map ( |d| { 
@@ -1151,11 +1142,11 @@ impl AnyServiceConfig {
11511142                        . unwrap_or ( DEFAULT_REGION_MOVER_TIMEOUT . as_secs ( ) ) ; 
11521143                    let  mut  command = vec ! [ 
11531144                        "--maxthreads" . to_string( ) , 
1154-                         config. region_mover. max_threads. unwrap_or ( 1 ) . to_string( ) , 
1145+                         config. region_mover. max_threads. to_string( ) , 
11551146                        "--timeout" . to_string( ) , 
11561147                        timeout. to_string( ) , 
11571148                    ] ; 
1158-                     if  !config. region_mover . ack . unwrap_or ( true )  { 
1149+                     if  !config. region_mover . ack  { 
11591150                        command. push ( "--noack" . to_string ( ) ) ; 
11601151                    } 
11611152
@@ -1178,24 +1169,24 @@ impl AnyServiceConfig {
11781169
11791170    pub  fn  run_region_mover ( & self )  -> bool  { 
11801171        match  self  { 
1181-             AnyServiceConfig :: RegionServer ( config)  => { 
1182-                 config. region_mover . run_before_shutdown . unwrap_or ( false ) 
1183-             } 
1172+             AnyServiceConfig :: RegionServer ( config)  => config. region_mover . run_before_shutdown , 
11841173            _ => false , 
11851174        } 
11861175    } 
11871176} 
11881177
11891178#[ cfg( test) ]  
11901179mod  tests { 
1180+     use  rstest:: rstest; 
1181+ 
11911182    use  std:: collections:: { BTreeMap ,  HashMap } ; 
11921183
11931184    use  indoc:: indoc; 
11941185    use  stackable_operator:: product_config_utils:: { 
11951186        transform_all_roles_to_config,  validate_all_roles_and_groups_config, 
11961187    } ; 
11971188
1198-     use  crate :: { merged_env,  HbaseCluster ,  HbaseRole } ; 
1189+     use  crate :: { merged_env,  AnyServiceConfig ,   HbaseCluster ,  HbaseRole ,   RegionMoverExtraCliOpts } ; 
11991190
12001191    use  product_config:: { types:: PropertyNameKind ,  ProductConfigManager } ; 
12011192
@@ -1292,4 +1283,77 @@ spec:
12921283            env_map. get( "TEST_VAR_FROM_MRG" ) 
12931284        ) ; 
12941285    } 
1286+ 
1287+     #[ rstest]  
1288+     #[ case( "default" ,  false ,  1 ,  vec![ ] ) ]  
1289+     #[ case( "groupRegionMover" ,  true ,  5 ,  vec![ "--some" . to_string( ) ,  "extra" . to_string( ) ] ) ]  
1290+     pub  fn  test_region_mover_merge ( 
1291+         #[ case]   role_group_name :  & str , 
1292+         #[ case]   run_before_shutdown :  bool , 
1293+         #[ case]   max_threads :  u16 , 
1294+         #[ case]   additional_mover_options :  Vec < String > , 
1295+     )  { 
1296+         let  input = indoc !  { r#" 
1297+ --- 
1298+ apiVersion: hbase.stackable.tech/v1alpha1 
1299+ kind: HbaseCluster 
1300+ metadata: 
1301+   name: test-hbase 
1302+ spec: 
1303+   image: 
1304+     productVersion: 2.4.18 
1305+   clusterConfig: 
1306+     hdfsConfigMapName: test-hdfs 
1307+     zookeeperConfigMapName: test-znode 
1308+   masters: 
1309+     roleGroups: 
1310+       default: 
1311+         replicas: 1 
1312+   restServers: 
1313+     roleGroups: 
1314+       default: 
1315+         replicas: 1 
1316+   regionServers: 
1317+     config: 
1318+       regionMover: 
1319+         runBeforeShutdown: False 
1320+     roleGroups: 
1321+       default: 
1322+         replicas: 1 
1323+       groupRegionMover: 
1324+         replicas: 1 
1325+         config: 
1326+           regionMover: 
1327+             runBeforeShutdown: True 
1328+             maxThreads: 5 
1329+             additionalMoverOptions: ["--some", "extra"] 
1330+         "# } ; 
1331+ 
1332+         let  deserializer = serde_yaml:: Deserializer :: from_str ( input) ; 
1333+         let  hbase:  HbaseCluster  =
1334+             serde_yaml:: with:: singleton_map_recursive:: deserialize ( deserializer) . unwrap ( ) ; 
1335+ 
1336+         let  hbase_role = HbaseRole :: RegionServer ; 
1337+         let  rolegroup = hbase. server_rolegroup_ref ( hbase_role. to_string ( ) ,  role_group_name) ; 
1338+ 
1339+         let  merged_config = hbase
1340+             . merged_config ( 
1341+                 & hbase_role, 
1342+                 & rolegroup. role_group , 
1343+                 & hbase. spec . cluster_config . hdfs_config_map_name , 
1344+             ) 
1345+             . unwrap ( ) ; 
1346+         if  let  AnyServiceConfig :: RegionServer ( config)  = merged_config { 
1347+             assert_eq ! ( run_before_shutdown,  config. region_mover. run_before_shutdown) ; 
1348+             assert_eq ! ( max_threads,  config. region_mover. max_threads) ; 
1349+             assert_eq ! ( 
1350+                 Some ( RegionMoverExtraCliOpts  { 
1351+                     additional_mover_options
1352+                 } ) , 
1353+                 config. region_mover. cli_opts
1354+             ) ; 
1355+         }  else  { 
1356+             panic ! ( "this shouldn't happen" ) ; 
1357+         } ; 
1358+     } 
12951359} 
0 commit comments