Skip to content

Commit dbe2095

Browse files
committed
fix: introduce ValidatedRoleConfig
1 parent 2a8e5b4 commit dbe2095

3 files changed

Lines changed: 44 additions & 27 deletions

File tree

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use stackable_operator::{
2121
role_group_utils::ResourceNames,
2222
role_utils::JavaCommonConfig,
2323
types::{
24-
kubernetes::{NamespaceName, Uid},
24+
kubernetes::{ListenerClassName, NamespaceName, Uid},
2525
operator::{
2626
ClusterName, ControllerName, OperatorName, ProductName, ProductVersion,
2727
RoleGroupName, RoleName,
@@ -103,6 +103,9 @@ pub struct ValidatedCluster {
103103
/// The product version as a type-safe label value, used for the `app.kubernetes.io/version`
104104
/// label on built resources.
105105
pub product_version: ProductVersion,
106+
/// Per-role configuration (PodDisruptionBudget and listener class). The `nodes` role is
107+
/// mandatory, so this is always present.
108+
pub role_config: ValidatedRoleConfig,
106109
/// Cluster wide settings.
107110
pub cluster_config: ValidatedClusterConfig,
108111
/// Collected configuration per rolegroup.
@@ -131,6 +134,13 @@ pub struct ValidatedClusterConfig {
131134
pub reporting_task_pod_overrides: PodTemplateSpec,
132135
}
133136

137+
/// Per-role configuration extracted during validation.
138+
#[derive(Clone, Debug)]
139+
pub struct ValidatedRoleConfig {
140+
pub pdb: stackable_operator::commons::pdb::PdbConfig,
141+
pub listener_class: ListenerClassName,
142+
}
143+
134144
impl ValidatedCluster {
135145
/// Builds a [`ValidatedCluster`], deriving the synthetic [`ObjectMeta`] from name, namespace
136146
/// and uid so the struct can implement [`Resource`].
@@ -141,6 +151,7 @@ impl ValidatedCluster {
141151
uid: Uid,
142152
image: ResolvedProductImage,
143153
product_version: ProductVersion,
154+
role_config: ValidatedRoleConfig,
144155
role_group_configs: BTreeMap<NifiRole, BTreeMap<RoleGroupName, ValidatedRoleGroupConfig>>,
145156
cluster_config: ValidatedClusterConfig,
146157
) -> Self {
@@ -158,6 +169,7 @@ impl ValidatedCluster {
158169
uid,
159170
image,
160171
product_version,
172+
role_config,
161173
role_group_configs,
162174
cluster_config,
163175
}

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

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ use stackable_operator::{
2727
};
2828
use strum::{EnumDiscriminants, IntoStaticStr};
2929

30-
use super::{ValidatedCluster, ValidatedClusterConfig, ValidatedRoleGroupConfig};
30+
use super::{
31+
ValidatedCluster, ValidatedClusterConfig, ValidatedRoleConfig, ValidatedRoleGroupConfig,
32+
};
3133
use crate::{
3234
controller::{build::git_sync::build_git_sync_resources, dereference::DereferencedObjects},
3335
crd::{Container, NifiConfig, NifiRole, sensitive_properties, v1alpha1},
@@ -144,6 +146,17 @@ pub fn validate(
144146
let role_group_configs =
145147
build_role_group_configs(nifi, &image, &vector_aggregator_config_map_name)?;
146148

149+
// Per-role config (PDB + listener class), extracted here so downstream builders source it from
150+
// the `ValidatedCluster` rather than the raw `NifiCluster`. The `nodes` role is mandatory
151+
// (already enforced by `build_role_group_configs` above), so this is always present.
152+
let role_config = nifi
153+
.role_config(&NifiRole::Node)
154+
.map(|role_config| ValidatedRoleConfig {
155+
pdb: role_config.common.pod_disruption_budget.clone(),
156+
listener_class: role_config.listener_class.clone(),
157+
})
158+
.context(NoNodesDefinedSnafu)?;
159+
147160
let name = get_cluster_name(nifi).context(GetClusterNameSnafu)?;
148161
let namespace = dereferenced_objects.namespace.clone();
149162
let uid = get_uid(nifi).context(GetUidSnafu)?;
@@ -159,6 +172,7 @@ pub fn validate(
159172
uid,
160173
image,
161174
product_version,
175+
role_config,
162176
role_group_configs,
163177
ValidatedClusterConfig {
164178
authentication: authentication_config,

rust/operator-binary/src/nifi_controller.rs

Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ use stackable_operator::{
1515
runtime::controller::Action,
1616
},
1717
logging::controller::ReconcilerError,
18-
role_utils::GenericRoleConfig,
1918
shared::time::Duration,
2019
status::condition::{
2120
compute_conditions, operations::ClusterOperationsConditionBuilder,
@@ -44,7 +43,7 @@ use crate::{
4443
upgrade::{self, ClusterVersionUpdateState},
4544
validate,
4645
},
47-
crd::{APP_NAME, NifiNodeRoleConfig, NifiRole, NifiStatus, v1alpha1},
46+
crd::{APP_NAME, NifiRole, NifiStatus, v1alpha1},
4847
security::{
4948
authentication::NifiAuthenticationConfig, check_or_generate_oidc_admin_password,
5049
check_or_generate_sensitive_key,
@@ -359,33 +358,25 @@ pub async fn reconcile_nifi(
359358
.await?
360359
}
361360

362-
let role_config = nifi.role_config(&nifi_role);
363-
if let Some(NifiNodeRoleConfig {
364-
common: GenericRoleConfig {
365-
pod_disruption_budget: pdb,
366-
},
367-
listener_class,
368-
}) = role_config
369-
{
370-
if let Some(pdb) = build_pdb(pdb, &validated_cluster, &nifi_role) {
371-
cluster_resources
372-
.add(client, pdb)
373-
.await
374-
.context(ApplyPdbSnafu)?;
375-
}
376-
377-
let role_group_listener = build_group_listener(
378-
&validated_cluster,
379-
listener_class.to_owned(),
380-
group_listener_name(&validated_cluster, &nifi_role.to_string()),
381-
);
382-
361+
let role_config = &validated_cluster.role_config;
362+
if let Some(pdb) = build_pdb(&role_config.pdb, &validated_cluster, &nifi_role) {
383363
cluster_resources
384-
.add(client, role_group_listener)
364+
.add(client, pdb)
385365
.await
386-
.context(ApplyGroupListenerSnafu)?;
366+
.context(ApplyPdbSnafu)?;
387367
}
388368

369+
let role_group_listener = build_group_listener(
370+
&validated_cluster,
371+
role_config.listener_class.clone(),
372+
group_listener_name(&validated_cluster, &nifi_role.to_string()),
373+
);
374+
375+
cluster_resources
376+
.add(client, role_group_listener)
377+
.await
378+
.context(ApplyGroupListenerSnafu)?;
379+
389380
// Only add the reporting task in case it is enabled.
390381
if nifi.spec.cluster_config.create_reporting_task_job.enabled {
391382
if let Some((reporting_task_job, reporting_task_service)) = build_maybe_reporting_task(

0 commit comments

Comments
 (0)