Skip to content

Commit 9e4f8d6

Browse files
pbarkerk8s-ci-robot
authored andcommitted
Audit test utils fix (kubernetes#74276)
* changes audit e2e event version scheme; adds internal audit to common audit scheme; removes unneeded comments * add more detail to audit missing events in e2e/integration tests * adds version priority to audit scheme; updates comment
1 parent 9e53b85 commit 9e4f8d6

File tree

5 files changed

+53
-19
lines changed

5 files changed

+53
-19
lines changed

staging/src/k8s.io/apiserver/pkg/audit/scheme.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"k8s.io/apimachinery/pkg/runtime/schema"
2424
"k8s.io/apimachinery/pkg/runtime/serializer"
2525
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
26+
auditinternal "k8s.io/apiserver/pkg/apis/audit"
2627
"k8s.io/apiserver/pkg/apis/audit/v1"
2728
"k8s.io/apiserver/pkg/apis/audit/v1alpha1"
2829
"k8s.io/apiserver/pkg/apis/audit/v1beta1"
@@ -36,4 +37,6 @@ func init() {
3637
utilruntime.Must(v1.AddToScheme(Scheme))
3738
utilruntime.Must(v1alpha1.AddToScheme(Scheme))
3839
utilruntime.Must(v1beta1.AddToScheme(Scheme))
40+
utilruntime.Must(auditinternal.AddToScheme(Scheme))
41+
utilruntime.Must(Scheme.SetVersionPriority(v1.SchemeGroupVersion, v1beta1.SchemeGroupVersion, v1alpha1.SchemeGroupVersion))
3942
}

test/e2e/auth/BUILD

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ go_library(
4343
"//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library",
4444
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
4545
"//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library",
46-
"//staging/src/k8s.io/apiserver/pkg/apis/audit/v1beta1:go_default_library",
46+
"//staging/src/k8s.io/apiserver/pkg/apis/audit/v1:go_default_library",
4747
"//staging/src/k8s.io/apiserver/pkg/authentication/serviceaccount:go_default_library",
4848
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
4949
"//staging/src/k8s.io/client-go/kubernetes/typed/certificates/v1beta1:go_default_library",

test/e2e/auth/audit.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import (
3131
"k8s.io/apimachinery/pkg/types"
3232
"k8s.io/apimachinery/pkg/util/wait"
3333
auditinternal "k8s.io/apiserver/pkg/apis/audit"
34-
"k8s.io/apiserver/pkg/apis/audit/v1beta1"
34+
"k8s.io/apiserver/pkg/apis/audit/v1"
3535
clientset "k8s.io/client-go/kubernetes"
3636
restclient "k8s.io/client-go/rest"
3737
"k8s.io/kubernetes/test/e2e/framework"
@@ -734,13 +734,13 @@ func expectEvents(f *framework.Framework, expectedEvents []utils.AuditEvent) {
734734
return false, err
735735
}
736736
defer stream.Close()
737-
missing, err := utils.CheckAuditLines(stream, expectedEvents, v1beta1.SchemeGroupVersion)
737+
missingReport, err := utils.CheckAuditLines(stream, expectedEvents, v1.SchemeGroupVersion)
738738
if err != nil {
739739
framework.Logf("Failed to observe audit events: %v", err)
740-
} else if len(missing) > 0 {
741-
framework.Logf("Events %#v not found!", missing)
740+
} else if len(missingReport.MissingEvents) > 0 {
741+
framework.Logf(missingReport.String())
742742
}
743-
return len(missing) == 0, nil
743+
return len(missingReport.MissingEvents) == 0, nil
744744
})
745745
framework.ExpectNoError(err, "after %v failed to observe audit events", pollingTimeout)
746746
}

test/integration/master/audit_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -214,12 +214,12 @@ func testAudit(t *testing.T, version string) {
214214
t.Fatalf("Unexpected error: %v", err)
215215
}
216216
defer stream.Close()
217-
missing, err := utils.CheckAuditLines(stream, expectedEvents, versions[version])
217+
missingReport, err := utils.CheckAuditLines(stream, expectedEvents, versions[version])
218218
if err != nil {
219219
t.Fatalf("Unexpected error: %v", err)
220220
}
221-
if len(missing) > 0 {
222-
t.Errorf("Failed to match all expected events, events %#v not found!", missing)
221+
if len(missingReport.MissingEvents) > 0 {
222+
t.Errorf(missingReport.String())
223223
}
224224
}
225225

test/utils/audit.go

Lines changed: 41 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -48,23 +48,54 @@ type AuditEvent struct {
4848
AuthorizeDecision string
4949
}
5050

51+
// MissingEventsReport provides an analysis if any events are missing
52+
type MissingEventsReport struct {
53+
FirstEventChecked *auditinternal.Event
54+
LastEventChecked *auditinternal.Event
55+
NumEventsChecked int
56+
MissingEvents []AuditEvent
57+
}
58+
59+
// String returns a human readable string representation of the report
60+
func (m *MissingEventsReport) String() string {
61+
return fmt.Sprintf(`missing %d events
62+
63+
- first event checked: %#v
64+
65+
- last event checked: %#v
66+
67+
- number of events checked: %d
68+
69+
- missing events: %#v`, len(m.MissingEvents), m.FirstEventChecked, m.LastEventChecked, m.NumEventsChecked, m.MissingEvents)
70+
}
71+
5172
// CheckAuditLines searches the audit log for the expected audit lines.
52-
// if includeID is true the event ids will also be verified
53-
func CheckAuditLines(stream io.Reader, expected []AuditEvent, version schema.GroupVersion) (missing []AuditEvent, err error) {
73+
func CheckAuditLines(stream io.Reader, expected []AuditEvent, version schema.GroupVersion) (missingReport *MissingEventsReport, err error) {
5474
expectations := buildEventExpectations(expected)
5575

5676
scanner := bufio.NewScanner(stream)
57-
for scanner.Scan() {
77+
78+
missingReport = &MissingEventsReport{
79+
MissingEvents: expected,
80+
}
81+
82+
var i int
83+
for i = 0; scanner.Scan(); i++ {
5884
line := scanner.Text()
85+
5986
e := &auditinternal.Event{}
6087
decoder := audit.Codecs.UniversalDecoder(version)
6188
if err := runtime.DecodeInto(decoder, []byte(line), e); err != nil {
62-
return expected, fmt.Errorf("failed decoding buf: %s, apiVersion: %s", line, version)
89+
return missingReport, fmt.Errorf("failed decoding buf: %s, apiVersion: %s", line, version)
6390
}
91+
if i == 0 {
92+
missingReport.FirstEventChecked = e
93+
}
94+
missingReport.LastEventChecked = e
6495

6596
event, err := testEventFromInternal(e)
6697
if err != nil {
67-
return expected, err
98+
return missingReport, err
6899
}
69100

70101
// If the event was expected, mark it as found.
@@ -73,15 +104,16 @@ func CheckAuditLines(stream io.Reader, expected []AuditEvent, version schema.Gro
73104
}
74105
}
75106
if err := scanner.Err(); err != nil {
76-
return expected, err
107+
return missingReport, err
77108
}
78109

79-
missing = findMissing(expectations)
80-
return missing, nil
110+
missingEvents := findMissing(expectations)
111+
missingReport.MissingEvents = missingEvents
112+
missingReport.NumEventsChecked = i
113+
return missingReport, nil
81114
}
82115

83116
// CheckAuditList searches an audit event list for the expected audit events.
84-
// if includeID is true the event ids will also be verified
85117
func CheckAuditList(el auditinternal.EventList, expected []AuditEvent) (missing []AuditEvent, err error) {
86118
expectations := buildEventExpectations(expected)
87119

@@ -133,7 +165,6 @@ func buildEventExpectations(expected []AuditEvent) map[AuditEvent]bool {
133165
}
134166

135167
// testEventFromInternal takes an internal audit event and returns a test event
136-
// if includeID is true the event id will be included
137168
func testEventFromInternal(e *auditinternal.Event) (AuditEvent, error) {
138169
event := AuditEvent{
139170
Level: e.Level,

0 commit comments

Comments
 (0)