func makeImagePullJob()

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
}