Skip to content

Commit abde443

Browse files
committed
refactor(1): use NamespaceName and remove optional namespaces
1 parent 1520538 commit abde443

10 files changed

Lines changed: 79 additions & 84 deletions

File tree

Cargo.nix

Lines changed: 16 additions & 16 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust/operator-binary/src/controller.rs

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ use stackable_operator::{
5757
statefulset::StatefulSetConditionBuilder,
5858
},
5959
utils::{COMMON_BASH_TRAP_FUNCTIONS, cluster_info::KubernetesClusterInfo},
60+
v2::types::kubernetes::NamespaceName,
6061
};
6162
use strum::{EnumDiscriminants, IntoStaticStr};
6263
use tracing::Instrument;
@@ -123,9 +124,6 @@ pub enum Error {
123124
#[snafu(display("object defines no name"))]
124125
ObjectHasNoName,
125126

126-
#[snafu(display("object defines no namespace"))]
127-
ObjectHasNoNamespace,
128-
129127
#[snafu(display("failed to dereference resources"))]
130128
Dereference { source: dereference::Error },
131129

@@ -332,7 +330,7 @@ pub async fn reconcile_nifi(
332330
let authorization_config = &validated_cluster.cluster_config.authorization;
333331

334332
tracing::info!("Checking for sensitive key configuration");
335-
check_or_generate_sensitive_key(client, nifi)
333+
check_or_generate_sensitive_key(client, nifi, &validated_cluster.namespace)
336334
.await
337335
.context(SecuritySnafu)?;
338336

@@ -352,6 +350,7 @@ pub async fn reconcile_nifi(
352350
cluster_version_update_state = upgrade::cluster_version_update_state(
353351
nifi,
354352
client,
353+
&validated_cluster.namespace,
355354
&resolved_product_image.product_version,
356355
deployed_version,
357356
)
@@ -375,7 +374,7 @@ pub async fn reconcile_nifi(
375374
.context(CreateClusterResourcesSnafu)?;
376375

377376
if let NifiAuthenticationConfig::Oidc { .. } = authentication_config {
378-
check_or_generate_oidc_admin_password(client, nifi)
377+
check_or_generate_oidc_admin_password(client, nifi, &validated_cluster.namespace)
379378
.await
380379
.context(SecuritySnafu)?;
381380
}
@@ -470,6 +469,7 @@ pub async fn reconcile_nifi(
470469
nifi,
471470
resolved_product_image,
472471
&client.kubernetes_cluster_info,
472+
&validated_cluster.namespace,
473473
&rolegroup,
474474
role,
475475
rg,
@@ -568,6 +568,7 @@ pub async fn reconcile_nifi(
568568
nifi,
569569
resolved_product_image,
570570
&client.kubernetes_cluster_info,
571+
&validated_cluster.namespace,
571572
authentication_config,
572573
&rbac_sa.name_any(),
573574
)
@@ -648,6 +649,7 @@ async fn build_node_rolegroup_statefulset(
648649
nifi: &v1alpha1::NifiCluster,
649650
resolved_product_image: &ResolvedProductImage,
650651
cluster_info: &KubernetesClusterInfo,
652+
namespace: &NamespaceName,
651653
rolegroup_ref: &RoleGroupRef<v1alpha1::NifiCluster>,
652654
role: &NifiRoleType,
653655
rg: &NifiRoleGroupConfig,
@@ -723,11 +725,6 @@ async fn build_node_rolegroup_statefulset(
723725
let node_address = format!(
724726
"$POD_NAME.{service_name}.{namespace}.svc.{cluster_domain}",
725727
service_name = rolegroup_ref.rolegroup_headless_service_name(),
726-
namespace = &nifi
727-
.metadata
728-
.namespace
729-
.as_ref()
730-
.context(ObjectHasNoNamespaceSnafu)?,
731728
cluster_domain = cluster_info.cluster_domain,
732729
);
733730

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ pub(crate) fn resolved_overrides_for(
7979
/// self-contained.
8080
#[cfg(test)]
8181
pub(crate) mod test_support {
82-
use std::collections::BTreeMap;
82+
use std::{collections::BTreeMap, str::FromStr as _};
8383

8484
use stackable_operator::{
8585
commons::product_image_selection::ResolvedProductImage,
@@ -88,6 +88,7 @@ pub(crate) mod test_support {
8888
},
8989
kube::ResourceExt as _,
9090
kvp::LabelValue,
91+
v2::types::kubernetes::NamespaceName,
9192
};
9293

9394
use crate::{
@@ -161,6 +162,7 @@ pub(crate) mod test_support {
161162

162163
ValidatedCluster {
163164
name: "simple-nifi".to_string(),
165+
namespace: NamespaceName::from_str("default").expect("valid namespace"),
164166
image,
165167
role_group_configs,
166168
git_sync_resources: Default::default(),

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

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,14 @@
33
//! Fetches all Kubernetes objects referenced by the NifiCluster spec and returns
44
//! them in [`DereferencedObjects`].
55
6-
use snafu::{OptionExt, ResultExt, Snafu};
7-
use stackable_operator::client::Client;
6+
use snafu::{ResultExt, Snafu};
7+
use stackable_operator::{
8+
client::Client,
9+
v2::{
10+
controller_utils::{self, get_namespace},
11+
types::kubernetes::NamespaceName,
12+
},
13+
};
814

915
use crate::{
1016
crd::v1alpha1,
@@ -16,8 +22,8 @@ use crate::{
1622

1723
#[derive(Snafu, Debug)]
1824
pub enum Error {
19-
#[snafu(display("object defines no namespace"))]
20-
ObjectHasNoNamespace,
25+
#[snafu(display("failed to get the namespace"))]
26+
GetNamespace { source: controller_utils::Error },
2127

2228
#[snafu(display("failed to dereference NiFi authentication classes"))]
2329
DereferenceAuthenticationClasses { source: authentication::Error },
@@ -30,6 +36,8 @@ type Result<T, E = Error> = std::result::Result<T, E>;
3036

3137
/// Kubernetes objects referenced from the [`v1alpha1::NifiCluster`] spec, already fetched.
3238
pub struct DereferencedObjects {
39+
/// The namespace of the [`v1alpha1::NifiCluster`], parsed once here and reused everywhere.
40+
pub namespace: NamespaceName,
3341
pub authentication_classes: DereferencedAuthenticationClasses,
3442
pub authorization: DereferencedAuthorization,
3543
}
@@ -39,11 +47,7 @@ pub async fn dereference(
3947
client: &Client,
4048
nifi: &v1alpha1::NifiCluster,
4149
) -> Result<DereferencedObjects> {
42-
let namespace = nifi
43-
.metadata
44-
.namespace
45-
.as_deref()
46-
.context(ObjectHasNoNamespaceSnafu)?;
50+
let namespace = get_namespace(nifi).context(GetNamespaceSnafu)?;
4751

4852
let authentication_classes = DereferencedAuthenticationClasses::dereference(nifi, client)
4953
.await
@@ -52,12 +56,13 @@ pub async fn dereference(
5256
let authorization = DereferencedAuthorization::dereference(
5357
&nifi.spec.cluster_config.authorization,
5458
client,
55-
namespace,
59+
namespace.as_ref(),
5660
)
5761
.await
5862
.context(DereferenceAuthorizationSnafu)?;
5963

6064
Ok(DereferencedObjects {
65+
namespace,
6166
authentication_classes,
6267
authorization,
6368
})

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

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use stackable_operator::{
1313
kube::ResourceExt as _,
1414
role_utils::JavaCommonConfig,
1515
utils::cluster_info::KubernetesClusterInfo,
16+
v2::types::kubernetes::NamespaceName,
1617
};
1718
use strum::{EnumDiscriminants, IntoStaticStr};
1819

@@ -45,11 +46,6 @@ pub enum Error {
4546
#[snafu(display("invalid NiFi authentication configuration"))]
4647
InvalidAuthenticationConfig { source: authentication::Error },
4748

48-
#[snafu(display("failed to build reporting task service name"))]
49-
ReportingTask {
50-
source: crate::reporting_task::Error,
51-
},
52-
5349
#[snafu(display("failed to validate config fragment for a rolegroup"))]
5450
InvalidConfigFragment {
5551
source: stackable_operator::config::fragment::ValidationError,
@@ -76,6 +72,8 @@ type Result<T, E = Error> = std::result::Result<T, E>;
7672
pub struct ValidatedCluster {
7773
#[allow(dead_code)]
7874
pub name: String,
75+
/// The namespace of the NifiCluster, parsed once in the dereference step and reused everywhere.
76+
pub namespace: NamespaceName,
7977
pub image: ResolvedProductImage,
8078
pub role_group_configs: BTreeMap<NifiRole, BTreeMap<String, NifiRoleGroupConfig>>,
8179
/// The git-sync resources (volumes, mounts, containers) for each Node rolegroup,
@@ -122,7 +120,7 @@ pub fn validate(
122120
&dereferenced_objects.authorization,
123121
);
124122

125-
let proxy_hosts = compute_proxy_hosts(nifi, cluster_info)?;
123+
let proxy_hosts = compute_proxy_hosts(nifi, cluster_info, &dereferenced_objects.namespace);
126124

127125
let sensitive_properties_algorithm = nifi
128126
.spec
@@ -140,6 +138,7 @@ pub fn validate(
140138

141139
Ok(ValidatedCluster {
142140
name: nifi.name_any(),
141+
namespace: dereferenced_objects.namespace.clone(),
143142
image,
144143
role_group_configs,
145144
git_sync_resources,
@@ -203,7 +202,8 @@ fn build_git_sync_resources(
203202
fn compute_proxy_hosts(
204203
nifi: &v1alpha1::NifiCluster,
205204
cluster_info: &KubernetesClusterInfo,
206-
) -> Result<String> {
205+
namespace: &NamespaceName,
206+
) -> String {
207207
let host_header_check = &nifi.spec.cluster_config.host_header_check;
208208

209209
if host_header_check.allow_all {
@@ -215,7 +215,7 @@ fn compute_proxy_hosts(
215215
"spec.clusterConfig.hostHeaderCheck.additionalAllowedHosts is ignored and only '*' is added to the allow-list."
216216
)
217217
}
218-
return Ok("*".to_string());
218+
return "*".to_string();
219219
}
220220

221221
// Address and port are injected from the listener volume during the prepare container
@@ -227,14 +227,13 @@ fn compute_proxy_hosts(
227227
// Reporting task only exists for NiFi 1.x
228228
if nifi.spec.image.product_version().starts_with("1.") {
229229
let reporting_task_service_name =
230-
reporting_task::build_reporting_task_fqdn_service_name(nifi, cluster_info)
231-
.context(ReportingTaskSnafu)?;
230+
reporting_task::build_reporting_task_fqdn_service_name(nifi, cluster_info, namespace);
232231

233232
proxy_hosts.insert(format!("{reporting_task_service_name}:{HTTPS_PORT}"));
234233
}
235234

236235
let mut proxy_hosts = Vec::from_iter(proxy_hosts);
237236
proxy_hosts.sort();
238237

239-
Ok(proxy_hosts.join(","))
238+
proxy_hosts.join(",")
240239
}

rust/operator-binary/src/operations/upgrade.rs

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,18 @@
11
// TODO: This module can be removed once we don't support NiFi 1.x versions anymore
22
// It manages the version upgrade procedure for NiFi versions prior to NiFi 2, since rolling upgrade is not supported there yet
33

4-
use snafu::{OptionExt, ResultExt, Snafu};
4+
use snafu::{ResultExt, Snafu};
55
use stackable_operator::{
66
client::Client,
77
k8s_openapi::{api::apps::v1::StatefulSet, apimachinery::pkg::apis::meta::v1::LabelSelector},
88
kvp::Labels,
9+
v2::types::kubernetes::NamespaceName,
910
};
1011

1112
use crate::crd::{APP_NAME, NifiRole, v1alpha1};
1213

1314
#[derive(Snafu, Debug)]
1415
pub enum Error {
15-
#[snafu(display("object defines no namespace"))]
16-
ObjectHasNoNamespace,
17-
1816
#[snafu(display("failed to fetch deployed StatefulSets"))]
1917
FetchStatefulsets {
2018
source: stackable_operator::client::Error,
@@ -41,15 +39,10 @@ pub enum ClusterVersionUpdateState {
4139
pub async fn cluster_version_update_state(
4240
nifi: &v1alpha1::NifiCluster,
4341
client: &Client,
42+
namespace: &NamespaceName,
4443
resolved_version: &String,
4544
deployed_version: Option<&String>,
4645
) -> Result<ClusterVersionUpdateState> {
47-
let namespace = &nifi
48-
.metadata
49-
.namespace
50-
.clone()
51-
.with_context(|| ObjectHasNoNamespaceSnafu {})?;
52-
5346
// Handle full restarts for a version change
5447
match deployed_version {
5548
Some(deployed_version) => {
@@ -66,7 +59,7 @@ pub async fn cluster_version_update_state(
6659

6760
// Retrieve the deployed statefulsets to check on the current status of the restart
6861
let deployed_statefulsets = client
69-
.list_with_label_selector::<StatefulSet>(namespace, &selector)
62+
.list_with_label_selector::<StatefulSet>(namespace.as_ref(), &selector)
7063
.await
7164
.context(FetchStatefulsetsSnafu)?;
7265

0 commit comments

Comments
 (0)