2020-03-11 18:14:23 -07:00
|
|
|
package policy
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
|
2020-10-07 11:12:31 -07:00
|
|
|
kyverno "github.com/kyverno/kyverno/pkg/api/kyverno/v1"
|
|
|
|
dclient "github.com/kyverno/kyverno/pkg/dclient"
|
|
|
|
"github.com/kyverno/kyverno/pkg/policy/generate"
|
|
|
|
"github.com/kyverno/kyverno/pkg/policy/mutate"
|
|
|
|
"github.com/kyverno/kyverno/pkg/policy/validate"
|
2020-03-17 16:25:34 -07:00
|
|
|
"sigs.k8s.io/controller-runtime/pkg/log"
|
2020-03-11 18:14:23 -07:00
|
|
|
)
|
|
|
|
|
|
|
|
//Validation provides methods to validate a rule
|
|
|
|
type Validation interface {
|
|
|
|
Validate() (string, error)
|
|
|
|
}
|
|
|
|
|
|
|
|
//validateAction performs validation on the rule actions
|
|
|
|
// - Mutate
|
|
|
|
// - Validation
|
|
|
|
// - Generate
|
2020-03-17 17:23:18 -07:00
|
|
|
func validateActions(idx int, rule kyverno.Rule, client *dclient.Client, mock bool) error {
|
2020-03-11 18:14:23 -07:00
|
|
|
var checker Validation
|
|
|
|
|
|
|
|
// Mutate
|
|
|
|
if rule.HasMutate() {
|
|
|
|
checker = mutate.NewMutateFactory(rule.Mutation)
|
|
|
|
if path, err := checker.Validate(); err != nil {
|
|
|
|
return fmt.Errorf("path: spec.rules[%d].mutate.%s.: %v", idx, path, err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Validate
|
|
|
|
if rule.HasValidate() {
|
|
|
|
checker = validate.NewValidateFactory(rule.Validation)
|
|
|
|
if path, err := checker.Validate(); err != nil {
|
|
|
|
return fmt.Errorf("path: spec.rules[%d].validate.%s.: %v", idx, path, err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Generate
|
|
|
|
if rule.HasGenerate() {
|
2020-03-17 17:23:18 -07:00
|
|
|
//TODO: this check is there to support offline validations
|
|
|
|
// generate uses selfSubjectReviews to verify actions
|
|
|
|
// this need to modified to use different implementation for online and offline mode
|
|
|
|
if mock {
|
|
|
|
checker = generate.NewFakeGenerate(rule.Generation)
|
|
|
|
if path, err := checker.Validate(); err != nil {
|
|
|
|
return fmt.Errorf("path: spec.rules[%d].generate.%s.: %v", idx, path, err)
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
checker = generate.NewGenerateFactory(client, rule.Generation, log.Log)
|
|
|
|
if path, err := checker.Validate(); err != nil {
|
|
|
|
return fmt.Errorf("path: spec.rules[%d].generate.%s.: %v", idx, path, err)
|
|
|
|
}
|
2020-03-11 18:14:23 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|