| /* |
| 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 ( |
| "k8s.io/api/core/v1" |
| "k8s.io/apimachinery/pkg/util/sets" |
| ) |
| |
| // CreateNodeNameToInfoMap obtains a list of pods and pivots that list into a map where the keys are node names |
| // and the values are the aggregated information for that node. |
| func CreateNodeNameToInfoMap(pods []*v1.Pod, nodes []*v1.Node) map[string]*NodeInfo { |
| nodeNameToInfo := make(map[string]*NodeInfo) |
| for _, pod := range pods { |
| nodeName := pod.Spec.NodeName |
| if _, ok := nodeNameToInfo[nodeName]; !ok { |
| nodeNameToInfo[nodeName] = NewNodeInfo() |
| } |
| nodeNameToInfo[nodeName].AddPod(pod) |
| } |
| imageExistenceMap := createImageExistenceMap(nodes) |
| |
| for _, node := range nodes { |
| if _, ok := nodeNameToInfo[node.Name]; !ok { |
| nodeNameToInfo[node.Name] = NewNodeInfo() |
| } |
| nodeInfo := nodeNameToInfo[node.Name] |
| nodeInfo.SetNode(node) |
| nodeInfo.imageStates = getNodeImageStates(node, imageExistenceMap) |
| } |
| return nodeNameToInfo |
| } |
| |
| // getNodeImageStates returns the given node's image states based on the given imageExistence map. |
| func getNodeImageStates(node *v1.Node, imageExistenceMap map[string]sets.String) map[string]*ImageStateSummary { |
| imageStates := make(map[string]*ImageStateSummary) |
| |
| for _, image := range node.Status.Images { |
| for _, name := range image.Names { |
| imageStates[name] = &ImageStateSummary{ |
| Size: image.SizeBytes, |
| NumNodes: len(imageExistenceMap[name]), |
| } |
| } |
| } |
| return imageStates |
| } |
| |
| // createImageExistenceMap returns a map recording on which nodes the images exist, keyed by the images' names. |
| func createImageExistenceMap(nodes []*v1.Node) map[string]sets.String { |
| imageExistenceMap := make(map[string]sets.String) |
| for _, node := range nodes { |
| for _, image := range node.Status.Images { |
| for _, name := range image.Names { |
| if _, ok := imageExistenceMap[name]; !ok { |
| imageExistenceMap[name] = sets.NewString(node.Name) |
| } else { |
| imageExistenceMap[name].Insert(node.Name) |
| } |
| } |
| } |
| } |
| return imageExistenceMap |
| } |