in pkg/appmgmt/appmgmt_recovery.go [49:85]
func (svc *AppManagementService) recoverApps() (map[string]interfaces.ManagedApp, error) {
log.Log(log.ShimAppMgmt).Info("Starting app recovery")
recoveringApps := make(map[string]interfaces.ManagedApp)
for _, mgr := range svc.managers {
if m, ok := mgr.(interfaces.Recoverable); ok {
pods, err := m.ListPods()
if err != nil {
log.Log(log.ShimAppMgmt).Error("failed to list apps", zap.Error(err))
return recoveringApps, err
}
sort.Slice(pods, func(i, j int) bool {
return pods[i].CreationTimestamp.Unix() < pods[j].CreationTimestamp.Unix()
})
// Track terminated pods that we have already seen in order to
// skip redundant handling of async events in RecoveryDone
// This filter is used for terminated pods to remain consistent
// with pod filters in the informer
terminatedYkPods := make(map[string]bool)
for _, pod := range pods {
if utils.GetApplicationIDFromPod(pod) != "" {
if !utils.IsPodTerminated(pod) {
app := svc.podEventHandler.HandleEvent(general.AddPod, general.Recovery, pod)
recoveringApps[app.GetApplicationID()] = app
continue
}
terminatedYkPods[string(pod.UID)] = true
}
}
log.Log(log.ShimAppMgmt).Info("Recovery finished")
svc.podEventHandler.RecoveryDone(terminatedYkPods)
}
}
return recoveringApps, nil
}