Skip to content

Commit cfeb835

Browse files
committed
refactor: use v2 ownerref, add HasName and HasUid traits.
1 parent 75e4f30 commit cfeb835

5 files changed

Lines changed: 73 additions & 72 deletions

File tree

rust/operator-binary/src/controller.rs

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ use stackable_operator::{
7272
statefulset::StatefulSetConditionBuilder,
7373
},
7474
utils::COMMON_BASH_TRAP_FUNCTIONS,
75+
v2::{HasName, HasUid, builder::meta::ownerreference_from_resource},
7576
};
7677
use strum::EnumDiscriminants;
7778

@@ -139,11 +140,6 @@ pub enum Error {
139140
rolegroup: RoleGroupRef<v1alpha1::HiveCluster>,
140141
},
141142

142-
#[snafu(display("object is missing metadata to build owner reference"))]
143-
ObjectMissingMetadataForOwnerRef {
144-
source: stackable_operator::builder::meta::Error,
145-
},
146-
147143
#[snafu(display("failed to build discovery ConfigMap"))]
148144
BuildDiscoveryConfig { source: discovery::Error },
149145

@@ -323,6 +319,7 @@ pub struct ValidatedCluster {
323319
metadata: ObjectMeta,
324320
pub name: stackable_operator::v2::types::operator::ClusterName,
325321
pub namespace: stackable_operator::v2::types::kubernetes::NamespaceName,
322+
pub uid: stackable_operator::v2::types::kubernetes::Uid,
326323
pub image: ResolvedProductImage,
327324
pub role_config: Option<ValidatedRoleConfig>,
328325
pub cluster_config: ValidatedClusterConfig,
@@ -348,12 +345,21 @@ impl ValidatedCluster {
348345
},
349346
name,
350347
namespace,
348+
uid,
351349
image,
352350
role_config,
353351
cluster_config,
354352
role_group_configs,
355353
}
356354
}
355+
356+
/// The name of the per-role [`Listener`] object.
357+
///
358+
/// Must stay in sync with [`v1alpha1::HiveCluster::role_listener_name`], which derives the
359+
/// same name from the raw cluster (used e.g. by the StatefulSet listener-volume PVC).
360+
pub fn role_listener_name(&self, hive_role: &HiveRole) -> String {
361+
format!("{name}-{role}", name = self.name, role = hive_role)
362+
}
357363
}
358364

359365
/// Lets [`ValidatedCluster`] stand in for the raw [`v1alpha1::HiveCluster`] when building owner
@@ -388,6 +394,18 @@ impl Resource for ValidatedCluster {
388394
}
389395
}
390396

397+
impl HasName for ValidatedCluster {
398+
fn to_name(&self) -> String {
399+
self.name.to_string()
400+
}
401+
}
402+
403+
impl HasUid for ValidatedCluster {
404+
fn to_uid(&self) -> stackable_operator::v2::types::kubernetes::Uid {
405+
self.uid.clone()
406+
}
407+
}
408+
391409
/// Cluster-wide settings resolved during validation and dereferencing.
392410
///
393411
/// Everything the config-file builders need is resolved here so they never have to
@@ -472,11 +490,11 @@ pub async fn reconcile_hive(
472490
let rolegroup = hive.metastore_rolegroup_ref(rolegroup_name);
473491

474492
let rg_metrics_service =
475-
build_rolegroup_metrics_service(hive, &validated_cluster.image, &rolegroup)
493+
build_rolegroup_metrics_service(&validated_cluster, &rolegroup)
476494
.context(ServiceConfigurationSnafu)?;
477495

478496
let rg_headless_service =
479-
build_rolegroup_headless_service(hive, &validated_cluster.image, &rolegroup)
497+
build_rolegroup_headless_service(&validated_cluster, &rolegroup)
480498
.context(ServiceConfigurationSnafu)?;
481499

482500
let rg_configmap = build::config_map::build_metastore_rolegroup_config_map(
@@ -547,8 +565,7 @@ pub async fn reconcile_hive(
547565
.context(FailedToCreatePdbSnafu)?;
548566

549567
let role_listener: Listener = build_role_listener(
550-
hive,
551-
&validated_cluster.image,
568+
&validated_cluster,
552569
&HiveRole::MetaStore,
553570
&role_config.listener_class,
554571
)
@@ -813,7 +830,7 @@ fn build_metastore_rolegroup_statefulset(
813830
.build();
814831

815832
let pvc = ListenerOperatorVolumeSourceBuilder::new(
816-
&ListenerReference::ListenerName(hive.role_listener_name(hive_role)),
833+
&ListenerReference::ListenerName(cluster.role_listener_name(hive_role)),
817834
&unversioned_recommended_labels,
818835
)
819836
.build_pvc(LISTENER_VOLUME_NAME.to_owned())
@@ -929,10 +946,9 @@ fn build_metastore_rolegroup_statefulset(
929946

930947
Ok(StatefulSet {
931948
metadata: ObjectMetaBuilder::new()
932-
.name_and_namespace(hive)
949+
.name_and_namespace(cluster)
933950
.name(rolegroup_ref.object_name())
934-
.ownerreference_from_resource(hive, None, Some(true))
935-
.context(ObjectMissingMetadataForOwnerRefSnafu)?
951+
.ownerreference(ownerreference_from_resource(cluster, None, Some(true)))
936952
.with_recommended_labels(&recommended_object_labels)
937953
.context(MetadataBuildSnafu)?
938954
.with_label(RESTART_CONTROLLER_ENABLED_LABEL.to_owned())

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

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ 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, to_hadoop_xml, to_java_properties_string},
9+
v2::{
10+
builder::meta::ownerreference_from_resource,
11+
config_file_writer::{PropertiesWriterError, to_hadoop_xml, to_java_properties_string},
12+
},
1013
};
1114

1215
use crate::{
@@ -26,11 +29,6 @@ pub enum Error {
2629
#[snafu(display("failed to serialize {}", ConfigFileName::Security))]
2730
WriteSecurityProperties { source: PropertiesWriterError },
2831

29-
#[snafu(display("object is missing metadata to build owner reference"))]
30-
ObjectMissingMetadataForOwnerRef {
31-
source: stackable_operator::builder::meta::Error,
32-
},
33-
3432
#[snafu(display("failed to build metadata"))]
3533
MetadataBuild {
3634
source: stackable_operator::builder::meta::Error,
@@ -72,8 +70,7 @@ pub fn build_metastore_rolegroup_config_map(
7270
ObjectMetaBuilder::new()
7371
.name_and_namespace(cluster)
7472
.name(rolegroup.object_name())
75-
.ownerreference_from_resource(cluster, None, Some(true))
76-
.context(ObjectMissingMetadataForOwnerRefSnafu)?
73+
.ownerreference(ownerreference_from_resource(cluster, None, Some(true)))
7774
.with_recommended_labels(&build_recommended_labels(
7875
cluster,
7976
&cluster.image.app_version_label_value,

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

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use stackable_operator::{
44
crd::listener::v1alpha1::Listener,
55
k8s_openapi::api::core::v1::ConfigMap,
66
kube::runtime::reflector::ObjectRef,
7+
v2::builder::meta::ownerreference_from_resource,
78
};
89

910
use crate::{
@@ -14,12 +15,6 @@ use crate::{
1415

1516
#[derive(Snafu, Debug)]
1617
pub enum Error {
17-
#[snafu(display("object is missing metadata to build owner reference {obj_ref}"))]
18-
ObjectMissingMetadataForOwnerRef {
19-
source: stackable_operator::builder::meta::Error,
20-
obj_ref: ObjectRef<v1alpha1::HiveCluster>,
21-
},
22-
2318
#[snafu(display("could not build discovery config map for {obj_ref}"))]
2419
DiscoveryConfigMap {
2520
source: stackable_operator::builder::configmap::Error,
@@ -70,10 +65,7 @@ fn build_discovery_configmap(
7065
discovery_configmap.metadata(
7166
ObjectMetaBuilder::new()
7267
.name_and_namespace(cluster)
73-
.ownerreference_from_resource(cluster, None, Some(true))
74-
.with_context(|_| ObjectMissingMetadataForOwnerRefSnafu {
75-
obj_ref: cluster_object_ref(cluster),
76-
})?
68+
.ownerreference(ownerreference_from_resource(cluster, None, Some(true)))
7769
.with_recommended_labels(&build_recommended_labels(
7870
cluster,
7971
&cluster.image.app_version_label_value,

rust/operator-binary/src/listener.rs

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
use snafu::{OptionExt, ResultExt, Snafu};
22
use stackable_operator::{
33
builder::meta::ObjectMetaBuilder,
4-
commons::product_image_selection::ResolvedProductImage,
54
crd::listener::v1alpha1::{Listener, ListenerPort, ListenerSpec},
5+
v2::builder::meta::ownerreference_from_resource,
66
};
77

88
use crate::{
9-
controller::build_recommended_labels,
10-
crd::{HIVE_PORT, HIVE_PORT_NAME, HiveRole, v1alpha1},
9+
controller::{ValidatedCluster, build_recommended_labels},
10+
crd::{HIVE_PORT, HIVE_PORT_NAME, HiveRole},
1111
};
1212

1313
// Listener volumes
@@ -19,10 +19,6 @@ pub const DEFAULT_LISTENER_CLASS: &str = "cluster-internal";
1919

2020
#[derive(Snafu, Debug)]
2121
pub enum Error {
22-
#[snafu(display("object is missing metadata to build owner reference"))]
23-
ObjectMissingMetadataForOwnerRef {
24-
source: stackable_operator::builder::meta::Error,
25-
},
2622
#[snafu(display("failed to build Metadata"))]
2723
MetadataBuild {
2824
source: stackable_operator::builder::meta::Error,
@@ -70,19 +66,17 @@ pub fn build_listener_connection_string(
7066
// Designed to build a listener per role
7167
// In case of Hive we expect only one role: Metastore
7268
pub fn build_role_listener(
73-
hive: &v1alpha1::HiveCluster,
74-
resolved_product_image: &ResolvedProductImage,
69+
cluster: &ValidatedCluster,
7570
hive_role: &HiveRole,
7671
listener_class: &String,
7772
) -> Result<Listener, Error> {
7873
let metadata = ObjectMetaBuilder::new()
79-
.name_and_namespace(hive)
80-
.name(hive.role_listener_name(hive_role))
81-
.ownerreference_from_resource(hive, None, Some(true))
82-
.context(ObjectMissingMetadataForOwnerRefSnafu)?
74+
.name_and_namespace(cluster)
75+
.name(cluster.role_listener_name(hive_role))
76+
.ownerreference(ownerreference_from_resource(cluster, None, Some(true)))
8377
.with_recommended_labels(&build_recommended_labels(
84-
hive,
85-
&resolved_product_image.app_version_label_value,
78+
cluster,
79+
&cluster.image.app_version_label_value,
8680
&hive_role.to_string(),
8781
"none",
8882
))

rust/operator-binary/src/service.rs

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,19 @@
11
use snafu::{ResultExt, Snafu};
22
use stackable_operator::{
33
builder::meta::ObjectMetaBuilder,
4-
commons::product_image_selection::ResolvedProductImage,
54
k8s_openapi::api::core::v1::{Service, ServicePort, ServiceSpec},
65
kvp::{Annotations, Labels},
76
role_utils::RoleGroupRef,
7+
v2::builder::meta::ownerreference_from_resource,
88
};
99

1010
use crate::{
11-
controller::build_recommended_labels,
11+
controller::{ValidatedCluster, build_recommended_labels},
1212
crd::{APP_NAME, HIVE_PORT, HIVE_PORT_NAME, METRICS_PORT, METRICS_PORT_NAME, v1alpha1},
1313
};
1414

1515
#[derive(Debug, Snafu)]
1616
pub enum Error {
17-
#[snafu(display("object is missing metadata to build owner reference"))]
18-
ObjectMissingMetadataForOwnerRef {
19-
source: stackable_operator::builder::meta::Error,
20-
},
2117
#[snafu(display("failed to build Metadata"))]
2218
MetadataBuild {
2319
source: stackable_operator::builder::meta::Error,
@@ -32,19 +28,17 @@ pub enum Error {
3228
///
3329
/// This is mostly useful for internal communication between peers, or for clients that perform client-side load balancing.
3430
pub fn build_rolegroup_headless_service(
35-
hive: &v1alpha1::HiveCluster,
36-
resolved_product_image: &ResolvedProductImage,
31+
cluster: &ValidatedCluster,
3732
rolegroup: &RoleGroupRef<v1alpha1::HiveCluster>,
3833
) -> Result<Service, Error> {
3934
let headless_service = Service {
4035
metadata: ObjectMetaBuilder::new()
41-
.name_and_namespace(hive)
36+
.name_and_namespace(cluster)
4237
.name(rolegroup.rolegroup_headless_service_name())
43-
.ownerreference_from_resource(hive, None, Some(true))
44-
.context(ObjectMissingMetadataForOwnerRefSnafu)?
38+
.ownerreference(ownerreference_from_resource(cluster, None, Some(true)))
4539
.with_recommended_labels(&build_recommended_labels(
46-
hive,
47-
&resolved_product_image.app_version_label_value,
40+
cluster,
41+
&cluster.image.app_version_label_value,
4842
&rolegroup.role,
4943
&rolegroup.role_group,
5044
))
@@ -57,9 +51,14 @@ pub fn build_rolegroup_headless_service(
5751
// Expecting same ports as on listener service, just as a headless, internal service
5852
ports: Some(service_ports()),
5953
selector: Some(
60-
Labels::role_group_selector(hive, APP_NAME, &rolegroup.role, &rolegroup.role_group)
61-
.context(LabelBuildSnafu)?
62-
.into(),
54+
Labels::role_group_selector(
55+
cluster,
56+
APP_NAME,
57+
&rolegroup.role,
58+
&rolegroup.role_group,
59+
)
60+
.context(LabelBuildSnafu)?
61+
.into(),
6362
),
6463
publish_not_ready_addresses: Some(true),
6564
..ServiceSpec::default()
@@ -71,19 +70,17 @@ pub fn build_rolegroup_headless_service(
7170

7271
/// The rolegroup metrics [`Service`] is a service that exposes metrics and a prometheus scraping label
7372
pub fn build_rolegroup_metrics_service(
74-
hive: &v1alpha1::HiveCluster,
75-
resolved_product_image: &ResolvedProductImage,
73+
cluster: &ValidatedCluster,
7674
rolegroup: &RoleGroupRef<v1alpha1::HiveCluster>,
7775
) -> Result<Service, Error> {
7876
let metrics_service = Service {
7977
metadata: ObjectMetaBuilder::new()
80-
.name_and_namespace(hive)
78+
.name_and_namespace(cluster)
8179
.name(rolegroup.rolegroup_metrics_service_name())
82-
.ownerreference_from_resource(hive, None, Some(true))
83-
.context(ObjectMissingMetadataForOwnerRefSnafu)?
80+
.ownerreference(ownerreference_from_resource(cluster, None, Some(true)))
8481
.with_recommended_labels(&build_recommended_labels(
85-
hive,
86-
&resolved_product_image.app_version_label_value,
82+
cluster,
83+
&cluster.image.app_version_label_value,
8784
&rolegroup.role,
8885
&rolegroup.role_group,
8986
))
@@ -97,9 +94,14 @@ pub fn build_rolegroup_metrics_service(
9794
cluster_ip: Some("None".to_string()),
9895
ports: Some(metrics_ports()),
9996
selector: Some(
100-
Labels::role_group_selector(hive, APP_NAME, &rolegroup.role, &rolegroup.role_group)
101-
.context(LabelBuildSnafu)?
102-
.into(),
97+
Labels::role_group_selector(
98+
cluster,
99+
APP_NAME,
100+
&rolegroup.role,
101+
&rolegroup.role_group,
102+
)
103+
.context(LabelBuildSnafu)?
104+
.into(),
103105
),
104106
publish_not_ready_addresses: Some(true),
105107
..ServiceSpec::default()

0 commit comments

Comments
 (0)