2019-08-13 13:15:04 -07:00
package policy
import (
"fmt"
2019-08-14 10:01:47 -07:00
"github.com/golang/glog"
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
eventInfos := generateEvents ( engineResponses )
pc . eventGen . Add ( eventInfos ... )
// create policy violation
2020-03-17 11:05:20 -07:00
pvInfos := policyviolation . GeneratePVsFromEngineResponse ( engineResponses , logger )
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 )
}
2019-12-30 17:08:50 -08:00
func generateEvents ( ers [ ] response . EngineResponse ) [ ] event . Info {
2019-11-12 14:41:29 -08:00
var eventInfos [ ] event . Info
for _ , er := range ers {
if er . IsSuccesful ( ) {
continue
}
eventInfos = append ( eventInfos , generateEventsPerEr ( er ) ... )
}
return eventInfos
}
2019-08-13 13:15:04 -07:00
2019-12-30 17:08:50 -08:00
func generateEventsPerEr ( er response . EngineResponse ) [ ] event . Info {
2019-11-12 14:41:29 -08:00
var eventInfos [ ] event . Info
glog . V ( 4 ) . Infof ( "reporting results for policy '%s' application on resource '%s/%s/%s'" , er . PolicyResponse . Policy , er . PolicyResponse . Resource . Kind , er . PolicyResponse . Resource . Namespace , er . PolicyResponse . Resource . Name )
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
2019-11-12 14:41:29 -08:00
glog . V ( 4 ) . Infof ( "generation event on resource '%s/%s/%s' for policy '%s'" , er . PolicyResponse . Resource . Kind , er . PolicyResponse . Resource . Namespace , er . PolicyResponse . Resource . Name , er . PolicyResponse . Policy )
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 )
}
if er . IsSuccesful ( ) {
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
2019-11-12 14:41:29 -08:00
glog . V ( 4 ) . Infof ( "generation event on policy '%s'" , er . PolicyResponse . 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
}