loader.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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 `json:"kind"`
  13. Match MatchParameters `json:"match"`
  14. MustExist bool `json:"mustExist"`
  15. OverrideSeverity string `json:"override_severity"`
  16. Policies []ConfigFilePolicy `json:"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. OverrideSeverity: cfPolicyCollection.OverrideSeverity,
  57. MustExist: cfPolicyCollection.MustExist,
  58. }
  59. }
  60. return &KubernetesPolicies{
  61. Policies: policies,
  62. }, nil
  63. }