From 13d8cbddb16443ff3dbd66ec74a1d754d2a912ed Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Thu, 28 May 2026 12:59:36 +0200 Subject: [PATCH] fix(config_overrides): make config_overrides public, fix clippy & doc checks --- Cargo.lock | 1 + crates/stackable-operator/Cargo.toml | 2 +- crates/stackable-operator/src/lib.rs | 1 + .../src/v2/config_overrides.rs | 60 +++++++++++-------- crates/stackable-operator/src/v2/mod.rs | 1 + 5 files changed, 39 insertions(+), 26 deletions(-) create mode 100644 crates/stackable-operator/src/v2/mod.rs diff --git a/Cargo.lock b/Cargo.lock index 1c55de634..a2bb5b08e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1490,6 +1490,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f300e415e2134745ef75f04562dd0145405c2f7fd92065db029ac4b16b57fe90" dependencies = [ "jsonptr", + "schemars", "serde", "serde_json", "thiserror 1.0.69", diff --git a/crates/stackable-operator/Cargo.toml b/crates/stackable-operator/Cargo.toml index 21cdd12de..77c6337cb 100644 --- a/crates/stackable-operator/Cargo.toml +++ b/crates/stackable-operator/Cargo.toml @@ -36,7 +36,7 @@ futures.workspace = true http.workspace = true indexmap.workspace = true jiff.workspace = true -json-patch.workspace = true +json-patch = { workspace = true, features = ["schemars"] } k8s-openapi.workspace = true kube.workspace = true product-config.workspace = true diff --git a/crates/stackable-operator/src/lib.rs b/crates/stackable-operator/src/lib.rs index bacfa3e9e..f459ff79e 100644 --- a/crates/stackable-operator/src/lib.rs +++ b/crates/stackable-operator/src/lib.rs @@ -33,6 +33,7 @@ pub mod role_utils; pub mod status; pub mod test_utils; pub mod utils; +pub mod v2; pub mod validation; // External re-exports diff --git a/crates/stackable-operator/src/v2/config_overrides.rs b/crates/stackable-operator/src/v2/config_overrides.rs index 4cc31ffdd..befdeb1ba 100644 --- a/crates/stackable-operator/src/v2/config_overrides.rs +++ b/crates/stackable-operator/src/v2/config_overrides.rs @@ -3,10 +3,11 @@ use std::collections::BTreeMap; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use serde_json::json; -use stackable_operator::{ +use tracing::warn; + +use crate::{ config::merge::Merge, k8s_openapi::DeepMerge, schemars, utils::crds::raw_object_schema, }; -use tracing::warn; // Variant of [`stackable_operator::config_overrides::KeyValueConfigOverrides`] that implements // Merge @@ -15,6 +16,7 @@ use tracing::warn; /// This is backwards-compatible with the existing flat key-value YAML format /// used by `HashMap`. #[derive(Clone, Debug, Default, Deserialize, Eq, JsonSchema, Merge, PartialEq, Serialize)] +#[merge(path_overrides(merge = "crate::config::merge"))] pub struct KeyValueConfigOverrides { #[serde(flatten)] pub overrides: BTreeMap>, @@ -96,31 +98,31 @@ impl Default for JsonConfigOverrides { // `JsonConfigOverrides::Sequence(vec![])`. As this is exposed as the default in the CRD, // an empty JSON merge patch is returned, because JSON merge patches are the preferred way // to override the configuration. - JsonConfigOverrides::JsonMergePatch(json!({})) + Self::JsonMergePatch(json!({})) } } impl Merge for JsonConfigOverrides { fn merge(&mut self, defaults: &Self) { - let mut sequence = if let JsonConfigOverrides::Sequence(sequence) = self { + let mut sequence = if let Self::Sequence(sequence) = self { sequence.clone() } else { vec![self.clone()] }; - if let JsonConfigOverrides::Sequence(base) = defaults { + if let Self::Sequence(base) = defaults { sequence.extend(base.clone()); } else { sequence.push(defaults.clone()); } - *self = JsonConfigOverrides::Sequence(sequence); + *self = Self::Sequence(sequence); } } impl From for JsonConfigOverrides { fn from(value: KeyValueConfigOverrides) -> Self { - JsonConfigOverrides::JsonMergePatch(value.overrides.into_iter().collect()) + Self::JsonMergePatch(value.overrides.into_iter().collect()) } } @@ -132,32 +134,40 @@ impl From for JsonConfigOverrides { /// /// Example for key-value pairs: /// -/// stringProperty: new value -/// booleanProperty: "true" +/// ```yaml +/// stringProperty: new value +/// booleanProperty: "true" +/// ``` /// /// Example for a JSON merge patch: /// -/// jsonMergePatch: -/// stringProperty: new value -/// booleanProperty: true -/// nestedProperty: -/// key: value +/// ```yaml +/// jsonMergePatch: +/// stringProperty: new value +/// booleanProperty: true +/// nestedProperty: +/// key: value +/// ``` /// /// Example for a JSON patch: /// -/// jsonPatch: -/// - op: replace -/// path: /stringProperty -/// value: new value +/// ```yaml +/// jsonPatch: +/// - op: replace +/// path: /stringProperty +/// value: new value +/// ``` /// /// Example for a JSON object: /// -/// userProvided: -/// stringProperty: new value -/// booleanProperty: true -/// nestedProperty: -/// key: value -#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)] +/// ```yaml +/// userProvided: +/// stringProperty: new value +/// booleanProperty: true +/// nestedProperty: +/// key: value +/// ``` +#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)] #[serde(untagged)] #[schemars(schema_with = "raw_object_schema")] pub enum JsonOrKeyValueConfigOverrides { @@ -196,9 +206,9 @@ impl Merge for JsonOrKeyValueConfigOverrides { #[cfg(test)] mod tests { use serde_json::json; - use stackable_operator::config::merge; use super::*; + use crate::config::merge; #[test] fn test_json_config_overrides_apply() { diff --git a/crates/stackable-operator/src/v2/mod.rs b/crates/stackable-operator/src/v2/mod.rs new file mode 100644 index 000000000..57eb7a3d8 --- /dev/null +++ b/crates/stackable-operator/src/v2/mod.rs @@ -0,0 +1 @@ +pub mod config_overrides;