| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- package opa
- import (
- "context"
- "fmt"
- "io/ioutil"
- "path/filepath"
- "github.com/open-policy-agent/opa/rego"
- "sigs.k8s.io/yaml"
- )
- type ConfigFile map[string]ConfigFilePolicyCollection
- type ConfigFilePolicyCollection struct {
- Kind string `json:"kind"`
- Match MatchParameters `json:"match"`
- MustExist bool `json:"mustExist"`
- OverrideSeverity string `json:"override_severity"`
- Policies []ConfigFilePolicy `json:"policies"`
- }
- type ConfigFilePolicy struct {
- Path string
- Name string
- }
- func LoadPolicies(configFilePathDir string) (*KubernetesPolicies, error) {
- // read and parse the config file
- fileBytes, err := ioutil.ReadFile(filepath.Join(configFilePathDir, "config.yaml"))
- if err != nil {
- return nil, err
- }
- configFile := make(map[string]ConfigFilePolicyCollection)
- err = yaml.Unmarshal(fileBytes, &configFile)
- if err != nil {
- return nil, err
- }
- // load each map entry
- policies := make(map[string]KubernetesOPAQueryCollection)
- for name, cfPolicyCollection := range configFile {
- queries := make([]rego.PreparedEvalQuery, 0)
- for _, cfPolicy := range cfPolicyCollection.Policies {
- fileBytes, err := ioutil.ReadFile(filepath.Join(configFilePathDir, cfPolicy.Path))
- if err != nil {
- return nil, err
- }
- query, err := rego.New(
- rego.Query(fmt.Sprintf("data.%s", cfPolicy.Name)),
- rego.Module(cfPolicy.Name, string(fileBytes)),
- ).PrepareForEval(context.Background())
- if err != nil {
- // Handle error.
- return nil, err
- }
- queries = append(queries, query)
- }
- policies[name] = KubernetesOPAQueryCollection{
- Kind: KubernetesBuiltInKind(cfPolicyCollection.Kind),
- Queries: queries,
- Match: cfPolicyCollection.Match,
- OverrideSeverity: cfPolicyCollection.OverrideSeverity,
- MustExist: cfPolicyCollection.MustExist,
- }
- }
- return &KubernetesPolicies{
- Policies: policies,
- }, nil
- }
|