func getImageDigest()

in images/controller/cmd/image_puller/image_puller.go [238:278]


func getImageDigest(image, accessToken string) (string, error) {
	respImage := ""

	imageTags, err := broker.ListGCRImageTags(image, accessToken)
	if err != nil {
		return respImage, err
	}

	if len(regexp.MustCompile(broker.GCRImageWithTagPattern).FindAllString(image, -1)) > 0 {
		// Find image digest from tag.
		imageToks := strings.Split(strings.ReplaceAll(image, "gcr.io/", ""), ":")
		imageRepo := imageToks[0]
		imageTag := imageToks[1]

		for digest, meta := range imageTags.Manifest {
			for _, tag := range meta.Tag {
				if tag == imageTag {
					respImage = fmt.Sprintf("gcr.io/%s@%s", imageRepo, digest)
					break
				}
			}
			if len(respImage) > 0 {
				break
			}
		}
	}

	if len(regexp.MustCompile(broker.GCRImageWithDigestPattern).FindAllString(image, -1)) > 0 {
		// Verify image digest is in list response.
		imageDigest := strings.Split(strings.ReplaceAll(image, "gcr.io/", ""), "@")[1]
		if _, ok := imageTags.Manifest[imageDigest]; ok {
			respImage = image
		}
	}

	if len(respImage) == 0 {
		return respImage, fmt.Errorf("failed to find digest for image: %s", image)
	}

	return respImage, nil
}