func()

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
}