Skip to content

Commit 2da9d6b

Browse files
committed
refactor: use obhect meta builder
1 parent 72671a1 commit 2da9d6b

5 files changed

Lines changed: 57 additions & 48 deletions

File tree

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

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,8 @@
33
44
use snafu::{ResultExt, Snafu};
55
use stackable_operator::{
6-
builder::{configmap::ConfigMapBuilder, meta::ObjectMetaBuilder},
7-
k8s_openapi::api::core::v1::ConfigMap,
6+
builder::configmap::ConfigMapBuilder, k8s_openapi::api::core::v1::ConfigMap,
87
product_logging::framework::VECTOR_CONFIG_FILE,
9-
v2::builder::meta::ownerreference_from_resource,
108
};
119

1210
use crate::controller::{
@@ -44,16 +42,14 @@ pub fn build_rolegroup_config_map(
4442
) -> Result<ConfigMap> {
4543
let mut cm_builder = ConfigMapBuilder::new();
4644

47-
let metadata = ObjectMetaBuilder::new()
48-
.name_and_namespace(cluster)
49-
.name(
45+
let metadata = cluster
46+
.object_meta(
5047
cluster
5148
.resource_names(role_group_name)
5249
.role_group_config_map()
5350
.to_string(),
51+
role_group_name,
5452
)
55-
.ownerreference(ownerreference_from_resource(cluster, None, Some(true)))
56-
.with_labels(cluster.recommended_labels(role_group_name))
5753
.build();
5854

5955
cm_builder.metadata(metadata).add_data(

rust/operator-binary/src/controller/build/resource/daemonset.rs

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,7 @@ use stackable_operator::{
4444
},
4545
utils::{COMMON_BASH_TRAP_FUNCTIONS, cluster_info::KubernetesClusterInfo},
4646
v2::{
47-
builder::{
48-
meta::ownerreference_from_resource,
49-
pod::container::{EnvVarSet, new_container_builder},
50-
},
47+
builder::pod::container::{EnvVarSet, new_container_builder},
5148
product_logging::framework::{
5249
STACKABLE_LOG_DIR, ValidatedContainerLogConfigChoice, vector_container,
5350
},
@@ -583,19 +580,17 @@ pub fn build_server_rolegroup_daemonset(
583580
let mut pod_template = pb.build_template();
584581
pod_template.merge_from(rolegroup_config.pod_overrides.clone());
585582

586-
let metadata = ObjectMetaBuilder::new()
587-
.name_and_namespace(cluster)
588-
// TODO(@maltesander): `ResourceNames` has no `DaemonSet` helper (OPA is the only DaemonSet operator), so the
589-
// (identical) qualified role-group name backing the `StatefulSet` name is reused.
590-
// Should be replaced with upstream fix.
591-
.name(
583+
// TODO(@maltesander): `ResourceNames` has no `DaemonSet` helper (OPA is the only DaemonSet operator), so the
584+
// (identical) qualified role-group name backing the `StatefulSet` name is reused.
585+
// Should be replaced with upstream fix.
586+
let metadata = cluster
587+
.object_meta(
592588
cluster
593589
.resource_names(role_group_name)
594590
.stateful_set_name()
595591
.to_string(),
592+
role_group_name,
596593
)
597-
.ownerreference(ownerreference_from_resource(cluster, None, Some(true)))
598-
.with_labels(cluster.recommended_labels(role_group_name))
599594
.build();
600595

601596
let daemonset_spec = DaemonSetSpec {

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

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,8 @@ use std::str::FromStr;
77

88
use snafu::{ResultExt, Snafu};
99
use stackable_operator::{
10-
builder::{configmap::ConfigMapBuilder, meta::ObjectMetaBuilder},
11-
k8s_openapi::api::core::v1::ConfigMap,
10+
builder::configmap::ConfigMapBuilder, k8s_openapi::api::core::v1::ConfigMap,
1211
utils::cluster_info::KubernetesClusterInfo,
13-
v2::builder::meta::ownerreference_from_resource,
1412
};
1513

1614
use super::service::{APP_PORT, APP_TLS_PORT};
@@ -47,12 +45,11 @@ pub fn build_discovery_config_map(
4745

4846
// Discovery is a cluster-level object (named after the cluster); `discovery` is used as a
4947
// placeholder role-group name for the recommended labels.
50-
let metadata = ObjectMetaBuilder::new()
51-
.name_and_namespace(cluster)
52-
.ownerreference(ownerreference_from_resource(cluster, None, Some(true)))
53-
.with_labels(cluster.recommended_labels(
48+
let metadata = cluster
49+
.object_meta(
50+
cluster.name.to_string(),
5451
&RoleGroupName::from_str("discovery").expect("'discovery' is a valid role group name"),
55-
))
52+
)
5653
.build();
5754

5855
let mut cm_builder = ConfigMapBuilder::new();

rust/operator-binary/src/controller/build/resource/service.rs

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
use std::{collections::BTreeMap, str::FromStr};
22

33
use stackable_operator::{
4-
builder::meta::ObjectMetaBuilder,
54
k8s_openapi::api::core::v1::{Service, ServicePort, ServiceSpec},
65
kvp::{Annotations, Labels},
7-
v2::{builder::meta::ownerreference_from_resource, types::common::Port},
6+
v2::types::common::Port,
87
};
98

109
use crate::controller::{RoleGroupName, ValidatedCluster};
@@ -25,16 +24,16 @@ fn role_level_role_group_name() -> RoleGroupName {
2524
/// The server-role service is the primary endpoint that should be used by clients that do not perform internal load balancing,
2625
/// including targets outside of the cluster.
2726
pub(crate) fn build_server_role_service(cluster: &ValidatedCluster) -> Service {
28-
let metadata = ObjectMetaBuilder::new()
29-
.name_and_namespace(cluster)
30-
.name(cluster.server_role_service_name())
31-
.ownerreference(ownerreference_from_resource(cluster, None, Some(true)))
32-
.with_labels(cluster.recommended_labels(&role_level_role_group_name()))
27+
let metadata = cluster
28+
.object_meta(
29+
cluster.server_role_service_name(),
30+
&role_level_role_group_name(),
31+
)
3332
.build();
3433

3534
let service_spec = ServiceSpec {
3635
type_: Some(cluster.cluster_config.listener_class.k8s_service_type()),
37-
ports: Some(data_service_ports(cluster.cluster_config.tls.is_some())),
36+
ports: Some(data_service_ports(cluster.is_tls_enabled())),
3837
selector: Some(cluster.role_selector().into()),
3938
// This ensures that products (e.g. Trino) on a node always talk to the OPA pod on the
4039
// same node, avoiding cross-node latency. The downside is that if the local OPA pod is
@@ -60,16 +59,14 @@ pub(crate) fn build_rolegroup_headless_service(
6059
cluster: &ValidatedCluster,
6160
role_group_name: &RoleGroupName,
6261
) -> Service {
63-
let metadata = ObjectMetaBuilder::new()
64-
.name_and_namespace(cluster)
65-
.name(
62+
let metadata = cluster
63+
.object_meta(
6664
cluster
6765
.resource_names(role_group_name)
6866
.headless_service_name()
6967
.to_string(),
68+
role_group_name,
7069
)
71-
.ownerreference(ownerreference_from_resource(cluster, None, Some(true)))
72-
.with_labels(cluster.recommended_labels(role_group_name))
7370
.build();
7471

7572
// Currently we don't offer listener-exposition of OPA mostly due to security concerns.
@@ -80,7 +77,7 @@ pub(crate) fn build_rolegroup_headless_service(
8077
// Note: We have kind of similar situations for HMS and Zookeeper, as the authentication
8178
// options there are non-existent (mTLS still opens plain port) or suck (Kerberos).
8279
let service_spec = headless_cluster_ip_service_spec(
83-
data_service_ports(cluster.cluster_config.tls.is_some()),
80+
data_service_ports(cluster.is_tls_enabled()),
8481
cluster.role_group_selector(role_group_name).into(),
8582
true,
8683
);
@@ -114,17 +111,15 @@ pub(crate) fn build_rolegroup_metrics_service(
114111
cluster: &ValidatedCluster,
115112
role_group_name: &RoleGroupName,
116113
) -> Service {
117-
let tls_enabled = cluster.cluster_config.tls.is_some();
118-
let metadata = ObjectMetaBuilder::new()
119-
.name_and_namespace(cluster)
120-
.name(
114+
let tls_enabled = cluster.is_tls_enabled();
115+
let metadata = cluster
116+
.object_meta(
121117
cluster
122118
.resource_names(role_group_name)
123119
.metrics_service_name()
124120
.to_string(),
121+
role_group_name,
125122
)
126-
.ownerreference(ownerreference_from_resource(cluster, None, Some(true)))
127-
.with_labels(cluster.recommended_labels(role_group_name))
128123
.with_labels(prometheus_labels())
129124
.with_annotations(prometheus_annotations(tls_enabled))
130125
.build();

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,32 @@ impl ValidatedCluster {
141141
pub fn role_selector(&self) -> Labels {
142142
role_selector(self, &product_name(), &Self::role_name())
143143
}
144+
145+
/// Returns an [`ObjectMetaBuilder`](stackable_operator::builder::meta::ObjectMetaBuilder)
146+
/// pre-filled with the namespace, an owner reference back to this cluster, and the recommended
147+
/// labels for a resource named `name` in `role_group_name`.
148+
///
149+
/// Consolidates the metadata chain repeated by the child-resource builders. Call sites that
150+
/// need extra labels/annotations chain them onto the returned builder before calling `build()`.
151+
pub(crate) fn object_meta(
152+
&self,
153+
name: impl Into<String>,
154+
role_group_name: &RoleGroupName,
155+
) -> stackable_operator::builder::meta::ObjectMetaBuilder {
156+
let mut builder = stackable_operator::builder::meta::ObjectMetaBuilder::new();
157+
builder
158+
.name_and_namespace(self)
159+
.name(name)
160+
.ownerreference(
161+
stackable_operator::v2::builder::meta::ownerreference_from_resource(
162+
self,
163+
None,
164+
Some(true),
165+
),
166+
)
167+
.with_labels(self.recommended_labels(role_group_name));
168+
builder
169+
}
144170
}
145171

146172
/// The product name (`opa`) as a type-safe label value.

0 commit comments

Comments
 (0)