validate.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package preview
  2. import (
  3. "embed"
  4. "errors"
  5. "fmt"
  6. "github.com/porter-dev/switchboard/pkg/parser"
  7. "github.com/porter-dev/switchboard/pkg/types"
  8. "k8s.io/apimachinery/pkg/util/validation"
  9. )
  10. //go:embed embed/*.schema.json
  11. var schemas embed.FS
  12. var (
  13. ErrNoPorterYAMLFile = errors.New("porter.yaml does not exist in the root of this repository")
  14. ErrEmptyPorterYAMLFile = errors.New("porter.yaml is empty")
  15. ErrUnsupportedDriver = errors.New("no such driver")
  16. )
  17. type driverBasedResourceValidator func(*types.Resource) error
  18. var driverValidators = make(map[string]driverBasedResourceValidator)
  19. func init() {
  20. driverValidators[""] = deployDriverValidator
  21. driverValidators["deploy"] = deployDriverValidator
  22. driverValidators["build-image"] = buildImageDriverValidator
  23. driverValidators["push-image"] = pushImageDriverValidator
  24. driverValidators["update-config"] = updateConfigDriverValidator
  25. driverValidators["random-string"] = randomStringDriverValidator
  26. driverValidators["env-group"] = envGroupDriverValidator
  27. driverValidators["os-env"] = osEnvDriverValidator
  28. }
  29. func Validate(contents string) []error {
  30. var errors []error
  31. resGroup, err := parser.ParseRawBytes([]byte(contents))
  32. if err != nil {
  33. errors = append(errors, fmt.Errorf("error parsing porter.yaml: %w", err))
  34. return errors
  35. }
  36. depResolver := newDependencyResolver(resGroup.Resources)
  37. err = depResolver.Resolve()
  38. if err != nil {
  39. errors = append(errors, fmt.Errorf("error resolving dependencies: %w", err))
  40. return errors
  41. }
  42. for _, res := range resGroup.Resources {
  43. if len(res.Name) == 0 {
  44. errors = append(errors, fmt.Errorf("resource has no name"))
  45. } else if errStrs := validation.IsDNS1123Label(res.Name); len(errStrs) > 0 {
  46. str := fmt.Sprintf("for resource '%s': invalid characters found in name:", res.Name)
  47. for _, errStr := range errStrs {
  48. str += fmt.Sprintf("\n * %s", errStr)
  49. }
  50. errors = append(errors, fmt.Errorf("%s", str))
  51. }
  52. if validator, ok := driverValidators[res.Driver]; ok {
  53. if err := validator(res); err != nil {
  54. errors = append(errors, err)
  55. }
  56. } else {
  57. errors = append(errors, fmt.Errorf("for resource '%s': %w: %s", res.Name, ErrUnsupportedDriver, res.Driver))
  58. }
  59. }
  60. return errors
  61. }