| /* | |
| Copyright 2015 The Kubernetes Authors. | |
| Licensed under the Apache License, Version 2.0 (the "License"); | |
| you may not use this file except in compliance with the License. | |
| You may obtain a copy of the License at | |
| http://www.apache.org/licenses/LICENSE-2.0 | |
| Unless required by applicable law or agreed to in writing, software | |
| distributed under the License is distributed on an "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| See the License for the specific language governing permissions and | |
| limitations under the License. | |
| */ | |
| package cache | |
| import ( | |
| v1 "k8s.io/api/core/v1" | |
| "k8s.io/apimachinery/pkg/util/sets" | |
| "k8s.io/klog/v2" | |
| "k8s.io/kubernetes/pkg/scheduler/framework" | |
| ) | |
| // 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. | |
| // | |
| // State Machine of a pod's events in scheduler's cache: | |
| // | |
| // +-------------------------------------------+ +----+ | |
| // | Add | | | | |
| // | | | | Update | |
| // + Assume Add v v | | |
| // | |
| // Initial +--------> Assumed +------------+---> Added <--+ | |
| // | |
| // ^ + + | + | |
| // | | | | | | |
| // | | | Add | | Remove | |
| // | | | | | | |
| // | | | + | | |
| // +----------------+ +-----------> Expired +----> Deleted | |
| // Forget Expire | |
| // | |
| // 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. | |
| type Cache interface { | |
| // NodeCount returns the number of nodes in the cache. | |
| // DO NOT use outside of tests. | |
| NodeCount() int | |
| // PodCount returns the number of pods in the cache (including those from deleted nodes). | |
| // DO NOT use outside of tests. | |
| PodCount() (int, error) | |
| // 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(logger klog.Logger, pod *v1.Pod) error | |
| // FinishBinding signals that cache for assumed pod can be expired | |
| FinishBinding(logger klog.Logger, pod *v1.Pod) error | |
| // ForgetPod removes an assumed pod from cache. | |
| ForgetPod(logger klog.Logger, 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(logger klog.Logger, pod *v1.Pod) error | |
| // UpdatePod removes oldPod's information and adds newPod's information. | |
| UpdatePod(logger klog.Logger, oldPod, newPod *v1.Pod) error | |
| // RemovePod removes a pod. The pod's information would be subtracted from assigned node. | |
| RemovePod(logger klog.Logger, 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. | |
| // It returns a clone of added NodeInfo object. | |
| AddNode(logger klog.Logger, node *v1.Node) *framework.NodeInfo | |
| // UpdateNode updates overall information about node. | |
| // It returns a clone of updated NodeInfo object. | |
| UpdateNode(logger klog.Logger, oldNode, newNode *v1.Node) *framework.NodeInfo | |
| // RemoveNode removes overall information about node. | |
| RemoveNode(logger klog.Logger, node *v1.Node) error | |
| // UpdateSnapshot updates the passed infoSnapshot to the current contents of Cache. | |
| // The node info contains aggregated information of pods scheduled (including assumed to be) | |
| // on this node. | |
| // The snapshot only includes Nodes that are not deleted at the time this function is called. | |
| // nodeinfo.Node() is guaranteed to be not nil for all the nodes in the snapshot. | |
| UpdateSnapshot(logger klog.Logger, nodeSnapshot *Snapshot) error | |
| // Dump produces a dump of the current cache. | |
| Dump() *Dump | |
| } | |
| // Dump is a dump of the cache state. | |
| type Dump struct { | |
| AssumedPods sets.Set[string] | |
| Nodes map[string]*framework.NodeInfo | |
| } |