mirror of
https://github.com/kyverno/kyverno.git
synced 2025-03-09 17:37:12 +00:00
247 lines
6.6 KiB
Go
247 lines
6.6 KiB
Go
package policyStatus
|
|
|
|
import (
|
|
"encoding/json"
|
|
"reflect"
|
|
"testing"
|
|
"time"
|
|
|
|
v1 "github.com/nirmata/kyverno/pkg/api/kyverno/v1"
|
|
|
|
"github.com/nirmata/kyverno/pkg/engine/response"
|
|
)
|
|
|
|
func Test_Stats(t *testing.T) {
|
|
testCase := struct {
|
|
mutateStats []response.EngineResponse
|
|
validateStats []response.EngineResponse
|
|
generateStats []response.EngineResponse
|
|
violationCountStats []struct {
|
|
policyName string
|
|
violatedRules []v1.ViolatedRule
|
|
}
|
|
generatedCountStats []v1.GenerateRequest
|
|
expectedOutput []byte
|
|
}{
|
|
expectedOutput: []byte(`{"policy1":{"averageExecutionTime":"1.482µs","violationCount":1,"rulesFailedCount":3,"rulesAppliedCount":3,"resourcesBlockedCount":1,"resourcesMutatedCount":1,"resourcesGeneratedCount":1,"ruleStatus":[{"ruleName":"rule1","averageExecutionTime":"243ns","appliedCount":1,"resourcesMutatedCount":1},{"ruleName":"rule2","averageExecutionTime":"251ns","failedCount":1},{"ruleName":"rule3","averageExecutionTime":"243ns","appliedCount":1},{"ruleName":"rule4","averageExecutionTime":"251ns","violationCount":1,"failedCount":1,"resourcesBlockedCount":1},{"ruleName":"rule5","averageExecutionTime":"243ns","appliedCount":1},{"ruleName":"rule6","averageExecutionTime":"251ns","failedCount":1}]},"policy2":{"averageExecutionTime":"1.299µs","violationCount":1,"rulesFailedCount":3,"rulesAppliedCount":3,"resourcesMutatedCount":1,"resourcesGeneratedCount":1,"ruleStatus":[{"ruleName":"rule1","averageExecutionTime":"222ns","appliedCount":1,"resourcesMutatedCount":1},{"ruleName":"rule2","averageExecutionTime":"211ns","failedCount":1},{"ruleName":"rule3","averageExecutionTime":"222ns","appliedCount":1},{"ruleName":"rule4","averageExecutionTime":"211ns","violationCount":1,"failedCount":1},{"ruleName":"rule5","averageExecutionTime":"222ns","appliedCount":1},{"ruleName":"rule6","averageExecutionTime":"211ns","failedCount":1}]}}`),
|
|
generatedCountStats: []v1.GenerateRequest{
|
|
{
|
|
Spec: v1.GenerateRequestSpec{
|
|
Policy: "policy1",
|
|
},
|
|
Status: v1.GenerateRequestStatus{
|
|
GeneratedResources: make([]v1.ResourceSpec, 1),
|
|
},
|
|
},
|
|
{
|
|
Spec: v1.GenerateRequestSpec{
|
|
Policy: "policy2",
|
|
},
|
|
Status: v1.GenerateRequestStatus{
|
|
GeneratedResources: make([]v1.ResourceSpec, 1),
|
|
},
|
|
},
|
|
},
|
|
violationCountStats: []struct {
|
|
policyName string
|
|
violatedRules []v1.ViolatedRule
|
|
}{
|
|
{
|
|
policyName: "policy1",
|
|
violatedRules: []v1.ViolatedRule{
|
|
{
|
|
Name: "rule4",
|
|
},
|
|
},
|
|
},
|
|
{
|
|
policyName: "policy2",
|
|
violatedRules: []v1.ViolatedRule{
|
|
{
|
|
Name: "rule4",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
mutateStats: []response.EngineResponse{
|
|
{
|
|
PolicyResponse: response.PolicyResponse{
|
|
Policy: "policy1",
|
|
Rules: []response.RuleResponse{
|
|
{
|
|
Name: "rule1",
|
|
Success: true,
|
|
RuleStats: response.RuleStats{
|
|
ProcessingTime: time.Nanosecond * 243,
|
|
},
|
|
},
|
|
{
|
|
Name: "rule2",
|
|
Success: false,
|
|
RuleStats: response.RuleStats{
|
|
ProcessingTime: time.Nanosecond * 251,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
PolicyResponse: response.PolicyResponse{
|
|
Policy: "policy2",
|
|
Rules: []response.RuleResponse{
|
|
{
|
|
Name: "rule1",
|
|
Success: true,
|
|
RuleStats: response.RuleStats{
|
|
ProcessingTime: time.Nanosecond * 222,
|
|
},
|
|
},
|
|
{
|
|
Name: "rule2",
|
|
Success: false,
|
|
RuleStats: response.RuleStats{
|
|
ProcessingTime: time.Nanosecond * 211,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
validateStats: []response.EngineResponse{
|
|
{
|
|
PolicyResponse: response.PolicyResponse{
|
|
Policy: "policy1",
|
|
ValidationFailureAction: "enforce",
|
|
Rules: []response.RuleResponse{
|
|
{
|
|
Name: "rule3",
|
|
Success: true,
|
|
RuleStats: response.RuleStats{
|
|
ProcessingTime: time.Nanosecond * 243,
|
|
},
|
|
},
|
|
{
|
|
Name: "rule4",
|
|
Success: false,
|
|
RuleStats: response.RuleStats{
|
|
ProcessingTime: time.Nanosecond * 251,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
PolicyResponse: response.PolicyResponse{
|
|
Policy: "policy2",
|
|
Rules: []response.RuleResponse{
|
|
{
|
|
Name: "rule3",
|
|
Success: true,
|
|
RuleStats: response.RuleStats{
|
|
ProcessingTime: time.Nanosecond * 222,
|
|
},
|
|
},
|
|
{
|
|
Name: "rule4",
|
|
Success: false,
|
|
RuleStats: response.RuleStats{
|
|
ProcessingTime: time.Nanosecond * 211,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
generateStats: []response.EngineResponse{
|
|
{
|
|
PolicyResponse: response.PolicyResponse{
|
|
Policy: "policy1",
|
|
Rules: []response.RuleResponse{
|
|
{
|
|
Name: "rule5",
|
|
Success: true,
|
|
RuleStats: response.RuleStats{
|
|
ProcessingTime: time.Nanosecond * 243,
|
|
},
|
|
},
|
|
{
|
|
Name: "rule6",
|
|
Success: false,
|
|
RuleStats: response.RuleStats{
|
|
ProcessingTime: time.Nanosecond * 251,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
PolicyResponse: response.PolicyResponse{
|
|
Policy: "policy2",
|
|
Rules: []response.RuleResponse{
|
|
{
|
|
Name: "rule5",
|
|
Success: true,
|
|
RuleStats: response.RuleStats{
|
|
ProcessingTime: time.Nanosecond * 222,
|
|
},
|
|
},
|
|
{
|
|
Name: "rule6",
|
|
Success: false,
|
|
RuleStats: response.RuleStats{
|
|
ProcessingTime: time.Nanosecond * 211,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
s := NewSync(nil, nil, nil)
|
|
for _, mutateStat := range testCase.mutateStats {
|
|
receiver := &mutateStats{
|
|
s: s,
|
|
resp: mutateStat,
|
|
}
|
|
receiver.updateStatus()
|
|
}
|
|
|
|
for _, validateStat := range testCase.validateStats {
|
|
receiver := &validateStats{
|
|
s: s,
|
|
resp: validateStat,
|
|
}
|
|
receiver.updateStatus()
|
|
}
|
|
|
|
for _, generateStat := range testCase.generateStats {
|
|
receiver := &generateStats{
|
|
s: s,
|
|
resp: generateStat,
|
|
}
|
|
receiver.updateStatus()
|
|
}
|
|
|
|
for _, generateCountStat := range testCase.generatedCountStats {
|
|
receiver := &generatedResourceCount{
|
|
sync: s,
|
|
generateRequest: generateCountStat,
|
|
}
|
|
receiver.updateStatus()
|
|
}
|
|
|
|
for _, violationCountStat := range testCase.violationCountStats {
|
|
receiver := &violationCount{
|
|
sync: s,
|
|
policyName: violationCountStat.policyName,
|
|
violatedRules: violationCountStat.violatedRules,
|
|
}
|
|
receiver.updateStatus()
|
|
}
|
|
|
|
output, _ := json.Marshal(s.cache.data)
|
|
if !reflect.DeepEqual(output, testCase.expectedOutput) {
|
|
t.Errorf("\n\nTestcase has failed\nExpected:\n%v\nGot:\n%v\n\n", string(testCase.expectedOutput), string(output))
|
|
}
|
|
}
|