func()

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
}