loader.go 1.8 KB

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