in images/controller/cmd/image_puller/image_puller.go [292:347]
func makeImagePullJob(image, tag, nodeName, namespace, templatePath string) error {
imageToks := strings.Split(strings.ReplaceAll(image, "gcr.io/", ""), "@sha256:")
imageBase := path.Base(imageToks[0])
digestHash := imageToks[1]
h := sha1.New()
io.WriteString(h, fmt.Sprintf("%s", nodeName))
nodeNameHash := fmt.Sprintf("%x", h.Sum(nil))
nameSuffix := fmt.Sprintf("%s-%s-%s", imageBase, digestHash[:5], nodeNameHash[:5])
log.Printf("creating image pull job: %s, %s, %s", nodeName, image, nameSuffix)
type templateData struct {
NameSuffix string
NodeName string
Image string
Tag string
}
data := templateData{
NameSuffix: nameSuffix,
NodeName: nodeName,
Image: image,
Tag: tag,
}
destDir := path.Join("/run/image-puller", nameSuffix)
if err := os.MkdirAll(destDir, os.ModePerm); err != nil {
return fmt.Errorf("failed to make destDir %s: %v", destDir, err)
}
base := path.Base(templatePath)
t, err := template.New(base).Funcs(sprig.TxtFuncMap()).ParseFiles(templatePath)
if err != nil {
return fmt.Errorf("failed to initialize template: %v", err)
}
dest, _ := os.Create(strings.ReplaceAll(path.Join(destDir, base), ".tmpl", ""))
if err != nil {
return fmt.Errorf("failed to create dest template file: %v", err)
}
if err = t.Execute(dest, &data); err != nil {
return fmt.Errorf("failed to execute template: %v", err)
}
// Apply the job to the cluster
cmd := exec.Command("sh", "-c", fmt.Sprintf("kubectl apply -f %s 1>&2", destDir))
cmd.Dir = path.Dir(destDir)
stdoutStderr, err := cmd.CombinedOutput()
if err != nil {
return fmt.Errorf("error calling kubectl to apply job: %v\n%s", err, string(stdoutStderr))
}
return nil
}