Skip to content

Commit 031bd3e

Browse files
committed
Terminal Add filter function to reflector::Store
Signed-off-by: JPaja <[email protected]>
1 parent 6a980c6 commit 031bd3e

File tree

1 file changed

+65
-0
lines changed

1 file changed

+65
-0
lines changed

kube-runtime/src/reflector/store.rs

+65
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,21 @@ where
243243
s.values().cloned().collect()
244244
}
245245

246+
/// Retrieve a list of cloned entries found by the given predicate
247+
#[must_use]
248+
pub fn filter<P>(&self, predicate: P) -> Vec<Arc<K>>
249+
where
250+
P: Fn(&K) -> bool,
251+
{
252+
self.store
253+
.read()
254+
.iter()
255+
.map(|(_, k)| k)
256+
.filter(|k| predicate(k.as_ref()))
257+
.cloned()
258+
.collect()
259+
}
260+
246261
/// Retrieve a `clone()` of the entry found by the given predicate
247262
#[must_use]
248263
pub fn find<P>(&self, predicate: P) -> Option<Arc<K>>
@@ -408,4 +423,54 @@ mod tests {
408423
let found = reader.find(|k| k.metadata.generation == Some(1234));
409424
assert_eq!(found.as_deref(), Some(&target_cm));
410425
}
426+
427+
#[test]
428+
fn filter_elements_in_store() {
429+
let mut cm_list = vec![];
430+
431+
for i in 0..5 {
432+
let cm = ConfigMap {
433+
metadata: ObjectMeta {
434+
name: Some(format!("obj{i}")),
435+
namespace: None,
436+
generation: Some(i),
437+
..ObjectMeta::default()
438+
},
439+
..ConfigMap::default()
440+
};
441+
442+
cm_list.push(cm);
443+
}
444+
445+
let (reader, mut writer) = store::<ConfigMap>();
446+
assert!(reader.is_empty());
447+
for cm in &cm_list {
448+
writer.apply_watcher_event(&watcher::Event::Apply(cm.clone()));
449+
}
450+
451+
assert_eq!(reader.len(), 5);
452+
assert!(reader.filter(|k| k.metadata.generation == Some(1234)).is_empty());
453+
454+
//0, 2, 4
455+
let filtered = reader.filter(|k| k.metadata.generation.map(|o| o % 2) == Some(0));
456+
assert_eq!(filtered.len(), 3);
457+
458+
let mut filtered_generatios = filtered
459+
.into_iter()
460+
.map(|k| k.metadata.generation.unwrap())
461+
.collect::<Vec<_>>();
462+
filtered_generatios.sort();
463+
464+
assert_eq!(filtered_generatios, vec![0, 2, 4]);
465+
466+
let mut target_cm = cm_list[0].clone();
467+
target_cm.metadata.name = Some("obj_target".to_string());
468+
target_cm.metadata.generation = Some(1234);
469+
writer.apply_watcher_event(&watcher::Event::Apply(target_cm.clone()));
470+
assert_eq!(reader.len(), 6);
471+
472+
let filtered = reader.filter(|k| k.metadata.generation == Some(1234));
473+
assert_eq!(filtered.len(), 1);
474+
assert_eq!(filtered[0].as_ref(), &target_cm);
475+
}
411476
}

0 commit comments

Comments
 (0)