in image.go [40:96]
func (w *Workflow) imageExists(project, family, image string) (bool, DError) {
if family != "" {
w.imageFamilyCache.mu.Lock()
defer w.imageFamilyCache.mu.Unlock()
if w.imageFamilyCache.exists == nil {
w.imageFamilyCache.exists = map[string]map[string]interface{}{}
}
if _, ok := w.imageFamilyCache.exists[project]; !ok {
w.imageFamilyCache.exists[project] = map[string]interface{}{}
}
if nameInResourceMap(image, w.imageFamilyCache.exists[project]) {
return true, nil
}
img, err := w.ComputeClient.GetImageFromFamily(project, family)
if err != nil {
if apiErr, ok := err.(*googleapi.Error); ok && apiErr.Code == http.StatusNotFound {
return false, nil
}
return false, typedErr(apiError, "failed to get image from family", err)
}
if img.Deprecated != nil {
if img.Deprecated.State == "OBSOLETE" || img.Deprecated.State == "DELETED" {
return true, typedErrf(imageObsoleteDeletedError, "image %q in state %q", img.Name, img.Deprecated.State)
}
}
w.imageFamilyCache.exists[project][img.Name] = img
return true, nil
}
if image == "" {
return false, Errf("must provide either family or name")
}
w.imageCache.mu.Lock()
defer w.imageCache.mu.Unlock()
var err error
if !w.disableCachingImages {
err = w.imageCache.loadCache(func(project string, opts ...daisyCompute.ListCallOption) (interface{}, error) {
return w.ComputeClient.ListImages(project)
}, project, image)
}
if w.disableCachingImages || err != nil {
ic, err := w.ComputeClient.GetImage(project, image)
if err != nil {
return false, typedErr(apiError, "error getting resource for project", err)
}
return true, errIfDeprecatedOrDeleted(ic, image)
}
for _, i := range w.imageCache.exists[project] {
if ic, ok := i.(*compute.Image); ok && image == ic.Name {
return true, errIfDeprecatedOrDeleted(ic, image)
}
}
return false, nil
}