1
0
Fork 0
mirror of https://github.com/kyverno/kyverno.git synced 2025-03-06 16:06:56 +00:00
kyverno/pkg/webhooks/report.go

127 lines
3.3 KiB
Go
Raw Normal View History

2019-07-15 16:07:56 -07:00
package webhooks
import (
"strings"
2020-03-17 11:05:20 -07:00
"github.com/go-logr/logr"
2019-11-13 13:41:08 -08:00
kyverno "github.com/nirmata/kyverno/pkg/api/kyverno/v1"
"github.com/nirmata/kyverno/pkg/engine/response"
2019-08-26 13:34:42 -07:00
2019-07-15 16:07:56 -07:00
"github.com/nirmata/kyverno/pkg/event"
)
2019-08-26 13:34:42 -07:00
//generateEvents generates event info for the engine responses
2020-03-17 11:05:20 -07:00
func generateEvents(engineResponses []response.EngineResponse, blocked, onUpdate bool, log logr.Logger) []event.Info {
2019-08-26 13:34:42 -07:00
var events []event.Info
2020-02-19 19:24:34 -08:00
// Scenario 1
// - Admission-Response is SUCCESS && CREATE
// - All policies were succesfully
// - report event on resources
if isResponseSuccesful(engineResponses) {
if !onUpdate {
// we only report events on CREATE requests
return events
2019-07-15 16:07:56 -07:00
}
2019-08-26 13:34:42 -07:00
for _, er := range engineResponses {
successRules := er.GetSuccessRules()
successRulesStr := strings.Join(successRules, ";")
// event on resource
e := event.NewEvent(
2020-03-17 11:05:20 -07:00
log,
2019-08-26 13:34:42 -07:00
er.PolicyResponse.Resource.Kind,
er.PolicyResponse.Resource.APIVersion,
er.PolicyResponse.Resource.Namespace,
er.PolicyResponse.Resource.Name,
event.PolicyApplied.String(),
event.AdmissionController,
2019-08-26 13:34:42 -07:00
event.SRulesApply,
successRulesStr,
er.PolicyResponse.Policy,
)
events = append(events, e)
2019-07-15 16:07:56 -07:00
}
2020-02-19 19:24:34 -08:00
return events
}
// Scneario 2
// - Admission-Response is BLOCKED
// - report event of policy is in enforce mode and failed to apply
if blocked {
for _, er := range engineResponses {
if er.IsSuccesful() {
// do not create event on polices that were succesfuly
continue
}
if er.PolicyResponse.ValidationFailureAction != Enforce {
// do not create event on "audit" policy
continue
}
// Rules that failed
failedRules := er.GetFailedRules()
filedRulesStr := strings.Join(failedRules, ";")
// Event on Policy
e := event.NewEvent(
2020-03-17 11:05:20 -07:00
log,
2020-02-19 19:24:34 -08:00
"ClusterPolicy",
kyverno.SchemeGroupVersion.String(),
"",
er.PolicyResponse.Policy,
event.RequestBlocked.String(),
event.AdmissionController,
event.FPolicyBlockResourceUpdate,
er.PolicyResponse.Resource.GetKey(),
filedRulesStr,
)
events = append(events, e)
}
return events
}
// Scenario 3
// - Admission-Response is SUCCESS
// - Some/All policies failed (policy violations generated)
// - report event on policy that failed
// - report event on resource that failed
2019-08-26 13:34:42 -07:00
2020-02-19 19:24:34 -08:00
for _, er := range engineResponses {
if er.IsSuccesful() {
// do not create event on polices that were succesfuly
continue
}
// Rules that failed
failedRules := er.GetFailedRules()
filedRulesStr := strings.Join(failedRules, ";")
// Event on the policy
e := event.NewEvent(
2020-03-17 11:05:20 -07:00
log,
2020-02-19 19:24:34 -08:00
"ClusterPolicy",
kyverno.SchemeGroupVersion.String(),
"",
er.PolicyResponse.Policy,
event.PolicyFailed.String(),
event.AdmissionController,
event.FPolicyApplyFailed,
filedRulesStr,
er.PolicyResponse.Resource.GetKey(),
)
2020-02-20 10:01:29 -08:00
events = append(events, e)
2020-02-19 19:24:34 -08:00
// Event on the resource
// event on resource
e = event.NewEvent(
2020-03-17 11:05:20 -07:00
log,
2020-02-19 19:24:34 -08:00
er.PolicyResponse.Resource.Kind,
er.PolicyResponse.Resource.APIVersion,
er.PolicyResponse.Resource.Namespace,
er.PolicyResponse.Resource.Name,
event.PolicyViolation.String(),
event.AdmissionController,
event.FResourcePolicyFailed,
filedRulesStr,
er.PolicyResponse.Policy,
)
events = append(events, e)
2019-07-15 16:07:56 -07:00
}
2020-02-19 19:24:34 -08:00
2019-08-26 13:34:42 -07:00
return events
}