Skip to content

Commit d6d5fe4

Browse files
committed
fix: RegionMover fields should not be Optional
1 parent 40ae497 commit d6d5fe4

File tree

1 file changed

+90
-26
lines changed

1 file changed

+90
-26
lines changed

rust/crd/src/lib.rs

Lines changed: 90 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -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
)]
555560
pub 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

579584
impl 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)]
11901179
mod 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

Comments
 (0)