@@ -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