// generateTestingImageList generate randomly generated image list and corresponding expectedImageList. func generateTestingImageList(count int) ([]kubecontainer.Image, []api.ContainerImage) { // imageList is randomly generated image list var imageList []kubecontainer.Image for ; count > 0; count-- { imageItem := kubecontainer.Image{ ID: string(uuid.NewUUID()), RepoTags: generateImageTags(), Size: rand.Int63nRange(minImgSize, maxImgSize+1), } imageList = append(imageList, imageItem) } // expectedImageList is generated by imageList according to size and maxImagesInNodeStatus // 1. sort the imageList by size sort.Sort(sliceutils.ByImageSize(imageList)) // 2. convert sorted imageList to api.ContainerImage list var expectedImageList []api.ContainerImage for _, kubeImage := range imageList { apiImage := api.ContainerImage{ Names: kubeImage.RepoTags[0:maxNamesPerImageInNodeStatus], SizeBytes: kubeImage.Size, } expectedImageList = append(expectedImageList, apiImage) } // 3. only returns the top maxImagesInNodeStatus images in expectedImageList return imageList, expectedImageList[0:maxImagesInNodeStatus] }
// Set images list for the node func (kl *Kubelet) setNodeStatusImages(node *v1.Node) { // Update image list of this node var imagesOnNode []v1.ContainerImage containerImages, err := kl.imageManager.GetImageList() if err != nil { glog.Errorf("Error getting image list: %v", err) } else { // sort the images from max to min, and only set top N images into the node status. sort.Sort(sliceutils.ByImageSize(containerImages)) if maxImagesInNodeStatus < len(containerImages) { containerImages = containerImages[0:maxImagesInNodeStatus] } for _, image := range containerImages { names := append(image.RepoDigests, image.RepoTags...) // Report up to maxNamesPerImageInNodeStatus names per image. if len(names) > maxNamesPerImageInNodeStatus { names = names[0:maxNamesPerImageInNodeStatus] } imagesOnNode = append(imagesOnNode, v1.ContainerImage{ Names: names, SizeBytes: image.Size, }) } } node.Status.Images = imagesOnNode }