Skip to content

Commit 56ba62a

Browse files
committed
refactor: switch to generic rolegroupconfig
1 parent db3a753 commit 56ba62a

5 files changed

Lines changed: 48 additions & 63 deletions

File tree

rust/operator-binary/src/controller/build/jvm.rs

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
use snafu::{OptionExt, ResultExt, Snafu};
2-
use stackable_operator::{
3-
memory::{BinaryMultiple, MemoryQuantity},
4-
v2::jvm_argument_overrides::JvmArgumentOverrides,
5-
};
2+
use stackable_operator::memory::{BinaryMultiple, MemoryQuantity};
63

74
use crate::{
8-
controller::build::kerberos::KRB5_CONFIG_PATH,
5+
controller::{HbaseRoleGroupConfig, ValidatedCluster, build::kerberos::KRB5_CONFIG_PATH},
96
crd::{AnyServiceConfig, CONFIG_DIR_NAME, JVM_SECURITY_PROPERTIES_FILE},
107
};
118

@@ -44,23 +41,24 @@ pub fn construct_global_jvm_args(kerberos_enabled: bool) -> String {
4441
/// JVM arguments that are specifically for the role (server), so will *not* be used e.g. by CLI tools.
4542
/// Heap settings are excluded, as they go into `HBASE_HEAPSIZE`.
4643
///
47-
/// `merged_jvm_argument_overrides` is the role <- role-group merged [`JvmArgumentOverrides`]
48-
/// produced by
49-
/// [`with_validated_config`](stackable_operator::v2::role_utils::with_validated_config). The
50-
/// operator-generated arguments below form the base that the user overrides are applied on top of.
44+
/// The role <- role-group merged `jvmArgumentOverrides` (from `rg.product_specific_common_config`)
45+
/// are applied on top of the operator-generated base arguments below.
5146
pub fn construct_role_specific_non_heap_jvm_args(
52-
kerberos_enabled: bool,
53-
merged_jvm_argument_overrides: &JvmArgumentOverrides,
47+
cluster: &ValidatedCluster,
48+
rg: &HbaseRoleGroupConfig,
5449
) -> String {
5550
let mut operator_generated = vec![format!(
5651
"-Djava.security.properties={CONFIG_DIR_NAME}/{JVM_SECURITY_PROPERTIES_FILE}"
5752
)];
5853

59-
if kerberos_enabled {
54+
if cluster.has_kerberos_enabled() {
6055
operator_generated.push(format!("-Djava.security.krb5.conf={KRB5_CONFIG_PATH}"));
6156
}
6257

63-
let mut jvm_args = merged_jvm_argument_overrides.apply_to(operator_generated);
58+
let mut jvm_args = rg
59+
.product_specific_common_config
60+
.jvm_argument_overrides
61+
.apply_to(operator_generated);
6462
jvm_args.retain(|arg| !is_heap_jvm_argument(arg));
6563

6664
jvm_args.join(" ")
@@ -136,10 +134,8 @@ mod tests {
136134
construct_hbase_heapsize_env(&region_server.config.config).unwrap();
137135

138136
assert_eq!(global_jvm_args, "");
139-
// `non_heap_jvm_args` is the output of `construct_role_specific_non_heap_jvm_args`,
140-
// pre-resolved during validation.
141137
assert_eq!(
142-
region_server.non_heap_jvm_args,
138+
construct_role_specific_non_heap_jvm_args(&validated_cluster, region_server),
143139
"-Djava.security.properties=/stackable/conf/security.properties"
144140
);
145141
assert_eq!(hbase_heapsize_env, "819m");
@@ -202,7 +198,7 @@ mod tests {
202198
"-Djava.security.krb5.conf=/stackable/kerberos/krb5.conf"
203199
);
204200
assert_eq!(
205-
region_server.non_heap_jvm_args,
201+
construct_role_specific_non_heap_jvm_args(&validated_cluster, region_server),
206202
"-Djava.security.properties=/stackable/conf/security.properties \
207203
-Djava.security.krb5.conf=/stackable/kerberos/krb5.conf \
208204
-Dhttps.proxyHost=proxy.my.corp \

rust/operator-binary/src/controller/build/resource/config_map.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,12 @@ use stackable_operator::{
1111
use crate::{
1212
controller::{
1313
ValidatedCluster,
14-
build::properties::{
15-
ConfigFileName, hbase_env, hbase_site, logging, security_properties, ssl_client,
16-
ssl_server,
14+
build::{
15+
jvm::construct_role_specific_non_heap_jvm_args,
16+
properties::{
17+
ConfigFileName, hbase_env, hbase_site, logging, security_properties, ssl_client,
18+
ssl_server,
19+
},
1720
},
1821
},
1922
crd::HbaseRole,
@@ -81,7 +84,7 @@ pub fn build_rolegroup_config_map(
8184
merged_config,
8285
role,
8386
cluster_config.kerberos_enabled,
84-
rg.non_heap_jvm_args.clone(),
87+
construct_role_specific_non_heap_jvm_args(cluster, rg),
8588
overrides.hbase_env_sh.clone(),
8689
)
8790
.context(BuildHbaseEnvSnafu)?;

rust/operator-binary/src/controller/build/resource/statefulset.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ use stackable_operator::{
3636

3737
use crate::{
3838
controller::{
39-
ValidatedCluster, ValidatedRoleGroupConfig,
39+
HbaseRoleGroupConfig, ValidatedCluster,
4040
build::{
4141
graceful_shutdown::{self, add_graceful_shutdown_config},
4242
kerberos::{self, add_kerberos_pod_config},
@@ -99,7 +99,7 @@ pub fn build_rolegroup_statefulset(
9999
cluster: &ValidatedCluster,
100100
hbase_role: &HbaseRole,
101101
role_group_name: &RoleGroupName,
102-
validated_rg_config: &ValidatedRoleGroupConfig,
102+
validated_rg_config: &HbaseRoleGroupConfig,
103103
service_account: &ServiceAccount,
104104
) -> Result<StatefulSet> {
105105
let resolved_product_image = &cluster.image;

rust/operator-binary/src/controller/mod.rs

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ pub use stackable_operator::v2::types::operator::RoleGroupName;
1010
use stackable_operator::{
1111
builder::meta::ObjectMetaBuilder,
1212
commons::product_image_selection::ResolvedProductImage,
13-
k8s_openapi::{api::core::v1::PodTemplateSpec, apimachinery::pkg::apis::meta::v1::ObjectMeta},
13+
k8s_openapi::apimachinery::pkg::apis::meta::v1::ObjectMeta,
1414
kube::Resource,
1515
kvp::Labels,
1616
v2::{
1717
HasName, HasUid, NameIsValidLabelValue,
18-
builder::{meta::ownerreference_from_resource, pod::container::EnvVarSet},
18+
builder::meta::ownerreference_from_resource,
1919
kvp::label::{recommended_labels, role_group_selector},
2020
role_group_utils::ResourceNames,
2121
types::{
@@ -71,7 +71,7 @@ pub struct ValidatedCluster {
7171
/// value.
7272
pub product_version: ProductVersion,
7373
pub cluster_config: ValidatedClusterConfig,
74-
pub role_group_configs: BTreeMap<HbaseRole, BTreeMap<RoleGroupName, ValidatedRoleGroupConfig>>,
74+
pub role_group_configs: BTreeMap<HbaseRole, BTreeMap<RoleGroupName, HbaseRoleGroupConfig>>,
7575
pub role_configs: BTreeMap<HbaseRole, ValidatedRoleConfig>,
7676
}
7777

@@ -83,7 +83,7 @@ impl ValidatedCluster {
8383
uid: Uid,
8484
image: ResolvedProductImage,
8585
cluster_config: ValidatedClusterConfig,
86-
role_group_configs: BTreeMap<HbaseRole, BTreeMap<RoleGroupName, ValidatedRoleGroupConfig>>,
86+
role_group_configs: BTreeMap<HbaseRole, BTreeMap<RoleGroupName, HbaseRoleGroupConfig>>,
8787
role_configs: BTreeMap<HbaseRole, ValidatedRoleConfig>,
8888
) -> Self {
8989
// `app_version_label_value` is constructed to be a valid label value, so it is also a
@@ -283,15 +283,13 @@ pub struct ValidatedHbaseConfig {
283283
pub logging: validate::ValidatedLogging,
284284
}
285285

286-
#[derive(Clone, Debug)]
287-
pub struct ValidatedRoleGroupConfig {
288-
/// The desired number of replicas (defaulted to 1 during validation).
289-
pub replicas: u16,
290-
pub config: ValidatedHbaseConfig,
291-
pub config_overrides: v1alpha1::HbaseConfigOverrides,
292-
pub env_overrides: EnvVarSet,
293-
/// Merged (role <- role group) pod template overrides.
294-
pub pod_overrides: PodTemplateSpec,
295-
/// Pre-resolved role-specific non-heap JVM args (operator-generated + role/role-group overrides).
296-
pub non_heap_jvm_args: String,
297-
}
286+
/// Per-rolegroup configuration: a v2
287+
/// [`RoleGroupConfig`](stackable_operator::v2::role_utils::RoleGroupConfig) over the validated
288+
/// HBase config. The merged (role <- role group) `jvmArgumentOverrides` are available via
289+
/// `product_specific_common_config` and applied at build time by
290+
/// [`construct_role_specific_non_heap_jvm_args`](build::jvm::construct_role_specific_non_heap_jvm_args).
291+
pub type HbaseRoleGroupConfig = stackable_operator::v2::role_utils::RoleGroupConfig<
292+
ValidatedHbaseConfig,
293+
stackable_operator::v2::role_utils::JavaCommonConfig,
294+
v1alpha1::HbaseConfigOverrides,
295+
>;

rust/operator-binary/src/controller/validate.rs

Lines changed: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,11 @@ use strum::IntoEnumIterator;
2626

2727
use crate::{
2828
controller::{
29-
ValidatedCluster, ValidatedClusterConfig, ValidatedHbaseConfig, ValidatedRoleConfig,
30-
ValidatedRoleGroupConfig,
31-
build::{
32-
jvm::construct_role_specific_non_heap_jvm_args,
33-
kerberos::{
34-
kerberos_config_properties, kerberos_discovery_config_properties,
35-
kerberos_ssl_client_settings, kerberos_ssl_server_settings,
36-
},
29+
HbaseRoleGroupConfig, ValidatedCluster, ValidatedClusterConfig, ValidatedHbaseConfig,
30+
ValidatedRoleConfig,
31+
build::kerberos::{
32+
kerberos_config_properties, kerberos_discovery_config_properties,
33+
kerberos_ssl_client_settings, kerberos_ssl_server_settings,
3734
},
3835
dereference::DereferencedObjects,
3936
},
@@ -156,7 +153,6 @@ pub fn validate_cluster(
156153
for hbase_role in HbaseRole::iter() {
157154
let group_configs = match hbase_role {
158155
HbaseRole::Master => validate_role_group_configs(
159-
hbase,
160156
hbase.spec.masters.as_ref(),
161157
HbaseConfigFragment::default_config(
162158
&hbase_role,
@@ -167,7 +163,6 @@ pub fn validate_cluster(
167163
&vector_aggregator_config_map_name,
168164
)?,
169165
HbaseRole::RegionServer => validate_role_group_configs(
170-
hbase,
171166
hbase.spec.region_servers.as_ref(),
172167
RegionServerConfigFragment::default_config(
173168
&hbase_role,
@@ -178,7 +173,6 @@ pub fn validate_cluster(
178173
&vector_aggregator_config_map_name,
179174
)?,
180175
HbaseRole::RestServer => validate_role_group_configs(
181-
hbase,
182176
hbase.spec.rest_servers.as_ref(),
183177
HbaseConfigFragment::default_config(
184178
&hbase_role,
@@ -275,20 +269,18 @@ pub fn validate_cluster(
275269
/// `jvmArgumentOverrides` (role group wins) into a single merged
276270
/// [`RoleGroup`](stackable_operator::role_utils::RoleGroup). The per-role validated config
277271
/// is wrapped into [`AnyServiceConfig`] via `wrap`; the merged `envOverrides` are converted
278-
/// into an [`EnvVarSet`] (validating each name eagerly), and the role-specific non-heap JVM
279-
/// args are pre-resolved from the merged `jvmArgumentOverrides` so the build step stays a
280-
/// pure function of [`ValidatedCluster`].
272+
/// into an [`EnvVarSet`] (validating each name eagerly). The merged `jvmArgumentOverrides` are
273+
/// kept in `product_specific_common_config` and applied at build time.
281274
///
282275
/// Returns an empty map if the role is not configured.
283276
fn validate_role_group_configs<Config, ValidatedConfig>(
284-
hbase: &v1alpha1::HbaseCluster,
285277
role: Option<
286278
&Role<Config, v1alpha1::HbaseConfigOverrides, GenericRoleConfig, JavaCommonConfig>,
287279
>,
288280
default_config: Config,
289281
wrap: fn(ValidatedConfig) -> AnyServiceConfig,
290282
vector_aggregator_config_map_name: &Option<ConfigMapName>,
291-
) -> Result<BTreeMap<RoleGroupName, ValidatedRoleGroupConfig>, Error>
283+
) -> Result<BTreeMap<RoleGroupName, HbaseRoleGroupConfig>, Error>
292284
where
293285
Config: Clone + Merge,
294286
ValidatedConfig: FromFragment<Fragment = Config>,
@@ -318,16 +310,11 @@ where
318310
config,
319311
config_overrides,
320312
env_overrides,
321-
cli_overrides: _,
313+
cli_overrides,
322314
pod_overrides,
323315
product_specific_common_config,
324316
} = validated.config;
325317

326-
let non_heap_jvm_args = construct_role_specific_non_heap_jvm_args(
327-
hbase.has_kerberos_enabled(),
328-
&product_specific_common_config.jvm_argument_overrides,
329-
);
330-
331318
// Convert the merged env-override HashMap into an EnvVarSet, validating each name
332319
// eagerly. Keys are unique (HashMap), so insertion order is irrelevant.
333320
let mut env_overrides_set = EnvVarSet::new();
@@ -345,13 +332,14 @@ where
345332
// time. The build step then consumes the validated logging instead of the raw config.
346333
let logging = validate_logging(config.logging(), vector_aggregator_config_map_name)?;
347334

348-
let validated = ValidatedRoleGroupConfig {
335+
let validated = HbaseRoleGroupConfig {
349336
replicas: validated.replicas.unwrap_or(1),
350337
config: ValidatedHbaseConfig { config, logging },
351338
config_overrides,
352339
env_overrides: env_overrides_set,
340+
cli_overrides,
353341
pod_overrides,
354-
non_heap_jvm_args,
342+
product_specific_common_config,
355343
};
356344
Ok((role_group_name.clone(), validated))
357345
})

0 commit comments

Comments
 (0)