Skip to content

Commit 6901fc3

Browse files
author
Kubernetes Submit Queue
authored
Merge pull request kubernetes#52981 from CaoShuFeng/audit_v1beta2
Automatic merge from submit-queue (batch tested with PRs 53119, 53753, 53795, 52981). If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>. add RequestReceivedTimestamp and StageTimestamp to audit event fixes kubernetes#52160 **Release note**: ``` Add RequestReceivedTimestamp and StageTimestamp with micro seconds to audit events. ```
2 parents 1289fac + b69285a commit 6901fc3

22 files changed

+778
-211
lines changed

staging/src/k8s.io/apiserver/pkg/apis/audit/types.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -77,15 +77,10 @@ const (
7777
// Event captures all the information that can be included in an API audit log.
7878
type Event struct {
7979
metav1.TypeMeta
80-
// ObjectMeta is included for interoperability with API infrastructure.
81-
// +optional
82-
metav1.ObjectMeta
8380

8481
// AuditLevel at which event was generated
8582
Level Level
8683

87-
// Time the request reached the apiserver.
88-
Timestamp metav1.Time
8984
// Unique audit ID, generated for each request.
9085
AuditID types.UID
9186
// Stage of the request handling when this event instance was generated.
@@ -121,10 +116,15 @@ type Event struct {
121116
// +optional
122117
RequestObject *runtime.Unknown
123118
// API object returned in the response, in JSON. The ResponseObject is recorded after conversion
124-
// to the external type, and serialized as JSON. Omitted for non-resource requests. Only logged
119+
// to the external type, and serialized as JSON. Omitted for non-resource requests. Only logged
125120
// at Response Level.
126121
// +optional
127122
ResponseObject *runtime.Unknown
123+
124+
// Time the request reached the apiserver.
125+
RequestReceivedTimestamp metav1.MicroTime
126+
// Time the request reached current audit stage.
127+
StageTimestamp metav1.MicroTime
128128
}
129129

130130
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object

staging/src/k8s.io/apiserver/pkg/apis/audit/v1alpha1/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ go_test(
5454
srcs = ["conversion_test.go"],
5555
library = ":go_default_library",
5656
deps = [
57+
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
5758
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
5859
"//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
5960
"//vendor/k8s.io/apiserver/pkg/apis/audit:go_default_library",

staging/src/k8s.io/apiserver/pkg/apis/audit/v1alpha1/conversion.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package v1alpha1
1919
import (
2020
"strings"
2121

22+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2223
"k8s.io/apimachinery/pkg/conversion"
2324
"k8s.io/apiserver/pkg/apis/audit"
2425
)
@@ -52,3 +53,26 @@ func Convert_v1alpha1_ObjectReference_To_audit_ObjectReference(in *ObjectReferen
5253
}
5354
return nil
5455
}
56+
57+
func Convert_v1alpha1_Event_To_audit_Event(in *Event, out *audit.Event, s conversion.Scope) error {
58+
if err := autoConvert_v1alpha1_Event_To_audit_Event(in, out, s); err != nil {
59+
return err
60+
}
61+
if out.StageTimestamp.IsZero() {
62+
out.StageTimestamp = metav1.NewMicroTime(in.CreationTimestamp.Time)
63+
}
64+
if out.RequestReceivedTimestamp.IsZero() {
65+
out.RequestReceivedTimestamp = metav1.NewMicroTime(in.Timestamp.Time)
66+
}
67+
return nil
68+
}
69+
70+
func Convert_audit_Event_To_v1alpha1_Event(in *audit.Event, out *Event, s conversion.Scope) error {
71+
if err := autoConvert_audit_Event_To_v1alpha1_Event(in, out, s); err != nil {
72+
return err
73+
}
74+
out.CreationTimestamp = metav1.NewTime(in.StageTimestamp.Time)
75+
out.Timestamp = metav1.NewTime(in.RequestReceivedTimestamp.Time)
76+
return nil
77+
78+
}

staging/src/k8s.io/apiserver/pkg/apis/audit/v1alpha1/conversion_test.go

Lines changed: 114 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ package v1alpha1
1919
import (
2020
"reflect"
2121
"testing"
22+
"time"
2223

24+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2325
"k8s.io/apimachinery/pkg/runtime"
2426
"k8s.io/apimachinery/pkg/runtime/schema"
2527
auditinternal "k8s.io/apiserver/pkg/apis/audit"
@@ -36,7 +38,7 @@ func init() {
3638
RegisterConversions(scheme)
3739
}
3840

39-
func TestConversion(t *testing.T) {
41+
func TestConversionObjectReference(t *testing.T) {
4042
scheme.Log(t)
4143

4244
testcases := []struct {
@@ -92,3 +94,114 @@ func TestConversion(t *testing.T) {
9294
})
9395
}
9496
}
97+
98+
func TestConversionEventToInternal(t *testing.T) {
99+
scheme.Log(t)
100+
101+
time1 := time.Now()
102+
time2 := time.Now()
103+
testcases := []struct {
104+
desc string
105+
old *Event
106+
expected *auditinternal.Event
107+
}{
108+
{
109+
"StageTimestamp is empty",
110+
&Event{
111+
ObjectMeta: metav1.ObjectMeta{
112+
CreationTimestamp: metav1.NewTime(time1),
113+
},
114+
},
115+
&auditinternal.Event{
116+
StageTimestamp: metav1.NewMicroTime(time1),
117+
},
118+
},
119+
{
120+
"StageTimestamp is not empty",
121+
&Event{
122+
ObjectMeta: metav1.ObjectMeta{
123+
CreationTimestamp: metav1.NewTime(time1),
124+
},
125+
StageTimestamp: metav1.NewMicroTime(time2),
126+
},
127+
&auditinternal.Event{
128+
StageTimestamp: metav1.NewMicroTime(time2),
129+
},
130+
},
131+
{
132+
"RequestReceivedTimestamp is empty",
133+
&Event{
134+
Timestamp: metav1.NewTime(time1),
135+
},
136+
&auditinternal.Event{
137+
RequestReceivedTimestamp: metav1.NewMicroTime(time1),
138+
},
139+
},
140+
{
141+
"RequestReceivedTimestamp is not empty",
142+
&Event{
143+
Timestamp: metav1.NewTime(time1),
144+
RequestReceivedTimestamp: metav1.NewMicroTime(time2),
145+
},
146+
&auditinternal.Event{
147+
RequestReceivedTimestamp: metav1.NewMicroTime(time2),
148+
},
149+
},
150+
}
151+
for _, tc := range testcases {
152+
t.Run(tc.desc, func(t *testing.T) {
153+
internal := &auditinternal.Event{}
154+
if err := scheme.Convert(tc.old, internal, nil); err != nil {
155+
t.Errorf("unexpected error: %v", err)
156+
}
157+
if !reflect.DeepEqual(internal, tc.expected) {
158+
t.Errorf("expected\n\t%#v, got \n\t%#v", tc.expected, internal)
159+
}
160+
})
161+
}
162+
}
163+
164+
func TestConversionInternalToEvent(t *testing.T) {
165+
scheme.Log(t)
166+
167+
now := time.Now()
168+
testcases := []struct {
169+
desc string
170+
old *auditinternal.Event
171+
expected *Event
172+
}{
173+
{
174+
"convert stageTimestamp",
175+
&auditinternal.Event{
176+
StageTimestamp: metav1.NewMicroTime(now),
177+
},
178+
&Event{
179+
ObjectMeta: metav1.ObjectMeta{
180+
CreationTimestamp: metav1.NewTime(now),
181+
},
182+
StageTimestamp: metav1.NewMicroTime(now),
183+
},
184+
},
185+
{
186+
"convert RequestReceivedTimestamp",
187+
&auditinternal.Event{
188+
RequestReceivedTimestamp: metav1.NewMicroTime(now),
189+
},
190+
&Event{
191+
Timestamp: metav1.NewTime(now),
192+
RequestReceivedTimestamp: metav1.NewMicroTime(now),
193+
},
194+
},
195+
}
196+
for _, tc := range testcases {
197+
t.Run(tc.desc, func(t *testing.T) {
198+
event := &Event{}
199+
if err := scheme.Convert(tc.old, event, nil); err != nil {
200+
t.Errorf("unexpected error: %v", err)
201+
}
202+
if !reflect.DeepEqual(event, tc.expected) {
203+
t.Errorf("expected\n\t%#v, got \n\t%#v", tc.expected, event)
204+
}
205+
})
206+
}
207+
}

0 commit comments

Comments
 (0)