Skip to content

Commit 24a157a

Browse files
committed
refactor: switch to EnvVarSet
1 parent d58382c commit 24a157a

7 files changed

Lines changed: 106 additions & 99 deletions

File tree

rust/operator-binary/src/controller.rs

Lines changed: 7 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -196,9 +196,6 @@ pub enum Error {
196196
container_name: String,
197197
},
198198

199-
#[snafu(display("failed to resolve and merge config for role and role group"))]
200-
FailedToResolveConfig { source: crate::crd::Error },
201-
202199
#[snafu(display("failed to build git-sync resources"))]
203200
BuildGitSyncResources { source: build::git_sync::Error },
204201

@@ -406,11 +403,6 @@ pub async fn reconcile_nifi(
406403

407404
tracing::debug!("Processing rolegroup {}", rolegroup);
408405

409-
let merged_config = nifi
410-
.merged_config(&nifi_role, rolegroup_name)
411-
.context(FailedToResolveConfigSnafu)?;
412-
413-
// Computed here for the StatefulSet; the ConfigMap builder computes its own copy.
414406
let git_sync_resources =
415407
build::git_sync::build_git_sync_resources(&validated_cluster, rg)
416408
.context(BuildGitSyncResourcesSnafu)?;
@@ -462,7 +454,6 @@ pub async fn reconcile_nifi(
462454
&rolegroup,
463455
role,
464456
rg,
465-
&merged_config,
466457
authentication_config,
467458
authorization_config,
468459
rolling_upgrade_supported,
@@ -617,18 +608,6 @@ pub async fn reconcile_nifi(
617608

618609
const USERDATA_MOUNTPOINT: &str = "/stackable/userdata";
619610

620-
/// Build a `Vec<EnvVar>` from a plain `BTreeMap<String, String>` of env overrides.
621-
fn env_vars_from_overrides(env_overrides: &BTreeMap<String, String>) -> Vec<EnvVar> {
622-
env_overrides
623-
.iter()
624-
.map(|(name, value)| EnvVar {
625-
name: name.clone(),
626-
value: Some(value.clone()),
627-
..EnvVar::default()
628-
})
629-
.collect()
630-
}
631-
632611
/// The rolegroup [`StatefulSet`] runs the rolegroup, as configured by the administrator.
633612
///
634613
/// The [`Pod`](`stackable_operator::k8s_openapi::api::core::v1::Pod`)s are accessible through the
@@ -642,7 +621,6 @@ async fn build_node_rolegroup_statefulset(
642621
rolegroup_ref: &RoleGroupRef<v1alpha1::NifiCluster>,
643622
role: &NifiRoleType,
644623
rg: &NifiRoleGroupConfig,
645-
merged_config: &NifiConfig,
646624
authentication_config: &NifiAuthenticationConfig,
647625
authorization_config: &ResolvedNifiAuthorizationConfig,
648626
rolling_update_supported: bool,
@@ -651,9 +629,12 @@ async fn build_node_rolegroup_statefulset(
651629
git_sync_resources: &git_sync::v1alpha2::GitSyncResources,
652630
) -> Result<StatefulSet> {
653631
tracing::debug!("Building statefulset");
654-
let role_group = role.role_groups.get(&rolegroup_ref.role_group);
655632

656-
let mut env_vars: Vec<EnvVar> = env_vars_from_overrides(&rg.env_overrides);
633+
// The validated, merged `NifiConfig` is the single source of truth; the ConfigMap builder
634+
// sources the same `rg.config`.
635+
let merged_config = &rg.config;
636+
637+
let mut env_vars: Vec<EnvVar> = rg.env_overrides.clone().into();
657638

658639
// we need the POD_NAME env var to overwrite `nifi.cluster.node.address` later
659640
env_vars.push(EnvVar {
@@ -1153,10 +1134,8 @@ async fn build_node_rolegroup_statefulset(
11531134
);
11541135

11551136
let mut pod_template = pod_builder.build_template();
1156-
pod_template.merge_from(role.config.pod_overrides.clone());
1157-
if let Some(role_group) = role_group {
1158-
pod_template.merge_from(role_group.config.pod_overrides.clone());
1159-
}
1137+
// `rg.pod_overrides` is already the role <- rolegroup merge produced by the framework.
1138+
pod_template.merge_from(rg.pod_overrides.clone());
11601139

11611140
Ok(StatefulSet {
11621141
metadata: ObjectMetaBuilder::new()

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
//! Builds the git-sync resources (volumes, mounts, containers) for a NiFi Node rolegroup.
22
33
use snafu::{ResultExt, Snafu};
4-
use stackable_operator::crd::git_sync;
4+
use stackable_operator::{crd::git_sync, k8s_openapi::api::core::v1::EnvVar};
55

66
use crate::{
77
controller::{
8-
LOG_VOLUME_NAME, env_vars_from_overrides,
8+
LOG_VOLUME_NAME,
99
validate::{NifiRoleGroupConfig, ValidatedCluster},
1010
},
1111
crd::Container,
@@ -26,10 +26,11 @@ pub fn build_git_sync_resources(
2626
cluster: &ValidatedCluster,
2727
rg: &NifiRoleGroupConfig,
2828
) -> Result<git_sync::v1alpha2::GitSyncResources> {
29+
let env_vars: Vec<EnvVar> = rg.env_overrides.clone().into();
2930
git_sync::v1alpha2::GitSyncResources::new(
3031
&cluster.cluster_config.custom_components_git_sync,
3132
&cluster.image,
32-
&env_vars_from_overrides(&rg.env_overrides),
33+
&env_vars,
3334
&[],
3435
LOG_VOLUME_NAME,
3536
&rg.config.logging.for_container(&Container::GitSync),

rust/operator-binary/src/controller/build/properties/security_properties.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ pub fn build(rg: &NifiRoleGroupConfig) -> Result<String, PropertiesWriterError>
2727
mod tests {
2828
use std::collections::BTreeMap;
2929

30-
use stackable_operator::v2::config_overrides::KeyValueConfigOverrides;
30+
use stackable_operator::v2::{
31+
builder::pod::container::EnvVarSet, config_overrides::KeyValueConfigOverrides,
32+
};
3133

3234
use super::*;
3335
use crate::{
@@ -50,7 +52,7 @@ mod tests {
5052
},
5153
..Default::default()
5254
},
53-
env_overrides: BTreeMap::new(),
55+
env_overrides: EnvVarSet::new(),
5456
cli_overrides: BTreeMap::new(),
5557
pod_overrides: Default::default(),
5658
product_specific_common_config: JavaCommonConfig::default(),

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,9 @@ pub enum Error {
5858
#[snafu(display("invalid NiFi authentication configuration"))]
5959
InvalidAuthenticationConfig { source: authentication::Error },
6060

61-
#[snafu(display("failed to validate config fragment for a rolegroup"))]
62-
InvalidConfigFragment {
63-
source: stackable_operator::config::fragment::ValidationError,
61+
#[snafu(display("failed to build the config for a rolegroup"))]
62+
BuildRoleGroupConfig {
63+
source: crate::framework::role_utils::Error,
6464
},
6565

6666
#[snafu(display("invalid sensitive properties algorithm"))]
@@ -263,7 +263,7 @@ fn build_role_group_configs(
263263
for (rg_name, rg) in &role.role_groups {
264264
let validated_rg =
265265
with_validated_config::<NifiConfig, _, _, _, _>(rg, role, &default_config)
266-
.context(InvalidConfigFragmentSnafu)?;
266+
.context(BuildRoleGroupConfigSnafu)?;
267267
groups.insert(rg_name.clone(), validated_rg);
268268
}
269269

rust/operator-binary/src/crd/affinity.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,10 @@ mod tests {
3232
};
3333

3434
use super::*;
35-
use crate::crd::v1alpha1;
35+
use crate::{
36+
crd::{NifiConfig, v1alpha1},
37+
framework::role_utils::with_validated_config,
38+
};
3639

3740
#[test]
3841
fn test_affinity_defaults() {
@@ -58,7 +61,14 @@ mod tests {
5861
let deserializer = serde_yaml::Deserializer::from_str(input);
5962
let nifi: v1alpha1::NifiCluster =
6063
serde_yaml::with::singleton_map_recursive::deserialize(deserializer).unwrap();
61-
let merged_config = nifi.merged_config(&NifiRole::Node, "default").unwrap();
64+
65+
let role = nifi.spec.nodes.as_ref().unwrap();
66+
let default_config = NifiConfig::default_config("simple-nifi", &NifiRole::Node);
67+
let role_group = role.role_groups.get("default").unwrap();
68+
let merged_config =
69+
with_validated_config::<NifiConfig, _, _, _, _>(role_group, role, &default_config)
70+
.unwrap()
71+
.config;
6272

6373
assert_eq!(
6474
merged_config.affinity,

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

Lines changed: 2 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ use affinity::get_affinity;
77
use authorization::NifiAuthorization;
88
use sensitive_properties::NifiSensitivePropertiesConfig;
99
use serde::{Deserialize, Serialize};
10-
use snafu::{OptionExt, ResultExt, Snafu};
1110
use stackable_operator::{
1211
commons::{
1312
affinity::StackableAffinity,
@@ -18,17 +17,14 @@ use stackable_operator::{
1817
PvcConfig, PvcConfigFragment, Resources, ResourcesFragment,
1918
},
2019
},
21-
config::{
22-
fragment::{self, Fragment, ValidationError},
23-
merge::Merge,
24-
},
20+
config::{fragment::Fragment, merge::Merge},
2521
crd::{authentication::core as auth_core, git_sync},
2622
deep_merger::ObjectOverrides,
2723
k8s_openapi::{
2824
api::core::v1::{PodTemplateSpec, Volume},
2925
apimachinery::pkg::api::resource::Quantity,
3026
},
31-
kube::{CustomResource, ResourceExt, runtime::reflector::ObjectRef},
27+
kube::{CustomResource, runtime::reflector::ObjectRef},
3228
memory::MemoryQuantity,
3329
product_logging::{self, spec::Logging},
3430
role_utils::{GenericRoleConfig, JavaCommonConfig, Role, RoleGroupRef},
@@ -62,15 +58,6 @@ const DEFAULT_NODE_GRACEFUL_SHUTDOWN_TIMEOUT: Duration = Duration::from_minutes_
6258
pub type NifiRoleType =
6359
Role<NifiConfigFragment, v1alpha1::NifiConfigOverrides, NifiNodeRoleConfig, JavaCommonConfig>;
6460

65-
#[derive(Snafu, Debug)]
66-
pub enum Error {
67-
#[snafu(display("the NiFi role [{role}] is missing from spec"))]
68-
MissingNifiRole { role: String },
69-
70-
#[snafu(display("fragment validation failure"))]
71-
FragmentValidationFailure { source: ValidationError },
72-
}
73-
7461
#[versioned(
7562
version(name = "v1alpha1"),
7663
crates(
@@ -230,37 +217,6 @@ impl v1alpha1::NifiCluster {
230217
pub fn server_tls_secret_class(&self) -> &str {
231218
&self.spec.cluster_config.tls.server_secret_class
232219
}
233-
234-
/// Retrieve and merge resource configs for role and role groups
235-
pub fn merged_config(&self, role: &NifiRole, role_group: &str) -> Result<NifiConfig, Error> {
236-
// Initialize the result with all default values as baseline
237-
let conf_defaults = NifiConfig::default_config(&self.name_any(), role);
238-
239-
let role = self.spec.nodes.as_ref().context(MissingNifiRoleSnafu {
240-
role: role.to_string(),
241-
})?;
242-
243-
// Retrieve role resource config
244-
let mut conf_role = role.config.config.to_owned();
245-
246-
// Retrieve rolegroup specific resource config
247-
let mut conf_rolegroup = role
248-
.role_groups
249-
.get(role_group)
250-
.map(|rg| rg.config.config.clone())
251-
.unwrap_or_default();
252-
253-
// Merge more specific configs into default config
254-
// Hierarchy is:
255-
// 1. RoleGroup
256-
// 2. Role
257-
// 3. Default
258-
conf_role.merge(&conf_defaults);
259-
conf_rolegroup.merge(&conf_role);
260-
261-
tracing::debug!("Merged config: {:?}", conf_rolegroup);
262-
fragment::validate(conf_rolegroup).context(FragmentValidationFailureSnafu)
263-
}
264220
}
265221

266222
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]

0 commit comments

Comments
 (0)