Skip to content

Commit 8284fee

Browse files
committed
refactor: use v2 labeling
1 parent ce93c80 commit 8284fee

6 files changed

Lines changed: 95 additions & 102 deletions

File tree

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

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use snafu::{OptionExt, ResultExt, Snafu};
66
use stackable_operator::{
77
builder::{configmap::ConfigMapBuilder, meta::ObjectMetaBuilder},
88
k8s_openapi::api::core::v1::ConfigMap,
9-
kvp::ObjectLabels,
9+
kvp::Labels,
1010
product_logging::framework::VECTOR_CONFIG_FILE,
1111
utils::cluster_info::KubernetesClusterInfo,
1212
v2::config_file_writer::to_java_properties_string,
@@ -64,7 +64,7 @@ pub fn build_rolegroup_config_map(
6464
role: &TrinoRole,
6565
role_group_name: &str,
6666
cluster_info: &KubernetesClusterInfo,
67-
recommended_labels: &ObjectLabels<'_, ValidatedCluster>,
67+
recommended_labels: &Labels,
6868
) -> Result<ConfigMap> {
6969
let role_group_configs =
7070
cluster
@@ -196,8 +196,7 @@ pub fn build_rolegroup_config_map(
196196
.namespace(cluster.namespace.to_string())
197197
.ownerreference_from_resource(cluster, None, Some(true))
198198
.context(MetadataSnafu)?
199-
.with_recommended_labels(recommended_labels)
200-
.context(MetadataSnafu)?
199+
.with_labels(recommended_labels.clone())
201200
.build(),
202201
)
203202
.data(data)
@@ -213,7 +212,7 @@ pub fn build_rolegroup_catalog_config_map(
213212
cluster: &ValidatedCluster,
214213
role: &TrinoRole,
215214
role_group_name: &str,
216-
recommended_labels: &ObjectLabels<'_, ValidatedCluster>,
215+
recommended_labels: &Labels,
217216
) -> Result<ConfigMap> {
218217
let catalog_config_map_name = format!(
219218
"{}-catalog",
@@ -228,8 +227,7 @@ pub fn build_rolegroup_catalog_config_map(
228227
.namespace(cluster.namespace.to_string())
229228
.ownerreference_from_resource(cluster, None, Some(true))
230229
.context(MetadataSnafu)?
231-
.with_recommended_labels(recommended_labels)
232-
.context(MetadataSnafu)?
230+
.with_labels(recommended_labels.clone())
233231
.build(),
234232
)
235233
.data(

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

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use stackable_operator::{
77
crd::listener::v1alpha1::{Listener, ListenerPort, ListenerSpec},
88
k8s_openapi::api::core::v1::PersistentVolumeClaim,
99
kube::ResourceExt,
10-
kvp::{Labels, ObjectLabels},
10+
kvp::Labels,
1111
};
1212

1313
use crate::{
@@ -25,11 +25,6 @@ pub enum Error {
2525
source: stackable_operator::builder::meta::Error,
2626
},
2727

28-
#[snafu(display("failed to build listener object meta data"))]
29-
BuildObjectMeta {
30-
source: stackable_operator::builder::meta::Error,
31-
},
32-
3328
#[snafu(display("failed to build listener volume"))]
3429
BuildListenerPersistentVolume {
3530
source: stackable_operator::builder::pod::volume::ListenerOperatorVolumeSourceBuilderError,
@@ -38,7 +33,7 @@ pub enum Error {
3833

3934
pub fn build_group_listener(
4035
cluster: &ValidatedCluster,
41-
object_labels: ObjectLabels<ValidatedCluster>,
36+
recommended_labels: Labels,
4237
listener_class: String,
4338
listener_group_name: String,
4439
) -> Result<Listener, Error> {
@@ -48,8 +43,7 @@ pub fn build_group_listener(
4843
.name(listener_group_name)
4944
.ownerreference_from_resource(cluster, None, Some(true))
5045
.context(ObjectMissingMetadataForOwnerRefSnafu)?
51-
.with_recommended_labels(&object_labels)
52-
.context(BuildObjectMetaSnafu)?
46+
.with_labels(recommended_labels)
5347
.build(),
5448
spec: ListenerSpec {
5549
class_name: Some(listener_class),

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

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use snafu::{ResultExt, Snafu};
44
use stackable_operator::{
55
builder::meta::ObjectMetaBuilder,
66
k8s_openapi::api::core::v1::{Service, ServicePort, ServiceSpec},
7-
kvp::{Annotations, Labels, ObjectLabels},
7+
kvp::{Annotations, Labels},
88
};
99

1010
use crate::{
@@ -18,11 +18,6 @@ pub enum Error {
1818
ObjectMissingMetadataForOwnerRef {
1919
source: stackable_operator::builder::meta::Error,
2020
},
21-
22-
#[snafu(display("failed to build Metadata"))]
23-
MetadataBuild {
24-
source: stackable_operator::builder::meta::Error,
25-
},
2621
}
2722

2823
/// The rolegroup headless [`Service`] is a service that allows direct access to the instances of a certain rolegroup
@@ -31,7 +26,7 @@ pub fn build_rolegroup_headless_service(
3126
cluster: &ValidatedCluster,
3227
role: &TrinoRole,
3328
role_group_name: &str,
34-
object_labels: &ObjectLabels<ValidatedCluster>,
29+
recommended_labels: &Labels,
3530
selector: BTreeMap<String, String>,
3631
ports: Vec<ServicePort>,
3732
) -> Result<Service, Error> {
@@ -46,8 +41,7 @@ pub fn build_rolegroup_headless_service(
4641
)
4742
.ownerreference_from_resource(cluster, None, Some(true))
4843
.context(ObjectMissingMetadataForOwnerRefSnafu)?
49-
.with_recommended_labels(object_labels)
50-
.context(MetadataBuildSnafu)?
44+
.with_labels(recommended_labels.clone())
5145
.build(),
5246
spec: Some(ServiceSpec {
5347
// Internal communication does not need to be exposed
@@ -67,7 +61,7 @@ pub fn build_rolegroup_metrics_service(
6761
cluster: &ValidatedCluster,
6862
role: &TrinoRole,
6963
role_group_name: &str,
70-
object_labels: &ObjectLabels<ValidatedCluster>,
64+
recommended_labels: &Labels,
7165
selector: BTreeMap<String, String>,
7266
) -> Result<Service, Error> {
7367
Ok(Service {
@@ -81,8 +75,7 @@ pub fn build_rolegroup_metrics_service(
8175
)
8276
.ownerreference_from_resource(cluster, None, Some(true))
8377
.context(ObjectMissingMetadataForOwnerRefSnafu)?
84-
.with_recommended_labels(object_labels)
85-
.context(MetadataBuildSnafu)?
78+
.with_labels(recommended_labels.clone())
8679
.with_labels(prometheus_labels())
8780
.with_annotations(prometheus_annotations())
8881
.build(),

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

Lines changed: 11 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ use stackable_operator::{
3030
},
3131
apimachinery::pkg::{apis::meta::v1::LabelSelector, util::intstr::IntOrString},
3232
},
33-
kvp::{Annotation, Annotations, Labels},
33+
kvp::{Annotation, Annotations},
3434
product_logging,
3535
shared::time::Duration,
3636
v2::{
@@ -54,7 +54,7 @@ use crate::{
5454
},
5555
},
5656
crd::{
57-
APP_NAME, CONFIG_DIR_NAME, Container, ENV_INTERNAL_SECRET, ENV_SPOOLING_SECRET, HTTP_PORT,
57+
CONFIG_DIR_NAME, Container, ENV_INTERNAL_SECRET, ENV_SPOOLING_SECRET, HTTP_PORT,
5858
HTTP_PORT_NAME, HTTPS_PORT, HTTPS_PORT_NAME, MAX_TRINO_LOG_FILES_SIZE, METRICS_PORT,
5959
METRICS_PORT_NAME, RW_CONFIG_DIR_NAME, STACKABLE_CLIENT_TLS_DIR,
6060
STACKABLE_INTERNAL_TLS_DIR, STACKABLE_MOUNT_INTERNAL_TLS_DIR,
@@ -63,7 +63,7 @@ use crate::{
6363
},
6464
trino_controller::{
6565
MAX_PREPARE_LOG_FILE_SIZE, STACKABLE_LOG_CONFIG_DIR, STACKABLE_LOG_DIR,
66-
build_recommended_labels, shared_internal_secret_name, shared_spooling_secret_name,
66+
shared_internal_secret_name, shared_spooling_secret_name,
6767
},
6868
};
6969

@@ -168,7 +168,6 @@ pub fn build_rolegroup_statefulset(
168168
.rolegroup(trino_role, role_group_name)
169169
.context(InternalOperatorFailureSnafu)?;
170170

171-
let role_name = trino_role.to_string();
172171
let resource_names = cluster.resource_names(trino_role, role_group_name);
173172
let config_map_name = resource_names.role_group_config_map().to_string();
174173

@@ -326,15 +325,10 @@ pub fn build_rolegroup_statefulset(
326325
.add_volume_mount(LISTENER_VOLUME_NAME, LISTENER_VOLUME_DIR)
327326
.context(AddVolumeMountSnafu)?;
328327

329-
// Used for PVC templates that cannot be modified once they are deployed
330-
let unversioned_recommended_labels = Labels::recommended(&build_recommended_labels(
331-
trino,
332-
// A version value is required, and we do want to use the "recommended" format for the other desired labels
333-
"none",
334-
&role_name,
335-
role_group_name,
336-
))
337-
.context(LabelBuildSnafu)?;
328+
// Used for PVC templates that cannot be modified once they are deployed, so a fixed
329+
// "none" version is used while keeping the other recommended labels.
330+
let unversioned_recommended_labels =
331+
cluster.unversioned_recommended_labels(trino_role, role_group_name);
338332

339333
persistent_volume_claims.push(
340334
build_group_listener_pvc(&group_listener_name, &unversioned_recommended_labels)
@@ -407,13 +401,7 @@ pub fn build_rolegroup_statefulset(
407401
}
408402

409403
let metadata = ObjectMetaBuilder::new()
410-
.with_recommended_labels(&build_recommended_labels(
411-
trino,
412-
&resolved_product_image.app_version_label_value,
413-
&role_name,
414-
role_group_name,
415-
))
416-
.context(MetadataBuildSnafu)?
404+
.with_labels(cluster.recommended_labels(trino_role, role_group_name))
417405
.with_annotation(
418406
// This is actually used by some kuttl tests (as they don't specify the container explicitly)
419407
Annotation::try_from(("kubectl.kubernetes.io/default-container", "trino"))
@@ -481,13 +469,7 @@ pub fn build_rolegroup_statefulset(
481469
.name(resource_names.stateful_set_name().to_string())
482470
.ownerreference_from_resource(trino, None, Some(true))
483471
.context(ObjectMissingMetadataForOwnerRefSnafu)?
484-
.with_recommended_labels(&build_recommended_labels(
485-
trino,
486-
&resolved_product_image.app_version_label_value,
487-
&role_name,
488-
role_group_name,
489-
))
490-
.context(MetadataBuildSnafu)?
472+
.with_labels(cluster.recommended_labels(trino_role, role_group_name))
491473
.with_label(RESTART_CONTROLLER_ENABLED_LABEL.to_owned())
492474
.with_annotations(annotations)
493475
.build(),
@@ -496,8 +478,8 @@ pub fn build_rolegroup_statefulset(
496478
replicas: rolegroup.replicas.map(i32::from),
497479
selector: LabelSelector {
498480
match_labels: Some(
499-
Labels::role_group_selector(trino, APP_NAME, &role_name, role_group_name)
500-
.context(LabelBuildSnafu)?
481+
cluster
482+
.role_group_selector(trino_role, role_group_name)
501483
.into(),
502484
),
503485
..LabelSelector::default()

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

Lines changed: 66 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,16 @@ use stackable_operator::{
1010
resources::{NoRuntimeLimits, Resources},
1111
},
1212
kube::{Resource, api::ObjectMeta},
13+
kvp::Labels,
1314
shared::time::Duration,
1415
v2::{
1516
HasName, HasUid, NameIsValidLabelValue,
17+
kvp::label::{recommended_labels, role_group_selector},
1618
role_group_utils::ResourceNames,
1719
types::{
1820
kubernetes::{NamespaceName, Uid},
1921
operator::{
20-
ClusterName, ControllerName, OperatorName, ProductName,
22+
ClusterName, ControllerName, OperatorName, ProductName, ProductVersion,
2123
RoleGroupName as RoleGroupNameV2, RoleName,
2224
},
2325
},
@@ -172,12 +174,71 @@ impl ValidatedCluster {
172174
pub(crate) fn resource_names(&self, role: &TrinoRole, role_group_name: &str) -> ResourceNames {
173175
ResourceNames {
174176
cluster_name: self.name.clone(),
175-
role_name: RoleName::from_str(&role.to_string())
176-
.expect("a TrinoRole is a valid RFC 1123 role name"),
177-
role_group_name: RoleGroupNameV2::from_str(role_group_name)
178-
.expect("a validated role group name is a valid role group name"),
177+
role_name: Self::role_name(role),
178+
role_group_name: Self::role_group_name(role_group_name),
179179
}
180180
}
181+
182+
/// A [`TrinoRole`] as a type-safe [`RoleName`].
183+
fn role_name(role: &TrinoRole) -> RoleName {
184+
RoleName::from_str(&role.to_string()).expect("a TrinoRole is a valid RFC 1123 role name")
185+
}
186+
187+
/// A role-group name as a type-safe [`RoleGroupName`](RoleGroupNameV2).
188+
fn role_group_name(role_group_name: &str) -> RoleGroupNameV2 {
189+
RoleGroupNameV2::from_str(role_group_name)
190+
.expect("a validated role group name is a valid role group name")
191+
}
192+
193+
/// The version label value (`app.kubernetes.io/version`) as a type-safe [`ProductVersion`].
194+
fn version_label(&self) -> ProductVersion {
195+
ProductVersion::from_str(&self.image.app_version_label_value)
196+
.expect("the app version label value is a valid product version")
197+
}
198+
199+
fn recommended_labels_with_version(
200+
&self,
201+
version: &ProductVersion,
202+
role: &TrinoRole,
203+
role_group_name: &str,
204+
) -> Labels {
205+
recommended_labels(
206+
self,
207+
&product_name(),
208+
version,
209+
&operator_name(),
210+
&controller_name(),
211+
&Self::role_name(role),
212+
&Self::role_group_name(role_group_name),
213+
)
214+
}
215+
216+
/// Recommended labels for a role-group resource (using the resolved product version).
217+
pub(crate) fn recommended_labels(&self, role: &TrinoRole, role_group_name: &str) -> Labels {
218+
self.recommended_labels_with_version(&self.version_label(), role, role_group_name)
219+
}
220+
221+
/// Recommended labels using a fixed `"none"` version, for resources whose labels must not
222+
/// change after creation (e.g. listener PVC templates).
223+
pub(crate) fn unversioned_recommended_labels(
224+
&self,
225+
role: &TrinoRole,
226+
role_group_name: &str,
227+
) -> Labels {
228+
let none = ProductVersion::from_str("none")
229+
.expect("\"none\" is a valid product version label value");
230+
self.recommended_labels_with_version(&none, role, role_group_name)
231+
}
232+
233+
/// Selector labels matching the pods of a role group.
234+
pub(crate) fn role_group_selector(&self, role: &TrinoRole, role_group_name: &str) -> Labels {
235+
role_group_selector(
236+
self,
237+
&product_name(),
238+
&Self::role_name(role),
239+
&Self::role_group_name(role_group_name),
240+
)
241+
}
181242
}
182243

183244
impl Resource for ValidatedCluster {

0 commit comments

Comments
 (0)