in load.go [511:576]
func (s Spec) Validate() error {
var errs []error
for name, src := range s.Sources {
if strings.ContainsRune(name, os.PathSeparator) {
errs = append(errs, &InvalidSourceError{Name: name, Err: sourceNamePathSeparatorError})
}
if err := src.validate(); err != nil {
errs = append(errs, &InvalidSourceError{Name: name, Err: fmt.Errorf("error validating source ref %q: %w", name, err)})
}
if src.DockerImage != nil && src.DockerImage.Cmd != nil {
for p, cfg := range src.DockerImage.Cmd.CacheDirs {
if _, err := sharingMode(cfg.Mode); err != nil {
errs = append(errs, &InvalidSourceError{Name: name, Err: errors.Wrapf(err, "invalid sharing mode for source %q with cache mount at path %q", name, p)})
}
}
}
}
for _, t := range s.Tests {
if err := t.validate(); err != nil {
errs = append(errs, errors.Wrap(err, t.Name))
}
}
for src, patches := range s.Patches {
for _, patch := range patches {
patchSrc, ok := s.Sources[patch.Source]
if !ok {
errs = append(errs, &InvalidPatchError{Source: src, PatchSpec: &patch, Err: errMissingSource})
continue
}
if err := validatePatch(patch, patchSrc); err != nil {
errs = append(errs, &InvalidPatchError{Source: src, PatchSpec: &patch, Err: err})
}
}
}
switch s.Build.NetworkMode {
case "", netModeNone, netModeSandbox:
default:
errs = append(errs, fmt.Errorf("invalid network mode: %q: valid values %s", s.Build.NetworkMode, []string{netModeNone, netModeSandbox}))
}
if err := s.Dependencies.validate(); err != nil {
errs = append(errs, errors.Wrap(err, "dependencies"))
}
if err := s.Image.validate(); err != nil {
errs = append(errs, errors.Wrap(err, "image"))
}
for k, t := range s.Targets {
if err := t.validate(); err != nil {
errs = append(errs, errors.Wrapf(err, "target %s", k))
}
}
if err := s.Image.validate(); err != nil {
errs = append(errs, errors.Wrap(err, "image"))
}
return goerrors.Join(errs...)
}