pkg/safeguards/types/types.go (99 lines of code) (raw):
package types
import (
"bufio"
"bytes"
"fmt"
"io/fs"
"github.com/open-policy-agent/frameworks/constraint/pkg/core/templates"
api "github.com/open-policy-agent/gatekeeper/v3/apis"
"github.com/open-policy-agent/gatekeeper/v3/pkg/gator/reader"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime"
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
)
type FileCrawler struct {
Safeguards []Safeguard
ConstraintFS fs.FS
}
type Safeguard struct {
Name string
TemplatePath string
ConstraintPath string
}
type ManifestFile struct {
Name string
ManifestContent []byte
}
type ManifestResult struct {
Name string // the name of the manifest
ObjectViolations map[string][]string // a map of string object names to slice of string objectViolations
ViolationsCount int // a count of how many violations are associated with this manifest
}
// methods for retrieval of manifest, constraint templates, and constraints
func (fc FileCrawler) ReadManifests(manifestBytes []byte) ([]*unstructured.Unstructured, error) {
// Create a new bytes.Reader from the byte slice
bufReader := bufio.NewReader(bytes.NewReader(manifestBytes))
// Read the Kubernetes resources using the reader
manifests, err := reader.ReadK8sResources(bufReader)
if err != nil {
return nil, fmt.Errorf("reading manifests: %w", err)
}
return manifests, nil
}
func GetScheme() *runtime.Scheme {
var s = runtime.NewScheme()
_ = clientgoscheme.AddToScheme(s)
_ = api.AddToScheme(s)
return s
}
func (fc FileCrawler) ReadConstraintTemplates() ([]*templates.ConstraintTemplate, error) {
var constraintTemplates []*templates.ConstraintTemplate
for _, sg := range fc.Safeguards {
ct, err := reader.ReadTemplate(GetScheme(), fc.ConstraintFS, sg.TemplatePath)
if err != nil {
return nil, fmt.Errorf("reading template: %w", err)
}
constraintTemplates = append(constraintTemplates, ct)
}
return constraintTemplates, nil
}
func (fc FileCrawler) ReadConstraintTemplate(name string) (*templates.ConstraintTemplate, error) {
var constraintTemplate *templates.ConstraintTemplate
for _, sg := range fc.Safeguards {
if sg.Name == name {
ct, err := reader.ReadTemplate(GetScheme(), fc.ConstraintFS, sg.TemplatePath)
if err != nil {
return nil, fmt.Errorf("could not read template: %w", err)
}
constraintTemplate = ct
}
}
if constraintTemplate == nil {
return nil, fmt.Errorf("no constraint template exists with name: %s", name)
}
return constraintTemplate, nil
}
func (fc FileCrawler) ReadConstraints() ([]*unstructured.Unstructured, error) {
var constraints []*unstructured.Unstructured
for _, sg := range fc.Safeguards {
u, err := reader.ReadConstraint(fc.ConstraintFS, sg.ConstraintPath)
if err != nil {
return nil, fmt.Errorf("could not add constraint: %w", err)
}
constraints = append(constraints, u)
}
return constraints, nil
}
func (fc FileCrawler) ReadConstraint(name string) (*unstructured.Unstructured, error) {
var constraint *unstructured.Unstructured
for _, sg := range fc.Safeguards {
if sg.Name == name {
c, err := reader.ReadConstraint(fc.ConstraintFS, sg.ConstraintPath)
if err != nil {
return nil, fmt.Errorf("could not add constraint: %w", err)
}
constraint = c
}
}
if constraint == nil {
return nil, fmt.Errorf("no constraint exists with name: %s", name)
}
return constraint, nil
}