1
0
Fork 0
mirror of https://github.com/kyverno/kyverno.git synced 2025-03-07 00:17:13 +00:00
kyverno/pkg/policy/report.go

68 lines
2.1 KiB
Go
Raw Normal View History

2019-08-13 13:15:04 -07:00
package policy
import (
"fmt"
2020-03-17 16:25:34 -07:00
"github.com/go-logr/logr"
"github.com/kyverno/kyverno/pkg/engine/response"
"github.com/kyverno/kyverno/pkg/event"
"github.com/kyverno/kyverno/pkg/policyviolation"
2019-08-13 13:15:04 -07:00
)
// for each policy-resource response
// - has violation -> report
// - no violation -> cleanup policy violations
func (pc *PolicyController) cleanupAndReport(engineResponses []response.EngineResponse) {
2020-03-17 11:05:20 -07:00
logger := pc.log
2019-11-12 14:41:29 -08:00
// generate Events
2020-03-17 16:25:34 -07:00
eventInfos := generateEvents(pc.log, engineResponses)
2019-11-12 14:41:29 -08:00
pc.eventGen.Add(eventInfos...)
// create policy violation
2020-03-17 11:05:20 -07:00
pvInfos := policyviolation.GeneratePVsFromEngineResponse(engineResponses, logger)
2020-02-26 00:26:09 +05:30
for i := range pvInfos {
pvInfos[i].FromSync = true
}
2019-11-12 14:41:29 -08:00
pc.pvGenerator.Add(pvInfos...)
// cleanup existing violations if any
// if there is any error in clean up, we dont re-queue the resource
// it will be re-tried in the next controller cache resync
pc.cleanUp(engineResponses)
}
2020-03-17 16:25:34 -07:00
func generateEvents(log logr.Logger, ers []response.EngineResponse) []event.Info {
2019-11-12 14:41:29 -08:00
var eventInfos []event.Info
for _, er := range ers {
if er.IsSuccessful() {
2019-11-12 14:41:29 -08:00
continue
}
2020-03-17 16:25:34 -07:00
eventInfos = append(eventInfos, generateEventsPerEr(log, er)...)
2019-11-12 14:41:29 -08:00
}
return eventInfos
}
2019-08-13 13:15:04 -07:00
2020-03-17 16:25:34 -07:00
func generateEventsPerEr(log logr.Logger, er response.EngineResponse) []event.Info {
2019-11-12 14:41:29 -08:00
var eventInfos []event.Info
logger := log.WithValues("policy", er.PolicyResponse.Policy, "kind", er.PolicyResponse.Resource.Kind, "namespace", er.PolicyResponse.Resource.Namespace, "name", er.PolicyResponse.Resource.Name)
2020-03-17 16:25:34 -07:00
logger.V(4).Info("reporting results for policy")
2019-11-12 14:41:29 -08:00
for _, rule := range er.PolicyResponse.Rules {
if rule.Success {
continue
}
2019-08-13 13:15:04 -07:00
// generate event on resource for each failed rule
2020-03-17 16:25:34 -07:00
logger.V(4).Info("generating event on resource")
2019-08-26 13:34:42 -07:00
e := event.Info{}
2019-11-12 14:41:29 -08:00
e.Kind = er.PolicyResponse.Resource.Kind
e.Namespace = er.PolicyResponse.Resource.Namespace
e.Name = er.PolicyResponse.Resource.Name
2019-11-18 17:13:48 -08:00
e.Reason = event.PolicyViolation.String()
e.Source = event.PolicyController
e.Message = fmt.Sprintf("policy '%s' (%s) rule '%s' failed. %v", er.PolicyResponse.Policy, rule.Type, rule.Name, rule.Message)
2019-11-12 14:41:29 -08:00
eventInfos = append(eventInfos, e)
}
return eventInfos
2019-08-13 13:15:04 -07:00
}