loader.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package opa
  2. import (
  3. "context"
  4. "fmt"
  5. "io/ioutil"
  6. "path/filepath"
  7. "github.com/open-policy-agent/opa/rego"
  8. "sigs.k8s.io/yaml"
  9. )
  10. type ConfigFile map[string]ConfigFilePolicyCollection
  11. type ConfigFilePolicyCollection struct {
  12. Kind string `yaml:"kind"`
  13. Match MatchParameters `yaml:"match"`
  14. MustExist bool `yaml:"mustExist"`
  15. OverrideSeverity string `yaml:"override_severity"`
  16. Policies []ConfigFilePolicy `yaml:"policies"`
  17. }
  18. type ConfigFilePolicy struct {
  19. Path string
  20. Name string
  21. }
  22. func LoadPolicies(configFilePathDir string) (*KubernetesPolicies, error) {
  23. // read and parse the config file
  24. fileBytes, err := ioutil.ReadFile(filepath.Join(configFilePathDir, "config.yaml"))
  25. if err != nil {
  26. return nil, err
  27. }
  28. configFile := make(map[string]ConfigFilePolicyCollection)
  29. err = yaml.Unmarshal(fileBytes, &configFile)
  30. if err != nil {
  31. return nil, err
  32. }
  33. // load each map entry
  34. policies := make(map[string]KubernetesOPAQueryCollection)
  35. for name, cfPolicyCollection := range configFile {
  36. queries := make([]rego.PreparedEvalQuery, 0)
  37. for _, cfPolicy := range cfPolicyCollection.Policies {
  38. fileBytes, err := ioutil.ReadFile(filepath.Join(configFilePathDir, cfPolicy.Path))
  39. if err != nil {
  40. return nil, err
  41. }
  42. query, err := rego.New(
  43. rego.Query(fmt.Sprintf("data.%s", cfPolicy.Name)),
  44. rego.Module(cfPolicy.Name, string(fileBytes)),
  45. ).PrepareForEval(context.Background())
  46. if err != nil {
  47. // Handle error.
  48. return nil, err
  49. }
  50. queries = append(queries, query)
  51. }
  52. policies[name] = KubernetesOPAQueryCollection{
  53. Kind: KubernetesBuiltInKind(cfPolicyCollection.Kind),
  54. Queries: queries,
  55. Match: cfPolicyCollection.Match,
  56. MustExist: cfPolicyCollection.MustExist,
  57. }
  58. }
  59. return &KubernetesPolicies{
  60. Policies: policies,
  61. }, nil
  62. }