func()

in image.go [410:459]


func (ib *ImageBase) validate(ctx context.Context, ii ImageInterface, licenses []string, s *Step) DError {
	pre := fmt.Sprintf("cannot create image %q", ib.daisyName)
	errs := ib.Resource.validate(ctx, s, pre)

	if !xor(!xor(ii.getSourceDisk() == "", ii.getSourceImage() == ""), !ii.hasRawDisk()) {
		errs = addErrs(errs, Errf("%s: must provide either SourceImage, SourceDisk or RawDisk, exclusively", pre))
	}

	// Source disk checking.
	if ii.getSourceDisk() != "" {
		if _, err := s.w.disks.regUse(ii.getSourceDisk(), s); err != nil {
			errs = addErrs(errs, newErr("failed to get source disk", err))
		}
	}

	// Source image checking.
	if ii.getSourceImage() != "" {
		_, err := s.w.images.regUse(ii.getSourceImage(), s)
		errs = addErrs(errs, err)
	}

	// RawDisk.Source checking.
	if ii.hasRawDisk() {
		sBkt, sObj, err := splitGCSPath(ii.getRawDiskSource())
		errs = addErrs(errs, err)

		// Check if this image object is created by this workflow, otherwise check if object exists.
		if !strIn(path.Join(sBkt, sObj), s.w.objects.created) && !strings.HasPrefix(sObj, s.w.outsPath) {
			if _, err := s.w.StorageClient.Bucket(sBkt).Object(sObj).Attrs(ctx); err != nil {
				errs = addErrs(errs, Errf("error reading object %s/%s: %v", sBkt, sObj, err))
			}
		}
	}

	// License checking.
	for _, l := range licenses {
		result := NamedSubexp(licenseURLRegex, l)
		if exists, err := s.w.licenseExists(result["project"], result["license"]); err != nil {
			if !(isGoogleAPIForbiddenError(err) && ib.IgnoreLicenseValidationIfForbidden) {
				errs = addErrs(errs, Errf("%s: bad license lookup: %q, error: %v", pre, l, err))
			}
		} else if !exists {
			errs = addErrs(errs, Errf("%s: license does not exist: %q", pre, l))
		}
	}

	// Register image creation.
	errs = addErrs(errs, s.w.images.regCreate(ib.daisyName, &ib.Resource, s, ib.OverWrite))
	return errs
}