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-08-26 13:34:42 -07:00
"github.com/nirmata/kyverno/pkg/engine"
2019-08-13 13:15:04 -07:00
"github.com/nirmata/kyverno/pkg/event"
"github.com/nirmata/kyverno/pkg/policyviolation"
)
2019-08-26 13:34:42 -07:00
func ( pc * PolicyController ) report ( engineResponses [ ] engine . EngineResponseNew ) {
2019-08-13 13:15:04 -07:00
// generate events
// generate policy violations
2019-08-26 13:34:42 -07:00
for _ , policyInfo := range engineResponses {
2019-08-13 13:15:04 -07:00
// events
// success - policy applied on resource
// failure - policy/rule failed to apply on the resource
2019-08-14 10:01:47 -07:00
reportEvents ( policyInfo , pc . eventGen )
2019-08-13 13:15:04 -07:00
// policy violations
// failure - policy/rule failed to apply on the resource
}
// generate policy violation
2019-08-26 13:34:42 -07:00
policyviolation . CreatePV ( pc . pvLister , pc . kyvernoClient , engineResponses )
2019-08-13 13:15:04 -07:00
}
2019-08-14 10:01:47 -07:00
//reportEvents generates events for the failed resources
2019-08-26 13:34:42 -07:00
func reportEvents ( engineResponse engine . EngineResponseNew , eventGen event . Interface ) {
if engineResponse . IsSuccesful ( ) {
2019-08-13 13:15:04 -07:00
return
}
2019-08-26 13:34:42 -07:00
glog . V ( 4 ) . Infof ( "reporting results for policy %s application on resource %s/%s/%s" , engineResponse . PolicyResponse . Policy , engineResponse . PolicyResponse . Resource . Kind , engineResponse . PolicyResponse . Resource . Namespace , engineResponse . PolicyResponse . Resource . Name )
for _ , rule := range engineResponse . PolicyResponse . Rules {
if rule . Success {
return
2019-08-13 13:15:04 -07:00
}
// generate event on resource for each failed rule
2019-08-26 13:34:42 -07:00
glog . V ( 4 ) . Infof ( "generation event on resource %s/%s/%s for policy %s" , engineResponse . PolicyResponse . Resource . Kind , engineResponse . PolicyResponse . Resource . Namespace , engineResponse . PolicyResponse . Resource . Name , engineResponse . PolicyResponse . Policy )
e := event . Info { }
e . Kind = engineResponse . PolicyResponse . Resource . Kind
e . Namespace = engineResponse . PolicyResponse . Resource . Namespace
e . Name = engineResponse . PolicyResponse . Policy
2019-08-13 13:15:04 -07:00
e . Reason = "Failure"
2019-08-26 13:34:42 -07:00
e . Message = fmt . Sprintf ( "policy %s (%s) rule %s failed to apply. %v" , engineResponse . PolicyResponse . Policy , rule . Type , rule . Name , rule . Message )
2019-08-13 13:15:04 -07:00
eventGen . Add ( e )
}
// generate a event on policy for all failed rules
2019-08-26 13:34:42 -07:00
glog . V ( 4 ) . Infof ( "generation event on policy %s" , engineResponse . PolicyResponse . Policy )
e := event . Info { }
2019-08-13 13:15:04 -07:00
e . Kind = "Policy"
e . Namespace = ""
2019-08-26 13:34:42 -07:00
e . Name = engineResponse . PolicyResponse . Policy
2019-08-13 13:15:04 -07:00
e . Reason = "Failure"
2019-08-26 13:34:42 -07:00
e . Message = fmt . Sprintf ( "failed to apply rules %v on resource %s/%s/%s" , engineResponse . GetFailedRules ( ) , engineResponse . PolicyResponse . Resource . Kind , engineResponse . PolicyResponse . Resource . Namespace , engineResponse . PolicyResponse . Resource . Name )
2019-08-13 13:15:04 -07:00
eventGen . Add ( e )
2019-08-26 13:34:42 -07:00
2019-08-13 13:15:04 -07:00
}