loader.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. Policies []ConfigFilePolicy `yaml:"policies"`
  15. }
  16. type ConfigFilePolicy struct {
  17. Path string
  18. Name string
  19. }
  20. func LoadPolicies(configFilePathDir string) (*KubernetesPolicies, error) {
  21. // read and parse the config file
  22. fileBytes, err := ioutil.ReadFile(filepath.Join(configFilePathDir, "config.yaml"))
  23. if err != nil {
  24. return nil, err
  25. }
  26. configFile := make(map[string]ConfigFilePolicyCollection)
  27. err = yaml.Unmarshal(fileBytes, &configFile)
  28. if err != nil {
  29. return nil, err
  30. }
  31. // load each map entry
  32. policies := make(map[string]KubernetesOPAQueryCollection)
  33. for name, cfPolicyCollection := range configFile {
  34. queries := make([]rego.PreparedEvalQuery, 0)
  35. for _, cfPolicy := range cfPolicyCollection.Policies {
  36. fileBytes, err := ioutil.ReadFile(filepath.Join(configFilePathDir, cfPolicy.Path))
  37. if err != nil {
  38. return nil, err
  39. }
  40. query, err := rego.New(
  41. rego.Query(fmt.Sprintf("data.%s", cfPolicy.Name)),
  42. rego.Module(cfPolicy.Name, string(fileBytes)),
  43. ).PrepareForEval(context.Background())
  44. if err != nil {
  45. // Handle error.
  46. return nil, err
  47. }
  48. queries = append(queries, query)
  49. }
  50. policies[name] = KubernetesOPAQueryCollection{
  51. Kind: KubernetesBuiltInKind(cfPolicyCollection.Kind),
  52. Queries: queries,
  53. Match: cfPolicyCollection.Match,
  54. }
  55. }
  56. return &KubernetesPolicies{
  57. Policies: policies,
  58. }, nil
  59. }