Skip to content

Commit 36cc1da

Browse files
committed
refactor: add uid, namespace to ValidatedCluster
1 parent 1523e25 commit 36cc1da

4 files changed

Lines changed: 129 additions & 57 deletions

File tree

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

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use stackable_operator::{
66
k8s_openapi::api::core::v1::ConfigMap,
77
product_logging::framework::VECTOR_CONFIG_FILE,
88
role_utils::RoleGroupRef,
9-
v2::config_file_writer::PropertiesWriterError,
9+
v2::{builder::meta::ownerreference_from_resource, config_file_writer::PropertiesWriterError},
1010
};
1111

1212
use crate::{
@@ -31,11 +31,6 @@ pub enum Error {
3131
role_group: String,
3232
},
3333

34-
#[snafu(display("object is missing metadata to build owner reference"))]
35-
ObjectMissingMetadataForOwnerRef {
36-
source: stackable_operator::builder::meta::Error,
37-
},
38-
3934
#[snafu(display("failed to build object meta data"))]
4035
ObjectMeta {
4136
source: stackable_operator::builder::meta::Error,
@@ -55,9 +50,6 @@ pub fn build_rolegroup_config_map(
5550
cluster: &ValidatedCluster,
5651
role: &HbaseRole,
5752
rolegroup_ref: &RoleGroupRef<v1alpha1::HbaseCluster>,
58-
// `owner` is retained only for the ConfigMap ObjectMeta / owner reference; the rendered
59-
// content comes entirely from `cluster`. To be decoupled in a follow-up.
60-
owner_ref: &v1alpha1::HbaseCluster,
6153
) -> Result<ConfigMap> {
6254
tracing::info!("Setting up ConfigMap for {:?}", rolegroup_ref);
6355

@@ -110,12 +102,11 @@ pub fn build_rolegroup_config_map(
110102
)?;
111103

112104
let cm_metadata = ObjectMetaBuilder::new()
113-
.name_and_namespace(owner_ref)
105+
.name_and_namespace(cluster)
114106
.name(rolegroup_ref.object_name())
115-
.ownerreference_from_resource(owner_ref, None, Some(true))
116-
.context(ObjectMissingMetadataForOwnerRefSnafu)?
107+
.ownerreference(ownerreference_from_resource(cluster, None, Some(true)))
117108
.with_recommended_labels(&build_recommended_labels(
118-
owner_ref,
109+
cluster,
119110
&cluster.image.app_version_label_value,
120111
&rolegroup_ref.role,
121112
&rolegroup_ref.role_group,

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

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,19 @@ use snafu::{ResultExt, Snafu};
66
use stackable_operator::{
77
builder::{configmap::ConfigMapBuilder, meta::ObjectMetaBuilder},
88
k8s_openapi::api::core::v1::ConfigMap,
9-
kube::runtime::reflector::ObjectRef,
10-
v2::config_file_writer::to_hadoop_xml,
9+
v2::{builder::meta::ownerreference_from_resource, config_file_writer::to_hadoop_xml},
1110
};
1211

1312
use crate::{
1413
controller::build::properties::ConfigFileName,
15-
crd::{HbaseRole, v1alpha1},
14+
crd::HbaseRole,
1615
hbase_controller::{ValidatedCluster, build_recommended_labels},
1716
};
1817

1918
type Result<T, E = Error> = std::result::Result<T, E>;
2019

2120
#[derive(Snafu, Debug)]
2221
pub enum Error {
23-
#[snafu(display("object {hbase} is missing metadata to build owner reference"))]
24-
ObjectMissingMetadataForOwnerRef {
25-
source: stackable_operator::builder::meta::Error,
26-
hbase: ObjectRef<v1alpha1::HbaseCluster>,
27-
},
28-
2922
#[snafu(display("failed to build ConfigMap"))]
3023
BuildConfigMap {
3124
source: stackable_operator::builder::configmap::Error,
@@ -38,13 +31,7 @@ pub enum Error {
3831
}
3932

4033
/// Creates a discovery config map containing the `hbase-site.xml` for clients.
41-
///
42-
/// The rendered content comes entirely from `cluster`; `owner_ref` is retained only for the
43-
/// ConfigMap ObjectMeta / owner reference.
44-
pub fn build_discovery_config_map(
45-
cluster: &ValidatedCluster,
46-
owner_ref: &v1alpha1::HbaseCluster,
47-
) -> Result<ConfigMap> {
34+
pub fn build_discovery_config_map(cluster: &ValidatedCluster) -> Result<ConfigMap> {
4835
let cluster_config = &cluster.cluster_config;
4936

5037
let mut hbase_site = cluster_config
@@ -55,13 +42,10 @@ pub fn build_discovery_config_map(
5542
ConfigMapBuilder::new()
5643
.metadata(
5744
ObjectMetaBuilder::new()
58-
.name_and_namespace(owner_ref)
59-
.ownerreference_from_resource(owner_ref, None, Some(true))
60-
.with_context(|_| ObjectMissingMetadataForOwnerRefSnafu {
61-
hbase: ObjectRef::from_obj(owner_ref),
62-
})?
45+
.name_and_namespace(cluster)
46+
.ownerreference(ownerreference_from_resource(cluster, None, Some(true)))
6347
.with_recommended_labels(&build_recommended_labels(
64-
owner_ref,
48+
cluster,
6549
&cluster.image.app_version_label_value,
6650
&HbaseRole::RegionServer.to_string(),
6751
"discovery",

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

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
1-
use std::{collections::BTreeMap, str::FromStr};
1+
use std::collections::BTreeMap;
22

33
use snafu::{ResultExt, Snafu};
44
use stackable_operator::{
55
commons::product_image_selection::{self},
66
config::merge::Merge,
7-
kube::ResourceExt,
87
role_utils::GenericRoleConfig,
98
utils::cluster_info::KubernetesClusterInfo,
10-
v2::types::operator::ClusterName,
9+
v2::controller_utils::{get_cluster_name, get_namespace, get_uid},
1110
};
1211
use strum::IntoEnumIterator;
1312

@@ -33,9 +32,9 @@ 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 determine the cluster identity (name, namespace and uid)"))]
36+
GetClusterIdentity {
37+
source: stackable_operator::v2::controller_utils::Error,
3938
},
4039

4140
#[snafu(display("the HbaseCluster has no {role} role defined"))]
@@ -130,10 +129,16 @@ pub fn validate_cluster(
130129
let ssl_server_settings = kerberos_ssl_server_settings(hbase);
131130
let ssl_client_settings = kerberos_ssl_client_settings(hbase);
132131

133-
Ok(ValidatedCluster {
134-
name: ClusterName::from_str(&hbase.name_any()).context(InvalidClusterNameSnafu)?,
135-
image: resolved_product_image,
136-
cluster_config: ValidatedClusterConfig {
132+
let name = get_cluster_name(hbase).context(GetClusterIdentitySnafu)?;
133+
let namespace = get_namespace(hbase).context(GetClusterIdentitySnafu)?;
134+
let uid = get_uid(hbase).context(GetClusterIdentitySnafu)?;
135+
136+
Ok(ValidatedCluster::new(
137+
name,
138+
namespace,
139+
uid,
140+
resolved_product_image,
141+
ValidatedClusterConfig {
137142
zookeeper_connection_information: dereferenced_objects.zookeeper_connection_information,
138143
hbase_opa_config: dereferenced_objects.hbase_opa_config,
139144
kerberos_enabled: hbase.has_kerberos_enabled(),
@@ -142,9 +147,9 @@ pub fn validate_cluster(
142147
ssl_server_settings,
143148
ssl_client_settings,
144149
},
145-
role_group_configs: role_groups,
150+
role_groups,
146151
role_configs,
147-
})
152+
))
148153
}
149154

150155
/// The names of the role groups defined for `role` in the spec.

rust/operator-binary/src/hbase_controller.rs

Lines changed: 102 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@ use stackable_operator::{
2626
ServicePort, ServiceSpec, TCPSocketAction, Volume,
2727
},
2828
},
29-
apimachinery::pkg::{apis::meta::v1::LabelSelector, util::intstr::IntOrString},
29+
apimachinery::pkg::{
30+
apis::meta::v1::{LabelSelector, ObjectMeta},
31+
util::intstr::IntOrString,
32+
},
3033
},
3134
kube::{
3235
Resource, ResourceExt,
@@ -49,7 +52,13 @@ use stackable_operator::{
4952
compute_conditions, operations::ClusterOperationsConditionBuilder,
5053
statefulset::StatefulSetConditionBuilder,
5154
},
52-
v2::types::operator::ClusterName,
55+
v2::{
56+
HasName, HasUid, NameIsValidLabelValue,
57+
types::{
58+
kubernetes::{NamespaceName, Uid},
59+
operator::ClusterName,
60+
},
61+
},
5362
};
5463
use strum::{EnumDiscriminants, IntoStaticStr};
5564

@@ -90,16 +99,100 @@ pub struct Ctx {
9099
/// every role and role group before any resources are created.
91100
#[derive(Clone, Debug)]
92101
pub struct ValidatedCluster {
102+
/// Backs the [`Resource`] implementation (provides `meta()`/`name_any()`) so the build
103+
/// functions can derive `ObjectMeta`, owner references and labels without the full
104+
/// `HbaseCluster` object. Holds only name, namespace and uid.
105+
metadata: ObjectMeta,
93106
/// The logical (and Kubernetes object) name of the cluster.
94-
// Populated now; consumed by the new build path in a later commit.
95-
#[allow(dead_code)]
96107
pub name: ClusterName,
108+
/// The namespace the cluster lives in. Part of the cluster identity; currently consumed via
109+
/// the [`Resource`] metadata (`name_and_namespace`) rather than read directly.
110+
#[allow(dead_code)]
111+
pub namespace: NamespaceName,
112+
/// The UID of the `HbaseCluster` object, used to build owner references.
113+
pub uid: Uid,
97114
pub image: ResolvedProductImage,
98115
pub cluster_config: ValidatedClusterConfig,
99116
pub role_group_configs: BTreeMap<HbaseRole, BTreeMap<String, ValidatedRoleGroupConfig>>,
100117
pub role_configs: BTreeMap<HbaseRole, ValidatedRoleConfig>,
101118
}
102119

120+
impl ValidatedCluster {
121+
#[allow(clippy::too_many_arguments)]
122+
pub fn new(
123+
name: ClusterName,
124+
namespace: NamespaceName,
125+
uid: Uid,
126+
image: ResolvedProductImage,
127+
cluster_config: ValidatedClusterConfig,
128+
role_group_configs: BTreeMap<HbaseRole, BTreeMap<String, ValidatedRoleGroupConfig>>,
129+
role_configs: BTreeMap<HbaseRole, ValidatedRoleConfig>,
130+
) -> Self {
131+
Self {
132+
metadata: ObjectMeta {
133+
name: Some(name.to_string()),
134+
namespace: Some(namespace.to_string()),
135+
uid: Some(uid.to_string()),
136+
..ObjectMeta::default()
137+
},
138+
name,
139+
namespace,
140+
uid,
141+
image,
142+
cluster_config,
143+
role_group_configs,
144+
role_configs,
145+
}
146+
}
147+
}
148+
149+
impl Resource for ValidatedCluster {
150+
type DynamicType = <v1alpha1::HbaseCluster as Resource>::DynamicType;
151+
type Scope = <v1alpha1::HbaseCluster as Resource>::Scope;
152+
153+
fn group(dt: &Self::DynamicType) -> std::borrow::Cow<'_, str> {
154+
v1alpha1::HbaseCluster::group(dt)
155+
}
156+
157+
fn version(dt: &Self::DynamicType) -> std::borrow::Cow<'_, str> {
158+
v1alpha1::HbaseCluster::version(dt)
159+
}
160+
161+
fn kind(dt: &Self::DynamicType) -> std::borrow::Cow<'_, str> {
162+
v1alpha1::HbaseCluster::kind(dt)
163+
}
164+
165+
fn plural(dt: &Self::DynamicType) -> std::borrow::Cow<'_, str> {
166+
v1alpha1::HbaseCluster::plural(dt)
167+
}
168+
169+
fn meta(&self) -> &ObjectMeta {
170+
&self.metadata
171+
}
172+
173+
fn meta_mut(&mut self) -> &mut ObjectMeta {
174+
&mut self.metadata
175+
}
176+
}
177+
178+
impl HasName for ValidatedCluster {
179+
fn to_name(&self) -> String {
180+
self.name.to_string()
181+
}
182+
}
183+
184+
impl HasUid for ValidatedCluster {
185+
fn to_uid(&self) -> Uid {
186+
self.uid.clone()
187+
}
188+
}
189+
190+
impl NameIsValidLabelValue for ValidatedCluster {
191+
fn to_label_value(&self) -> String {
192+
self.name.to_label_value()
193+
}
194+
}
195+
103196
/// Cluster-wide settings resolved once during validation.
104197
#[derive(Clone, Debug)]
105198
pub struct ValidatedClusterConfig {
@@ -353,7 +446,6 @@ pub async fn reconcile_hbase(
353446
&validated_cluster,
354447
hbase_role,
355448
&rolegroup,
356-
hbase,
357449
)
358450
.context(BuildRolegroupConfigMapSnafu)?;
359451
let rg_statefulset = build_rolegroup_statefulset(
@@ -411,8 +503,8 @@ pub async fn reconcile_hbase(
411503

412504
// Discovery CM will fail to build until the rest of the cluster has been deployed, so do it last
413505
// so that failure won't inhibit the rest of the cluster from booting up.
414-
let discovery_cm = build_discovery_config_map(&validated_cluster, hbase)
415-
.context(BuildDiscoveryConfigMapSnafu)?;
506+
let discovery_cm =
507+
build_discovery_config_map(&validated_cluster).context(BuildDiscoveryConfigMapSnafu)?;
416508
cluster_resources
417509
.add(client, discovery_cm)
418510
.await
@@ -881,12 +973,12 @@ pub fn error_policy(
881973
}
882974
}
883975

884-
pub fn build_recommended_labels<'a>(
885-
owner: &'a v1alpha1::HbaseCluster,
976+
pub fn build_recommended_labels<'a, R>(
977+
owner: &'a R,
886978
app_version: &'a str,
887979
role: &'a str,
888980
role_group: &'a str,
889-
) -> ObjectLabels<'a, v1alpha1::HbaseCluster> {
981+
) -> ObjectLabels<'a, R> {
890982
ObjectLabels {
891983
owner,
892984
app_name: APP_NAME,

0 commit comments

Comments
 (0)