Skip to content

Commit f5e0c8a

Browse files
committed
fix: remove ownerrefs
1 parent 89466ef commit f5e0c8a

4 files changed

Lines changed: 105 additions & 36 deletions

File tree

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

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,14 @@ use snafu::{ResultExt, Snafu};
44
use stackable_operator::{
55
builder::{configmap::ConfigMapBuilder, meta::ObjectMetaBuilder},
66
k8s_openapi::api::core::v1::ConfigMap,
7-
kube::runtime::reflector::ObjectRef,
87
utils::cluster_info::KubernetesClusterInfo,
98
};
109

1110
use crate::{
1211
build_recommended_labels,
1312
config::{CoreSiteConfigBuilder, HdfsSiteConfigBuilder},
1413
controller::build::properties::ConfigFileName,
15-
crd::{HdfsNodeRole, HdfsPodRef, v1alpha1},
14+
crd::{HdfsNodeRole, HdfsPodRef},
1615
hdfs_controller::{HDFS_CONTROLLER_NAME, ValidatedCluster},
1716
security::kerberos::KerberosConfig,
1817
};
@@ -22,10 +21,10 @@ type Result<T, E = Error> = std::result::Result<T, E>;
2221
#[derive(Snafu, Debug)]
2322
#[allow(clippy::enum_variant_names)]
2423
pub enum Error {
25-
#[snafu(display("object {hdfs} is missing metadata to build owner reference"))]
24+
#[snafu(display("object {name} is missing metadata to build owner reference"))]
2625
ObjectMissingMetadataForOwnerRef {
2726
source: stackable_operator::builder::meta::Error,
28-
hdfs: ObjectRef<v1alpha1::HdfsCluster>,
27+
name: String,
2928
},
3029

3130
#[snafu(display("failed to build ConfigMap"))]
@@ -42,23 +41,22 @@ pub enum Error {
4241
/// Creates a discovery config map containing the `hdfs-site.xml` and `core-site.xml`
4342
/// for clients.
4443
///
45-
/// The rendered content comes entirely from `cluster` (with the externally-resolved
46-
/// `cluster_info` and `namenode_podrefs`); `owner_ref` is retained only for the ConfigMap
47-
/// ObjectMeta / owner reference.
44+
/// The rendered content as well as the ConfigMap ObjectMeta / owner reference come
45+
/// entirely from `cluster` (with the externally-resolved `cluster_info` and
46+
/// `namenode_podrefs`).
4847
pub fn build_discovery_config_map(
4948
cluster: &ValidatedCluster,
5049
cluster_info: &KubernetesClusterInfo,
5150
namenode_podrefs: &[HdfsPodRef],
52-
owner_ref: &v1alpha1::HdfsCluster,
5351
) -> Result<ConfigMap> {
5452
let metadata = ObjectMetaBuilder::new()
55-
.name_and_namespace(owner_ref)
56-
.ownerreference_from_resource(owner_ref, None, Some(true))
53+
.name_and_namespace(cluster)
54+
.ownerreference_from_resource(cluster, None, Some(true))
5755
.context(ObjectMissingMetadataForOwnerRefSnafu {
58-
hdfs: ObjectRef::from_obj(owner_ref),
56+
name: cluster.name.to_string(),
5957
})?
6058
.with_recommended_labels(&build_recommended_labels(
61-
owner_ref,
59+
cluster,
6260
HDFS_CONTROLLER_NAME,
6361
&cluster.image.app_version_label_value,
6462
&HdfsNodeRole::Name.to_string(),

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ kind: HdfsCluster
9696
metadata:
9797
name: hdfs
9898
namespace: default
99+
uid: c2c8c5c0-0b5a-4b1e-9f3e-1a2b3c4d5e6f
99100
spec:
100101
image:
101102
productVersion: 3.4.0

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

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,14 @@
55
//! [`HdfsNodeRole::merged_config`], and the per-file `configOverrides` / `envOverrides`
66
//! are merged here (role group wins).
77
8-
use std::{collections::BTreeMap, str::FromStr};
8+
use std::collections::BTreeMap;
99

10-
use snafu::{OptionExt, ResultExt, Snafu};
10+
use snafu::{ResultExt, Snafu};
1111
use stackable_operator::{
1212
commons::product_image_selection,
1313
config::merge::Merge,
14-
kube::ResourceExt,
1514
role_utils::{GenericRoleConfig, JavaCommonConfig, Role, RoleGroup},
16-
v2::types::{kubernetes::NamespaceName, operator::ClusterName},
15+
v2::controller_utils::{get_cluster_name, get_namespace, get_uid},
1716
};
1817
use strum::IntoEnumIterator;
1918

@@ -33,17 +32,19 @@ pub enum Error {
3332
source: product_image_selection::Error,
3433
},
3534

36-
#[snafu(display("invalid cluster name"))]
37-
InvalidClusterName {
38-
source: stackable_operator::v2::macros::attributed_string_type::Error,
35+
#[snafu(display("failed to get the cluster name"))]
36+
GetClusterName {
37+
source: stackable_operator::v2::controller_utils::Error,
3938
},
4039

41-
#[snafu(display("the HdfsCluster has no namespace"))]
42-
ObjectHasNoNamespace,
40+
#[snafu(display("failed to get the cluster namespace"))]
41+
GetClusterNamespace {
42+
source: stackable_operator::v2::controller_utils::Error,
43+
},
4344

44-
#[snafu(display("invalid cluster namespace"))]
45-
InvalidNamespace {
46-
source: stackable_operator::v2::macros::attributed_string_type::Error,
45+
#[snafu(display("failed to get the cluster uid"))]
46+
GetClusterUid {
47+
source: stackable_operator::v2::controller_utils::Error,
4748
},
4849

4950
#[snafu(display("failed to resolve and merge config for role and role group"))]
@@ -91,17 +92,19 @@ pub fn validate_cluster(
9192
role_groups.insert(hdfs_role, group_configs);
9293
}
9394

94-
let namespace = hdfs.namespace().context(ObjectHasNoNamespaceSnafu)?;
95-
let namespace = NamespaceName::from_str(&namespace).context(InvalidNamespaceSnafu)?;
95+
let cluster_name = get_cluster_name(hdfs).context(GetClusterNameSnafu)?;
96+
let namespace = get_namespace(hdfs).context(GetClusterNamespaceSnafu)?;
97+
let uid = get_uid(hdfs).context(GetClusterUidSnafu)?;
9698

97-
Ok(ValidatedCluster {
98-
name: ClusterName::from_str(&hdfs.name_any()).context(InvalidClusterNameSnafu)?,
99+
Ok(ValidatedCluster::new(
100+
cluster_name,
99101
namespace,
100-
image: resolved_product_image,
101-
cluster_config: ValidatedClusterConfig::resolve(hdfs, hdfs_opa_config),
102+
uid,
103+
resolved_product_image,
104+
ValidatedClusterConfig::resolve(hdfs, hdfs_opa_config),
102105
role_groups,
103106
role_configs,
104-
})
107+
))
105108
}
106109

107110
/// Validates every role group of a role into a map keyed by role group name.

rust/operator-binary/src/hdfs_controller.rs

Lines changed: 72 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,10 @@ use stackable_operator::{
4141
rollout::check_statefulset_rollout_complete,
4242
},
4343
utils::cluster_info::KubernetesClusterInfo,
44-
v2::types::{kubernetes::NamespaceName, operator::ClusterName},
44+
v2::types::{
45+
kubernetes::{NamespaceName, Uid},
46+
operator::ClusterName,
47+
},
4548
};
4649
use strum::{EnumDiscriminants, IntoEnumIterator, IntoStaticStr};
4750

@@ -74,6 +77,10 @@ pub const CONTAINER_IMAGE_BASE_NAME: &str = "hadoop";
7477
/// the controller.
7578
#[derive(Clone, Debug)]
7679
pub struct ValidatedCluster {
80+
/// The cluster's object metadata (name, namespace and uid). Kept private and only
81+
/// exposed via the [`Resource`] implementation so this type can act as the owner
82+
/// when building owned objects.
83+
metadata: ObjectMeta,
7784
/// The logical (and Kubernetes object) name of the cluster.
7885
pub name: ClusterName,
7986
/// The cluster namespace, used to build kerberos principals.
@@ -85,6 +92,33 @@ pub struct ValidatedCluster {
8592
}
8693

8794
impl ValidatedCluster {
95+
pub fn new(
96+
name: ClusterName,
97+
namespace: NamespaceName,
98+
uid: Uid,
99+
image: ResolvedProductImage,
100+
cluster_config: ValidatedClusterConfig,
101+
role_groups: BTreeMap<HdfsNodeRole, BTreeMap<String, ValidatedRoleGroupConfig>>,
102+
role_configs: BTreeMap<HdfsNodeRole, ValidatedRoleConfig>,
103+
) -> Self {
104+
Self {
105+
metadata: ObjectMeta {
106+
name: Some(name.to_string()),
107+
namespace: Some(namespace.to_string()),
108+
// The uid is required so this type can produce valid owner references
109+
// (Kubernetes rejects owner references without a uid).
110+
uid: Some(uid.to_string()),
111+
..ObjectMeta::default()
112+
},
113+
name,
114+
namespace,
115+
image,
116+
cluster_config,
117+
role_groups,
118+
role_configs,
119+
}
120+
}
121+
88122
/// Builds the [`HdfsPodRef`]s expected for every pod of the given `role`, across
89123
/// all of its role groups.
90124
///
@@ -119,6 +153,39 @@ impl ValidatedCluster {
119153
}
120154
}
121155

156+
/// Lets [`ValidatedCluster`] be used as the owner [`Resource`] (e.g. in
157+
/// [`ObjectMetaBuilder::ownerreference_from_resource`]). The kind/group/version/plural
158+
/// are delegated to [`v1alpha1::HdfsCluster`] so the generated owner references are
159+
/// identical to the ones built from the raw cluster object.
160+
impl Resource for ValidatedCluster {
161+
type DynamicType = <v1alpha1::HdfsCluster as Resource>::DynamicType;
162+
type Scope = <v1alpha1::HdfsCluster as Resource>::Scope;
163+
164+
fn kind(dt: &Self::DynamicType) -> std::borrow::Cow<'_, str> {
165+
v1alpha1::HdfsCluster::kind(dt)
166+
}
167+
168+
fn group(dt: &Self::DynamicType) -> std::borrow::Cow<'_, str> {
169+
v1alpha1::HdfsCluster::group(dt)
170+
}
171+
172+
fn version(dt: &Self::DynamicType) -> std::borrow::Cow<'_, str> {
173+
v1alpha1::HdfsCluster::version(dt)
174+
}
175+
176+
fn plural(dt: &Self::DynamicType) -> std::borrow::Cow<'_, str> {
177+
v1alpha1::HdfsCluster::plural(dt)
178+
}
179+
180+
fn meta(&self) -> &ObjectMeta {
181+
&self.metadata
182+
}
183+
184+
fn meta_mut(&mut self) -> &mut ObjectMeta {
185+
&mut self.metadata
186+
}
187+
}
188+
122189
/// Cluster-wide settings resolved once during validation, so the build steps no
123190
/// longer need the raw `HdfsCluster` to render config.
124191
#[derive(Clone, Debug)]
@@ -415,14 +482,14 @@ pub async fn reconcile_hdfs(
415482
// to avoid the compiler error "E0716 (temporary value dropped while borrowed)".
416483
let mut metadata = ObjectMetaBuilder::new();
417484
let metadata = metadata
418-
.name_and_namespace(hdfs)
485+
.name_and_namespace(&validated_cluster)
419486
.name(rolegroup_ref.object_name())
420-
.ownerreference_from_resource(hdfs, None, Some(true))
487+
.ownerreference_from_resource(&validated_cluster, None, Some(true))
421488
.with_context(|_| ObjectMissingMetadataForOwnerRefSnafu {
422489
obj_ref: ObjectRef::from_obj(hdfs),
423490
})?
424491
.with_recommended_labels(&build_recommended_labels(
425-
hdfs,
492+
&validated_cluster,
426493
RESOURCE_MANAGER_HDFS_CONTROLLER,
427494
&resolved_product_image.app_version_label_value,
428495
&rolegroup_ref.role,
@@ -523,7 +590,6 @@ pub async fn reconcile_hdfs(
523590
.namenode_listener_refs(client)
524591
.await
525592
.context(CollectDiscoveryConfigSnafu)?,
526-
hdfs,
527593
)
528594
.context(BuildDiscoveryConfigMapSnafu)?;
529595

@@ -714,6 +780,7 @@ kind: HdfsCluster
714780
metadata:
715781
name: hdfs
716782
namespace: default
783+
uid: c2c8c5c0-0b5a-4b1e-9f3e-1a2b3c4d5e6f
717784
spec:
718785
image:
719786
productVersion: 3.4.0

0 commit comments

Comments
 (0)