in clusterloader2/pkg/imagepreload/imagepreload.go [85:160]
func (c *controller) PreloadImages() error {
if len(images) == 0 {
klog.Warning("No images specified. Skipping image preloading")
return nil
}
if !c.config.ClusterConfig.Provider.Features().SupportImagePreload {
klog.Warningf("Image preloading is disabled in provider: %s", c.config.ClusterConfig.Provider.Name())
return nil
}
kclient := c.framework.GetClientSets().GetClient()
doneNodes := make(map[string]struct{})
stopCh := make(chan struct{})
defer close(stopCh)
nodeInformer := informer.NewInformer(
&cache.ListWatch{
ListFunc: func(options metav1.ListOptions) (runtime.Object, error) {
return kclient.CoreV1().Nodes().List(context.TODO(), options)
},
WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) {
return kclient.CoreV1().Nodes().Watch(context.TODO(), options)
},
},
func(old, new interface{}) { c.checkNode(doneNodes, old, new) })
if err := informer.StartAndSync(nodeInformer, stopCh, informerTimeout); err != nil {
return err
}
klog.V(2).Infof("Creating namespace %s...", namespace)
if err := client.CreateNamespace(kclient, namespace); err != nil {
return err
}
klog.V(2).Info("Creating daemonset to preload images...")
c.templateMapping["Images"] = c.images
if err := c.framework.ApplyTemplatedManifests(manifest, c.templateMapping); err != nil {
return err
}
klog.V(2).Infof("Getting %s/%s deamonset size...", namespace, daemonsetName)
ds, err := kclient.AppsV1().DaemonSets(namespace).Get(context.TODO(), daemonsetName, metav1.GetOptions{})
if err != nil {
return err
}
size, err := runtimeobjects.GetReplicasFromRuntimeObject(kclient, ds)
if err != nil {
return err
}
if err := size.Start(stopCh); err != nil {
return err
}
var clusterSize, doneCount int
klog.V(2).Infof("Waiting for %d Node objects to be updated...", size.Replicas())
if err := wait.Poll(pollingInterval, pollingTimeout, func() (bool, error) {
clusterSize = size.Replicas()
doneCount = c.countDone(doneNodes)
klog.V(3).Infof("%d out of %d nodes have pulled images", doneCount, clusterSize)
return doneCount == clusterSize, nil
}); err != nil {
klog.Errorf("%d out of %d nodes have pulled images", doneCount, clusterSize)
return err
}
klog.V(2).Info("Waiting... done")
klog.V(2).Infof("Deleting namespace %s...", namespace)
if err := client.DeleteNamespace(kclient, namespace); err != nil {
return err
}
if err := client.WaitForDeleteNamespace(kclient, namespace); err != nil {
return err
}
return nil
}