@@ -176,26 +176,17 @@ pub fn validate(
176176
177177/// Merge role-group overrides over the role-level overrides (role-group wins per key) via the
178178/// `Merge` impl derived on the override structs.
179- ///
180- /// NOTE on semantics: `Merge` treats a role-group `null` value as "inherit the role-level value",
181- /// *not* "unset it". This differs from `main`'s product-config layering, which `.extend()`ed the
182- /// maps so a role-group `null` *removed* a role-level key. The `tests` module has a worked
183- /// example of the difference.
184179fn merge_role_group_overrides < O : Merge + Clone > ( role : & O , role_group : Option < & O > ) -> O {
185180 match role_group {
186181 Some ( role_group) => merge ( role_group. clone ( ) , role) ,
187182 None => role. clone ( ) ,
188183 }
189184}
190185
191- /// Flatten resolved key/value overrides into a plain map, dropping entries whose value is
192- /// unset (` null`) .
186+ /// Flatten resolved key/value overrides into a plain map. operator-rs #1219 made the override
187+ /// values plain `String`, so there is no longer any ` null`/unset entry to drop .
193188fn flatten_overrides ( overrides : KeyValueConfigOverrides ) -> BTreeMap < String , String > {
194- overrides
195- . overrides
196- . into_iter ( )
197- . filter_map ( |( key, value) | value. map ( |value| ( key, value) ) )
198- . collect ( )
189+ overrides. overrides
199190}
200191
201192fn collect_broker_role_group_overrides (
@@ -297,13 +288,12 @@ mod tests {
297288
298289 use super :: { flatten_overrides, merge_role_group_overrides} ;
299290
300- /// Build a `KeyValueConfigOverrides` from `(key, value)` pairs, where a `None` value
301- /// represents an explicit `null` (unset) in the CRD.
302- fn overrides ( pairs : & [ ( & str , Option < & str > ) ] ) -> KeyValueConfigOverrides {
291+ /// Build a `KeyValueConfigOverrides` from `(key, value)` pairs.
292+ fn overrides ( pairs : & [ ( & str , & str ) ] ) -> KeyValueConfigOverrides {
303293 KeyValueConfigOverrides {
304294 overrides : pairs
305295 . iter ( )
306- . map ( |( key, value) | ( key. to_string ( ) , value. map ( str :: to_string) ) )
296+ . map ( |( key, value) | ( key. to_string ( ) , value. to_string ( ) ) )
307297 . collect ( ) ,
308298 }
309299 }
@@ -318,8 +308,8 @@ mod tests {
318308
319309 #[ test]
320310 fn role_group_value_wins_over_role ( ) {
321- let role = overrides ( & [ ( "a" , Some ( "role" ) ) , ( "b" , Some ( "role-only" ) ) ] ) ;
322- let role_group = overrides ( & [ ( "a" , Some ( "rg" ) ) ] ) ;
311+ let role = overrides ( & [ ( "a" , "role" ) , ( "b" , "role-only" ) ] ) ;
312+ let role_group = overrides ( & [ ( "a" , "rg" ) ] ) ;
323313
324314 let merged = resolve ( role, Some ( role_group) ) ;
325315
@@ -332,43 +322,9 @@ mod tests {
332322 ) ;
333323 }
334324
335- /// Illustrates the key consequence of using `Merge` (rather than `.extend()`, as `main`'s
336- /// product-config did): a role-group `null` is treated as "inherit", so the role-level value
337- /// is *kept* — it does NOT unset the key. Under the old `.extend()` behaviour this same input
338- /// would have removed `a` entirely.
339325 #[ test]
340- fn role_group_null_inherits_role_value_rather_than_unsetting_it ( ) {
341- let role = overrides ( & [ ( "a" , Some ( "role" ) ) ] ) ;
342- let role_group = overrides ( & [ ( "a" , None ) ] ) ; // explicit `null` at the more specific level
343-
344- // For contrast: `main`'s product-config used a blind `.extend()`, so the role-group
345- // `null` overwrote the role value and the key was then dropped — i.e. unset entirely.
346- let old_extend_behaviour: BTreeMap < String , String > = {
347- let mut combined = role. overrides . clone ( ) ;
348- combined. extend ( role_group. overrides . clone ( ) ) ;
349- combined
350- . into_iter ( )
351- . filter_map ( |( key, value) | value. map ( |value| ( key, value) ) )
352- . collect ( )
353- } ;
354- assert ! (
355- old_extend_behaviour. is_empty( ) ,
356- "under the old `.extend()` behaviour the role-group `null` unsets `a`"
357- ) ;
358-
359- // What we do now (Merge): the role-group `null` means "inherit", so the role-level
360- // value is kept rather than unset.
361- let merged = resolve ( role, Some ( role_group) ) ;
362- assert_eq ! (
363- merged,
364- BTreeMap :: from( [ ( "a" . to_string( ) , "role" . to_string( ) ) ] ) ,
365- "under Merge semantics the role-group `null` inherits the role-level value"
366- ) ;
367- }
368-
369- #[ test]
370- fn without_a_role_group_role_values_are_kept_and_nulls_dropped ( ) {
371- let role = overrides ( & [ ( "a" , Some ( "role" ) ) , ( "b" , None ) ] ) ;
326+ fn without_a_role_group_role_values_are_kept ( ) {
327+ let role = overrides ( & [ ( "a" , "role" ) ] ) ;
372328
373329 let merged = resolve ( role, None ) ;
374330
0 commit comments