Skip to content

Commit f7ac175

Browse files
committed
Reorganize kvp so that KeyValuePairs is an alias for BTreeMap instead of newtyping it
1 parent f102e4d commit f7ac175

File tree

10 files changed

+284
-840
lines changed

10 files changed

+284
-840
lines changed

crates/stackable-operator/src/builder/meta.rs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ use kube::{Resource, ResourceExt};
33
use snafu::{ResultExt, Snafu};
44
use tracing::warn;
55

6-
use crate::kvp::{Annotation, Annotations, Label, LabelError, Labels, ObjectLabels};
6+
use crate::kvp::{
7+
label, Annotation, Annotations, KeyValuePairs, KeyValuePairsExt, Label, LabelError, Labels,
8+
ObjectLabels,
9+
};
710

811
type Result<T, E = Error> = std::result::Result<T, E>;
912

@@ -106,7 +109,7 @@ impl ObjectMetaBuilder {
106109
pub fn with_annotation(&mut self, annotation: Annotation) -> &mut Self {
107110
self.annotations
108111
.get_or_insert(Annotations::new())
109-
.insert(annotation);
112+
.extend([annotation]);
110113
self
111114
}
112115

@@ -128,7 +131,7 @@ impl ObjectMetaBuilder {
128131
/// This adds a single label to the existing labels.
129132
/// It'll override a label with the same key.
130133
pub fn with_label(&mut self, label: Label) -> &mut Self {
131-
self.labels.get_or_insert(Labels::new()).insert(label);
134+
self.labels.get_or_insert(Labels::new()).extend([label]);
132135
self
133136
}
134137

@@ -154,7 +157,7 @@ impl ObjectMetaBuilder {
154157
object_labels: ObjectLabels<T>,
155158
) -> Result<&mut Self> {
156159
let recommended_labels =
157-
Labels::recommended(object_labels).context(RecommendedLabelsSnafu)?;
160+
label::sets::recommended(object_labels).context(RecommendedLabelsSnafu)?;
158161

159162
self.labels
160163
.get_or_insert(Labels::new())
@@ -185,8 +188,8 @@ impl ObjectMetaBuilder {
185188
.ownerreference
186189
.as_ref()
187190
.map(|ownerreference| vec![ownerreference.clone()]),
188-
labels: self.labels.clone().map(|l| l.into()),
189-
annotations: self.annotations.clone().map(|a| a.into()),
191+
labels: self.labels.as_ref().map(KeyValuePairs::to_unvalidated),
192+
annotations: self.annotations.as_ref().map(KeyValuePairs::to_unvalidated),
190193
..ObjectMeta::default()
191194
}
192195
}

crates/stackable-operator/src/builder/pdb.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use snafu::{ResultExt, Snafu};
1010

1111
use crate::{
1212
builder::meta::ObjectMetaBuilder,
13-
kvp::{Label, Labels},
13+
kvp::{label, KeyValuePairsExt},
1414
};
1515

1616
type Result<T, E = Error> = std::result::Result<T, E>;
@@ -86,9 +86,9 @@ impl PodDisruptionBudgetBuilder<(), (), ()> {
8686
controller_name: &str,
8787
) -> Result<PodDisruptionBudgetBuilder<ObjectMeta, LabelSelector, ()>> {
8888
let role_selector_labels =
89-
Labels::role_selector(owner, app_name, role).context(RoleSelectorLabelsSnafu)?;
90-
let managed_by_label =
91-
Label::managed_by(operator_name, controller_name).context(ManagedByLabelSnafu)?;
89+
label::sets::role_selector(owner, app_name, role).context(RoleSelectorLabelsSnafu)?;
90+
let managed_by_label = label::well_known::managed_by(operator_name, controller_name)
91+
.context(ManagedByLabelSnafu)?;
9292
let metadata = ObjectMetaBuilder::new()
9393
.namespace_opt(owner.namespace())
9494
.name(format!("{}-{}", owner.name_any(), role))
@@ -102,7 +102,7 @@ impl PodDisruptionBudgetBuilder<(), (), ()> {
102102
metadata,
103103
selector: LabelSelector {
104104
match_expressions: None,
105-
match_labels: Some(role_selector_labels.into()),
105+
match_labels: Some(role_selector_labels.to_unvalidated()),
106106
},
107107
..PodDisruptionBudgetBuilder::default()
108108
})

crates/stackable-operator/src/builder/pod/mod.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -331,16 +331,17 @@ impl PodBuilder {
331331
/// ```
332332
/// # use stackable_operator::builder::pod::PodBuilder;
333333
/// # use stackable_operator::builder::pod::container::ContainerBuilder;
334+
/// # use stackable_operator::iter::TryFromIterator;
334335
/// # use stackable_operator::kvp::Labels;
335336
/// # use k8s_openapi::{
336337
/// # apimachinery::pkg::apis::meta::v1::ObjectMeta,
337338
/// # };
338339
/// # use std::collections::BTreeMap;
339340
///
340-
/// let labels: Labels = Labels::try_from(
341-
/// BTreeMap::from([("app.kubernetes.io/component", "test-role"),
341+
/// let labels: Labels = Labels::try_from_iter(
342+
/// [("app.kubernetes.io/component", "test-role"),
342343
/// ("app.kubernetes.io/instance", "test"),
343-
/// ("app.kubernetes.io/name", "test")]))
344+
/// ("app.kubernetes.io/name", "test")])
344345
/// .unwrap();
345346
///
346347
/// let pod = PodBuilder::new()
@@ -418,16 +419,17 @@ impl PodBuilder {
418419
/// ```
419420
/// # use stackable_operator::builder::pod::PodBuilder;
420421
/// # use stackable_operator::builder::pod::container::ContainerBuilder;
422+
/// # use stackable_operator::iter::TryFromIterator;
421423
/// # use stackable_operator::kvp::Labels;
422424
/// # use k8s_openapi::{
423425
/// # apimachinery::pkg::apis::meta::v1::ObjectMeta,
424426
/// # };
425427
/// # use std::collections::BTreeMap;
426428
///
427-
/// let labels: Labels = Labels::try_from(
428-
/// BTreeMap::from([("app.kubernetes.io/component", "test-role"),
429+
/// let labels: Labels = Labels::try_from_iter(
430+
/// [("app.kubernetes.io/component", "test-role"),
429431
/// ("app.kubernetes.io/instance", "test"),
430-
/// ("app.kubernetes.io/name", "test")]))
432+
/// ("app.kubernetes.io/name", "test")])
431433
/// .unwrap();
432434
///
433435
/// let pod = PodBuilder::new()

crates/stackable-operator/src/builder/pod/volume.rs

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use tracing::warn;
1414

1515
use crate::{
1616
builder::meta::ObjectMetaBuilder,
17-
kvp::{Annotation, AnnotationError, Annotations, LabelError, Labels},
17+
kvp::{annotation, Annotation, AnnotationError, Annotations, LabelError, Labels},
1818
};
1919

2020
/// A builder to build [`Volume`] objects. May only contain one `volume_source`
@@ -333,34 +333,43 @@ impl SecretOperatorVolumeSourceBuilder {
333333
pub fn build(&self) -> Result<EphemeralVolumeSource, SecretOperatorVolumeSourceBuilderError> {
334334
let mut annotations = Annotations::new();
335335

336-
annotations
337-
.insert(Annotation::secret_class(&self.secret_class).context(ParseAnnotationSnafu)?);
336+
annotations.extend([annotation::well_known::secret_volume::secret_class(
337+
&self.secret_class,
338+
)
339+
.context(ParseAnnotationSnafu)?]);
338340

339341
if !self.scopes.is_empty() {
340-
annotations
341-
.insert(Annotation::secret_scope(&self.scopes).context(ParseAnnotationSnafu)?);
342+
annotations.extend([
343+
annotation::well_known::secret_volume::secret_scope(&self.scopes)
344+
.context(ParseAnnotationSnafu)?,
345+
]);
342346
}
343347

344348
if let Some(format) = &self.format {
345-
annotations
346-
.insert(Annotation::secret_format(format.as_ref()).context(ParseAnnotationSnafu)?);
349+
annotations.extend([annotation::well_known::secret_volume::secret_format(
350+
format.as_ref(),
351+
)
352+
.context(ParseAnnotationSnafu)?]);
347353
}
348354

349355
if !self.kerberos_service_names.is_empty() {
350-
annotations.insert(
351-
Annotation::kerberos_service_names(&self.kerberos_service_names)
352-
.context(ParseAnnotationSnafu)?,
353-
);
356+
annotations.extend([
357+
annotation::well_known::secret_volume::kerberos_service_names(
358+
&self.kerberos_service_names,
359+
)
360+
.context(ParseAnnotationSnafu)?,
361+
]);
354362
}
355363

356364
if let Some(password) = &self.tls_pkcs12_password {
357365
// The `tls_pkcs12_password` is only used for PKCS12 stores.
358366
if Some(SecretFormat::TlsPkcs12) != self.format {
359367
warn!(format.actual = ?self.format, format.expected = ?Some(SecretFormat::TlsPkcs12), "A TLS PKCS12 password was set but ignored because another format was requested")
360368
} else {
361-
annotations.insert(
362-
Annotation::tls_pkcs12_password(password).context(ParseAnnotationSnafu)?,
363-
);
369+
annotations.extend([annotation::well_known::secret_volume::tls_pkcs12_password(
370+
password,
371+
)
372+
.context(ParseAnnotationSnafu)?]);
364373
}
365374
}
366375

@@ -450,7 +459,7 @@ pub enum ListenerOperatorVolumeSourceBuilderError {
450459
/// # use std::collections::BTreeMap;
451460
/// let mut pod_builder = PodBuilder::new();
452461
///
453-
/// let labels: Labels = Labels::try_from(BTreeMap::<String, String>::new()).unwrap();
462+
/// let labels: Labels = Labels::new();
454463
///
455464
/// let volume_source =
456465
/// ListenerOperatorVolumeSourceBuilder::new(
@@ -555,7 +564,6 @@ impl ListenerOperatorVolumeSourceBuilder {
555564
mod tests {
556565
use super::*;
557566
use k8s_openapi::apimachinery::pkg::api::resource::Quantity;
558-
use std::collections::BTreeMap;
559567

560568
#[test]
561569
fn builder() {
@@ -615,7 +623,7 @@ mod tests {
615623

616624
#[test]
617625
fn listener_operator_volume_source_builder() {
618-
let labels: Labels = Labels::try_from(BTreeMap::<String, String>::new()).unwrap();
626+
let labels: Labels = Labels::new();
619627

620628
let builder = ListenerOperatorVolumeSourceBuilder::new(
621629
&ListenerReference::ListenerClass("public".into()),

crates/stackable-operator/src/cluster_resources.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use crate::{
1212
},
1313
kvp::{
1414
consts::{K8S_APP_INSTANCE_KEY, K8S_APP_MANAGED_BY_KEY, K8S_APP_NAME_KEY},
15-
Label, LabelError, Labels,
15+
label, LabelError, Labels,
1616
},
1717
utils::format_full_controller_name,
1818
};
@@ -464,12 +464,12 @@ impl ClusterResources {
464464
/// Return required labels for cluster resources to be uniquely identified for clean up.
465465
// TODO: This is a (quick-fix) helper method but should be replaced by better label handling
466466
pub fn get_required_labels(&self) -> Result<Labels, LabelError> {
467-
let mut labels = Labels::common(&self.app_name, &self.app_instance)?;
467+
let mut labels = label::sets::common(&self.app_name, &self.app_instance)?;
468468

469-
labels.insert(Label::managed_by(
469+
labels.extend([label::well_known::managed_by(
470470
&self.operator_name,
471471
&self.controller_name,
472-
)?);
472+
)?]);
473473

474474
Ok(labels)
475475
}

crates/stackable-operator/src/commons/product_image_selection.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use serde::{Deserialize, Serialize};
55
use strum::AsRefStr;
66

77
#[cfg(doc)]
8-
use crate::kvp::Labels;
8+
use crate::kvp::label;
99

1010
pub const STACKABLE_DOCKER_REPO: &str = "docker.stackable.tech/stackable";
1111

@@ -67,7 +67,7 @@ pub struct ResolvedProductImage {
6767
/// Version of the product, e.g. `1.4.1`.
6868
pub product_version: String,
6969

70-
/// App version as formatted for [`Labels::recommended`]
70+
/// App version as formatted for [`label::sets::recommended`]
7171
pub app_version_label: String,
7272

7373
/// Image to be used for the product image e.g. `docker.stackable.tech/stackable/superset:1.4.1-stackable2.1.0`

0 commit comments

Comments
 (0)