Skip to content

Commit 8e8095f

Browse files
committed
refactor: get infailable ObjectMetaBuilder
1 parent f5e0c8a commit 8e8095f

2 files changed

Lines changed: 41 additions & 40 deletions

File tree

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

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,9 @@ use std::str::FromStr;
44

55
use snafu::{OptionExt, ResultExt, Snafu};
66
use stackable_operator::{
7-
builder::{configmap::ConfigMapBuilder, meta::ObjectMetaBuilder},
8-
k8s_openapi::api::core::v1::ConfigMap,
9-
product_logging::framework::VECTOR_CONFIG_FILE,
10-
role_utils::RoleGroupRef,
11-
utils::cluster_info::KubernetesClusterInfo,
12-
v2::config_file_writer::PropertiesWriterError,
7+
builder::configmap::ConfigMapBuilder, k8s_openapi::api::core::v1::ConfigMap,
8+
product_logging::framework::VECTOR_CONFIG_FILE, role_utils::RoleGroupRef,
9+
utils::cluster_info::KubernetesClusterInfo, v2::config_file_writer::PropertiesWriterError,
1310
};
1411

1512
use crate::{
@@ -51,11 +48,12 @@ type Result<T, E = Error> = std::result::Result<T, E>;
5148
pub fn build_rolegroup_config_map(
5249
cluster: &ValidatedCluster,
5350
cluster_info: &KubernetesClusterInfo,
54-
metadata: &ObjectMetaBuilder,
5551
rolegroup_ref: &RoleGroupRef<v1alpha1::HdfsCluster>,
5652
) -> Result<ConfigMap> {
5753
tracing::info!("Setting up ConfigMap for {:?}", rolegroup_ref);
5854

55+
let metadata = cluster.rolegroup_metadata(rolegroup_ref);
56+
5957
let role = HdfsNodeRole::from_str(&rolegroup_ref.role).with_context(|_| {
6058
UnidentifiedHdfsRoleSnafu {
6159
role: rolegroup_ref.role.clone(),

rust/operator-binary/src/hdfs_controller.rs

Lines changed: 36 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,40 @@ impl ValidatedCluster {
151151
})
152152
.collect()
153153
}
154+
155+
/// Builds the common [`ObjectMetaBuilder`] shared by a role group's owned resources
156+
/// (the ConfigMap and the StatefulSet): name, namespace, owner reference and the
157+
/// recommended labels, all derived from this validated cluster.
158+
///
159+
/// This is infallible: a [`ValidatedCluster`] always carries a name, namespace and
160+
/// uid, and its fail-safe typed values always produce valid label values, so neither
161+
/// the owner reference nor the recommended labels can fail to build.
162+
pub fn rolegroup_metadata(
163+
&self,
164+
rolegroup_ref: &RoleGroupRef<v1alpha1::HdfsCluster>,
165+
) -> ObjectMetaBuilder {
166+
let mut metadata = ObjectMetaBuilder::new();
167+
metadata
168+
.name_and_namespace(self)
169+
.name(rolegroup_ref.object_name())
170+
.ownerreference_from_resource(self, None, Some(true))
171+
.expect(
172+
"the owner reference is valid because the ValidatedCluster has an \
173+
api_version, kind, name and uid",
174+
)
175+
.with_recommended_labels(&build_recommended_labels(
176+
self,
177+
RESOURCE_MANAGER_HDFS_CONTROLLER,
178+
&self.image.app_version_label_value,
179+
&rolegroup_ref.role,
180+
&rolegroup_ref.role_group,
181+
))
182+
.expect(
183+
"the recommended labels are valid because the ValidatedCluster uses \
184+
fail-safe typed values",
185+
);
186+
metadata
187+
}
154188
}
155189

156190
/// Lets [`ValidatedCluster`] be used as the owner [`Resource`] (e.g. in
@@ -271,12 +305,6 @@ pub enum Error {
271305
name: String,
272306
},
273307

274-
#[snafu(display("no metadata for {obj_ref:?}"))]
275-
ObjectMissingMetadataForOwnerRef {
276-
source: stackable_operator::builder::meta::Error,
277-
obj_ref: ObjectRef<v1alpha1::HdfsCluster>,
278-
},
279-
280308
#[snafu(display("failed to build the role group ConfigMap"))]
281309
BuildRoleGroupConfigMap {
282310
source: crate::controller::build::config_map::Error,
@@ -341,11 +369,6 @@ pub enum Error {
341369
#[snafu(display("failed to build role-group volume claim templates from config"))]
342370
BuildRoleGroupVolumeClaimTemplates { source: container::Error },
343371

344-
#[snafu(display("failed to build object meta data"))]
345-
ObjectMeta {
346-
source: stackable_operator::builder::meta::Error,
347-
},
348-
349372
#[snafu(display("HdfsCluster object is invalid"))]
350373
InvalidHdfsCluster {
351374
source: error_boundary::InvalidObject,
@@ -478,29 +501,9 @@ pub async fn reconcile_hdfs(
478501
rolegroup_metrics_service(hdfs, &role, &rolegroup_ref, resolved_product_image)
479502
.context(BuildServiceSnafu)?;
480503

481-
// We need to split the creation and the usage of the "metadata" variable in two statements.
482-
// to avoid the compiler error "E0716 (temporary value dropped while borrowed)".
483-
let mut metadata = ObjectMetaBuilder::new();
484-
let metadata = metadata
485-
.name_and_namespace(&validated_cluster)
486-
.name(rolegroup_ref.object_name())
487-
.ownerreference_from_resource(&validated_cluster, None, Some(true))
488-
.with_context(|_| ObjectMissingMetadataForOwnerRefSnafu {
489-
obj_ref: ObjectRef::from_obj(hdfs),
490-
})?
491-
.with_recommended_labels(&build_recommended_labels(
492-
&validated_cluster,
493-
RESOURCE_MANAGER_HDFS_CONTROLLER,
494-
&resolved_product_image.app_version_label_value,
495-
&rolegroup_ref.role,
496-
&rolegroup_ref.role_group,
497-
))
498-
.context(ObjectMetaSnafu)?;
499-
500504
let rg_configmap = crate::controller::build::config_map::build_rolegroup_config_map(
501505
&validated_cluster,
502506
&client.kubernetes_cluster_info,
503-
metadata,
504507
&rolegroup_ref,
505508
)
506509
.context(BuildRoleGroupConfigMapSnafu)?;
@@ -509,7 +512,6 @@ pub async fn reconcile_hdfs(
509512
hdfs,
510513
&validated_cluster,
511514
&client.kubernetes_cluster_info,
512-
metadata,
513515
&role,
514516
&rolegroup_ref,
515517
resolved_product_image,
@@ -658,7 +660,6 @@ fn rolegroup_statefulset(
658660
hdfs: &v1alpha1::HdfsCluster,
659661
validated: &ValidatedCluster,
660662
cluster_info: &KubernetesClusterInfo,
661-
metadata: &ObjectMetaBuilder,
662663
role: &HdfsNodeRole,
663664
rolegroup_ref: &RoleGroupRef<v1alpha1::HdfsCluster>,
664665
resolved_product_image: &ResolvedProductImage,
@@ -746,6 +747,8 @@ fn rolegroup_statefulset(
746747
// This is due to problems that might appear when restarting pods during the initial formatting of namenodes.
747748
// See: https://github.com/stackabletech/hdfs-operator/issues/750 (disable restart-controller)
748749
// https://github.com/stackabletech/issues/issues/816 (enable restart-controller)
750+
let metadata = validated.rolegroup_metadata(rolegroup_ref);
751+
749752
Ok(StatefulSet {
750753
metadata: metadata.build(),
751754
spec: Some(statefulset_spec),

0 commit comments

Comments
 (0)