Skip to content

Commit fc38a7c

Browse files
committed
refactor: Move stuff into ObjectOverrides::apply_to
1 parent b4f98e0 commit fc38a7c

File tree

4 files changed

+60
-35
lines changed

4 files changed

+60
-35
lines changed

crates/stackable-operator/crds/DummyCluster.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -637,7 +637,7 @@ spec:
637637
objectOverrides:
638638
default: []
639639
description: |-
640-
A list of generic Kubernetes objects, which are merged onto the objects that the operator
640+
A list of generic Kubernetes objects, which are merged on the objects that the operator
641641
creates.
642642
643643
List entries are arbitrary YAML objects, which need to be valid Kubernetes objects.

crates/stackable-operator/src/cluster_resources.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ use crate::{
3838
},
3939
},
4040
crd::listener,
41-
deep_merger::{self, ObjectOverrides, apply_object_overrides},
41+
deep_merger::{self, ObjectOverrides},
4242
kvp::{
4343
Label, LabelError, Labels,
4444
consts::{K8S_APP_INSTANCE_KEY, K8S_APP_MANAGED_BY_KEY, K8S_APP_NAME_KEY},
@@ -581,7 +581,8 @@ impl ClusterResources {
581581
let mut mutated = resource.maybe_mutate(&self.apply_strategy);
582582

583583
// We apply the object overrides of the user at the very end to offer maximum flexibility.
584-
apply_object_overrides(&mut mutated, self.object_overrides.clone())
584+
self.object_overrides
585+
.apply_to(&mut mutated)
585586
.context(ApplyObjectOverridesSnafu)?;
586587

587588
let patched_resource = self

crates/stackable-operator/src/deep_merger/crd.rs

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
1+
use k8s_openapi::DeepMerge;
12
use kube::api::DynamicObject;
23
use schemars::JsonSchema;
3-
use serde::{Deserialize, Serialize};
4+
use serde::{Deserialize, Serialize, de::DeserializeOwned};
45

6+
use super::apply_deep_merge;
57
use crate::utils::crds::raw_object_list_schema;
68

79
#[derive(Clone, Debug, Deserialize, JsonSchema, Serialize, PartialEq)]
810
#[serde(rename_all = "camelCase")]
911
pub struct ObjectOverrides {
10-
/// A list of generic Kubernetes objects, which are merged onto the objects that the operator
12+
/// A list of generic Kubernetes objects, which are merged on the objects that the operator
1113
/// creates.
1214
///
1315
/// List entries are arbitrary YAML objects, which need to be valid Kubernetes objects.
@@ -18,3 +20,20 @@ pub struct ObjectOverrides {
1820
#[schemars(schema_with = "raw_object_list_schema")]
1921
pub object_overrides: Vec<DynamicObject>,
2022
}
23+
24+
impl ObjectOverrides {
25+
/// Takes an arbitrary Kubernetes object (`base`) and applies the configured list of deep merges
26+
/// to it.
27+
///
28+
/// Merges are only applied to objects that have the same apiVersion, kind, name
29+
/// and namespace.
30+
pub fn apply_to<R>(&self, base: &mut R) -> Result<(), super::Error>
31+
where
32+
R: kube::Resource<DynamicType = ()> + DeepMerge + DeserializeOwned,
33+
{
34+
for object_override in &self.object_overrides {
35+
apply_deep_merge(base, object_override)?;
36+
}
37+
Ok(())
38+
}
39+
}

crates/stackable-operator/src/deep_merger/mod.rs

Lines changed: 35 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -18,28 +18,15 @@ pub enum Error {
1818
},
1919
}
2020

21-
// Takes an arbitrary Kubernetes object (`base`) and applies the given list of deep merges onto it.
22-
//
23-
// Merges are only applied to objects that have the same apiVersion, kind, name
24-
// and namespace.
25-
pub fn apply_object_overrides<R>(
26-
base: &mut R,
27-
object_overrides: ObjectOverrides,
28-
) -> Result<(), Error>
29-
where
30-
R: kube::Resource<DynamicType = ()> + DeepMerge + DeserializeOwned,
31-
{
32-
for object_override in object_overrides.object_overrides {
33-
apply_deep_merge(base, object_override)?;
34-
}
35-
Ok(())
36-
}
37-
38-
// Takes an arbitrary Kubernetes object (`base`) and applies the deep merge.
39-
//
40-
// Merges are only applied to objects that have the same apiVersion, kind, name
41-
// and namespace.
42-
pub fn apply_deep_merge<R>(base: &mut R, merge: DynamicObject) -> Result<(), Error>
21+
/// Takes an arbitrary Kubernetes object (`base`) and applies the deep merge.
22+
///
23+
/// Merges are only applied to objects that have the same apiVersion, kind, name
24+
/// and namespace.
25+
///
26+
/// In case the merge matches the base object, it will get cloned prior to merging.
27+
/// We modeled it this way, as most of the time it won't match, so we don't need to proactively
28+
/// clone.
29+
pub fn apply_deep_merge<R>(base: &mut R, merge: &DynamicObject) -> Result<(), Error>
4330
where
4431
R: kube::Resource<DynamicType = ()> + DeepMerge + DeserializeOwned,
4532
{
@@ -65,6 +52,8 @@ where
6552
}
6653

6754
let deserialized_merge = merge
55+
// We only clone if needed, most cases the deep merges don't actually apply
56+
.to_owned()
6857
.try_parse()
6958
.with_context(|_| ParseDynamicObjectSnafu {
7059
target_api_version: R::api_version(&()),
@@ -192,7 +181,9 @@ mod tests {
192181
.expect("test YAML is valid");
193182

194183
assert_has_label(&sa, "app.kubernetes.io/name", "trino");
195-
apply_object_overrides(&mut sa, object_overrides).unwrap();
184+
object_overrides
185+
.apply_to(&mut sa)
186+
.expect("merging onto test object works");
196187
assert_has_label(&sa, "app.kubernetes.io/name", "overwritten");
197188
}
198189

@@ -213,7 +204,9 @@ mod tests {
213204
.expect("test YAML is valid");
214205

215206
let original = sa.clone();
216-
apply_object_overrides(&mut sa, object_overrides).unwrap();
207+
object_overrides
208+
.apply_to(&mut sa)
209+
.expect("merging onto test object works");
217210
assert_eq!(sa, original, "The merge shouldn't have changed anything");
218211
}
219212

@@ -234,7 +227,9 @@ mod tests {
234227
.expect("test YAML is valid");
235228

236229
let original = sa.clone();
237-
apply_object_overrides(&mut sa, object_overrides).unwrap();
230+
object_overrides
231+
.apply_to(&mut sa)
232+
.expect("merging onto test object works");
238233
assert_eq!(sa, original, "The merge shouldn't have changed anything");
239234
}
240235

@@ -255,7 +250,9 @@ mod tests {
255250
.expect("test YAML is valid");
256251

257252
let original = sa.clone();
258-
apply_object_overrides(&mut sa, object_overrides).unwrap();
253+
object_overrides
254+
.apply_to(&mut sa)
255+
.expect("merging onto test object works");
259256
assert_eq!(sa, original, "The merge shouldn't have changed anything");
260257
}
261258

@@ -318,7 +315,9 @@ mod tests {
318315
get_trino_container_image(&sts).as_deref(),
319316
Some("trino-image")
320317
);
321-
apply_object_overrides(&mut sts, object_overrides).unwrap();
318+
object_overrides
319+
.apply_to(&mut sts)
320+
.expect("merging onto test object works");
322321
assert_eq!(get_replicas(&sts), Some(3));
323322
assert_eq!(
324323
get_trino_container_image(&sts).as_deref(),
@@ -366,7 +365,9 @@ mod tests {
366365
("log.properties".to_owned(), "=info".to_owned()),
367366
])
368367
);
369-
apply_object_overrides(&mut cm, object_overrides).unwrap();
368+
object_overrides
369+
.apply_to(&mut cm)
370+
.expect("merging onto test object works");
370371
assert_eq!(
371372
cm.data.as_ref().unwrap(),
372373
&BTreeMap::from([
@@ -418,7 +419,9 @@ mod tests {
418419
&BTreeMap::from([("raw".to_owned(), ByteString(b"bar\n".to_vec()))])
419420
);
420421

421-
apply_object_overrides(&mut secret, object_overrides).unwrap();
422+
object_overrides
423+
.apply_to(&mut secret)
424+
.expect("merging onto test object works");
422425
assert_eq!(
423426
secret.string_data.as_ref().unwrap(),
424427
&BTreeMap::from([("foo".to_owned(), "overwritten".to_owned()),])
@@ -462,7 +465,9 @@ mod tests {
462465
.expect("test YAML is valid");
463466

464467
assert_has_label(&storage_class, "foo", "original");
465-
apply_object_overrides(&mut storage_class, object_overrides).unwrap();
468+
object_overrides
469+
.apply_to(&mut storage_class)
470+
.expect("merging onto test object works");
466471
assert_has_label(&storage_class, "foo", "overwritten");
467472
}
468473

0 commit comments

Comments
 (0)