in source.go [815:893]
func (s *Source) validate(failContext ...string) (retErr error) {
count := 0
defer func() {
if retErr != nil && failContext != nil {
retErr = errors.Wrap(retErr, strings.Join(failContext, " "))
}
}()
for _, g := range s.Generate {
if err := g.Validate(); err != nil {
retErr = goerrors.Join(retErr, err)
}
}
if s.DockerImage != nil {
if s.DockerImage.Ref == "" {
retErr = goerrors.Join(retErr, fmt.Errorf("docker image source variant must have a ref"))
}
if s.DockerImage.Cmd != nil {
// If someone *really* wants to extract the entire rootfs, they need to say so explicitly.
// We won't fill this in for them, particularly because this is almost certainly not the user's intent.
if s.Path == "" {
retErr = goerrors.Join(retErr, errors.Errorf("source path cannot be empty"))
}
for _, mnt := range s.DockerImage.Cmd.Mounts {
if err := mnt.validate(s.Path); err != nil {
retErr = goerrors.Join(retErr, err)
}
if err := mnt.Spec.validate("docker image source with ref", "'"+s.DockerImage.Ref+"'"); err != nil {
retErr = goerrors.Join(retErr, err)
}
}
}
count++
}
if s.Git != nil {
count++
}
if s.HTTP != nil {
if err := s.HTTP.validate(); err != nil {
retErr = goerrors.Join(retErr, err)
}
count++
}
if s.Context != nil {
count++
}
if s.Build != nil {
c := s.Build.DockerfilePath
if err := s.Build.validate("build source with dockerfile", "`"+c+"`"); err != nil {
retErr = goerrors.Join(retErr, err)
}
count++
}
if s.Inline != nil {
if err := s.Inline.validate(s.Path); err != nil {
retErr = goerrors.Join(retErr, err)
}
count++
}
switch count {
case 0:
retErr = goerrors.Join(retErr, fmt.Errorf("no non-nil source variant"))
case 1:
return retErr
default:
retErr = goerrors.Join(retErr, fmt.Errorf("more than one source variant defined"))
}
return retErr
}