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"
2019-12-30 17:08:50 -08:00
"github.com/nirmata/kyverno/pkg/engine/response"
2019-08-13 13:15:04 -07:00
"github.com/nirmata/kyverno/pkg/event"
2019-11-18 17:13:48 -08:00
"github.com/nirmata/kyverno/pkg/policyviolation"
2019-08-13 13:15:04 -07:00
)
2019-11-08 20:45:26 -08:00
// for each policy-resource response
// - has violation -> report
2020-01-06 17:07:11 -08:00
// - no violation -> cleanup policy violations
2019-12-30 17:08:50 -08:00
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 {
2020-06-30 11:53:27 -07:00
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 {
logger := log . WithValues ( "policy" , er . PolicyResponse . Policy , "kind" , er . PolicyResponse . Resource . Kind , "namespace" , er . PolicyResponse . Resource . Namespace , "name" , er . PolicyResponse . Resource . Name )
2019-11-12 14:41:29 -08:00
var eventInfos [ ] event . Info
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 ( )
2019-12-26 11:50:41 -08:00
e . Source = event . PolicyController
2019-11-18 17:13:48 -08:00
e . Message = fmt . Sprintf ( "policy '%s' (%s) rule '%s' not satisfied. %v" , er . PolicyResponse . Policy , rule . Type , rule . Name , rule . Message )
2019-11-12 14:41:29 -08:00
eventInfos = append ( eventInfos , e )
}
2020-06-30 11:53:27 -07:00
if er . IsSuccessful ( ) {
2019-11-12 14:41:29 -08:00
return eventInfos
2019-08-13 13:15:04 -07:00
}
2019-11-12 14:41:29 -08:00
2019-08-13 13:15:04 -07:00
// generate a event on policy for all failed rules
2020-03-17 16:25:34 -07:00
logger . V ( 4 ) . Info ( "generating event on policy" )
2019-08-26 13:34:42 -07:00
e := event . Info { }
2019-09-12 15:04:35 -07:00
e . Kind = "ClusterPolicy"
2019-08-13 13:15:04 -07:00
e . Namespace = ""
2019-11-12 14:41:29 -08:00
e . Name = er . PolicyResponse . Policy
2019-11-18 17:13:48 -08:00
e . Reason = event . PolicyViolation . String ( )
2019-12-26 11:50:41 -08:00
e . Source = event . PolicyController
2019-11-18 17:13:48 -08:00
e . Message = fmt . Sprintf ( "policy '%s' rules '%v' not satisfied on resource '%s/%s/%s'" , er . PolicyResponse . Policy , er . GetFailedRules ( ) , er . PolicyResponse . Resource . Kind , er . PolicyResponse . Resource . Namespace , er . PolicyResponse . Resource . Name )
2019-11-12 14:41:29 -08:00
eventInfos = append ( eventInfos , e )
return eventInfos
2019-08-13 13:15:04 -07:00
}