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
}