in nfm-controller/src/kubernetes/kubernetes_metadata_collector.rs [163:205]
fn handle_pod_event(
pod_event_result: Result<Event<Pod>, watcher::Error>,
pod_info_root_map: Arc<Mutex<HashMap<IpAddr, HashMap<i32, PodInfo>>>>,
) {
let pod_event = match pod_event_result {
Ok(event) => event,
Err(err) => {
info!(message = err.to_string(); "watcher encountered an error, will autorecover in next poll");
return;
}
};
match pod_event {
Event::Apply(pod) | Event::InitApply(pod) => {
let ports = Self::get_tcp_ports_from_pod(&pod);
if let Some(pod_ip) = Self::get_ip_from_pod(&pod) {
let mut pod_info = pod_info_root_map.lock().unwrap();
for port in &ports {
pod_info
.entry(pod_ip)
.or_default()
.entry(*port)
.or_insert_with(||
// Only insert if pod info for this port doesn't exist.
// If its already filled by endpoint slice info, do not override it because it will contain more info.
// In case this pod event comes before endpoint slice event, that is alright as endpoint slice event will override it.
PodInfo {
name: pod.name_any(),
..Default::default()
});
}
}
}
Event::Delete(pod) => {
if let Some(pod_ip) = Self::get_ip_from_pod(&pod) {
let ports = Self::get_tcp_ports_from_pod(&pod);
let mut pod_info = pod_info_root_map.lock().unwrap();
Self::purge_pod_ip_ports_from_pod_info(&mut pod_info, &pod_ip, &ports);
}
}
_ => {}
}
}