type Cache interface {
// AssumePod assumes a pod scheduled and aggregates the pod's information into its node.
// The implementation also decides the policy to expire pod before being confirmed (receiving Add event).
// After expiration, its information would be subtracted.AssumePod(pod *v1.Pod) error// FinishBinding signals that cache for assumed pod can be expiredFinishBinding(pod *v1.Pod) error// ForgetPod removes an assumed pod from cache.ForgetPod(pod *v1.Pod) error// AddPod either confirms a pod if it's assumed, or adds it back if it's expired.
// If added back, the pod's information would be added again.AddPod(pod *v1.Pod) error// UpdatePod removes oldPod's information and adds newPod's information.UpdatePod(oldPod, newPod *v1.Pod) error// RemovePod removes a pod. The pod's information would be subtracted from assigned node.RemovePod(pod *v1.Pod) error// GetPod returns the pod from the cache with the same namespace and the
// same name of the specified pod.GetPod(pod *v1.Pod) (*v1.Pod, error)
// IsAssumedPod returns true if the pod is assumed and not expired.IsAssumedPod(pod *v1.Pod) (bool, error)
// AddNode adds overall information about node.AddNode(node *v1.Node) error// UpdateNode updates overall information about node.UpdateNode(oldNode, newNode *v1.Node) error// RemoveNode removes overall information about node.RemoveNode(node *v1.Node) error// AddPDB adds a PodDisruptionBudget object to the cache.AddPDB(pdb *policy.PodDisruptionBudget) error// UpdatePDB updates a PodDisruptionBudget object in the cache.UpdatePDB(oldPDB, newPDB *policy.PodDisruptionBudget) error// RemovePDB removes a PodDisruptionBudget object from the cache.RemovePDB(pdb *policy.PodDisruptionBudget) error// List lists all cached PDBs matching the selector.ListPDBs(selector labels.Selector) ([]*policy.PodDisruptionBudget, error)
// UpdateNodeNameToInfoMap updates the passed infoMap to the current contents of Cache.
// The node info contains aggregated information of pods scheduled (including assumed to be)
// on this node.UpdateNodeNameToInfoMap(infoMap map[string]*NodeInfo) error// List lists all cached pods (including assumed ones).List(labels.Selector) ([]*v1.Pod, error)
// FilteredList returns all cached pods that pass the filter.FilteredList(filter PodFilter, selector labels.Selector) ([]*v1.Pod, error)
// Snapshot takes a snapshot on current cacheSnapshot() *Snapshot// IsUpToDate returns true if the given NodeInfo matches the current data in the cache.IsUpToDate(n *NodeInfo) bool
}

Cache collects pods' information and provides node-level aggregated information.
It's intended for generic scheduler to do efficient lookup.
Cache's operations are pod centric. It does incremental updates based on pod events.
Pod events are sent via network. We don't have guaranteed delivery of all events:
We use Reflector to list and watch from remote.
Reflector might be slow and do a relist, which would lead to missing events.

Note that an assumed pod can expire, because if we haven't received Add event notifying us
for a while, there might be some problems and we shouldn't keep the pod in cache anymore.

Note that "Initial", "Expired", and "Deleted" pods do not actually exist in cache.
Based on existing use cases, we are making the following assumptions:
- No pod would be assumed twice
- A pod could be added without going through scheduler. In this case, we will see Add but not Assume event.
- If a pod wasn't added, it wouldn't be removed or updated.
- Both "Expired" and "Deleted" are valid end states. In case of some problems, e.g. network issue,

a pod might have changed its state (e.g. added and deleted) without delivering notification to the cache.

New returns a Cache implementation.
It automatically starts a go routine that manages expiration of assumed pods.
"ttl" is how long the assumed pod will get expired.
"stop" is the channel that would close the background goroutine.

type NodeInfo struct {
// TransientInfo holds the information pertaining to a scheduling cycle. This will be destructed at the end of
// scheduling cycle.
// TODO: @ravig. Remove this once we have a clear approach for message passing across predicates and priorities.TransientInfo *transientSchedulerInfo
// contains filtered or unexported fields
}

FilterOutPods receives a list of pods and filters out those whose node names
are equal to the node of this NodeInfo, but are not found in the pods of this NodeInfo.

Preemption logic simulates removal of pods on a node by removing them from the
corresponding NodeInfo. In order for the simulation to work, we call this method
on the pods returned from SchedulerCache, so that predicate functions see
only the pods that are not removed from the NodeInfo.