Skip to content

Commit 49d7b4c

Browse files
committed
Ensure transformers have access to the resource via request info
This guarantees that logs and metrics that rely on this information work as expected. Signed-off-by: Monis Khan <[email protected]>
1 parent ba60443 commit 49d7b4c

File tree

2 files changed

+51
-2
lines changed

2 files changed

+51
-2
lines changed

staging/src/k8s.io/apiserver/pkg/server/options/encryptionconfig/config.go

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import (
4040
"k8s.io/apiserver/pkg/apis/apiserver"
4141
apiserverv1 "k8s.io/apiserver/pkg/apis/apiserver/v1"
4242
"k8s.io/apiserver/pkg/apis/apiserver/validation"
43+
"k8s.io/apiserver/pkg/endpoints/request"
4344
"k8s.io/apiserver/pkg/features"
4445
"k8s.io/apiserver/pkg/server/healthz"
4546
"k8s.io/apiserver/pkg/server/options/encryptionconfig/metrics"
@@ -1013,7 +1014,9 @@ var anyGroupAnyResource = schema.GroupResource{
10131014
Resource: "*",
10141015
}
10151016

1016-
func transformerFromOverrides(transformerOverrides map[schema.GroupResource]storagevalue.Transformer, resource schema.GroupResource) storagevalue.Transformer {
1017+
func transformerFromOverrides(transformerOverrides map[schema.GroupResource]storagevalue.Transformer, resource schema.GroupResource) (out storagevalue.Transformer) {
1018+
defer func() { out = newRequestInfoTransformer(resource, out) }()
1019+
10171020
if transformer := transformerOverrides[resource]; transformer != nil {
10181021
return transformer
10191022
}
@@ -1039,3 +1042,41 @@ func grYAMLString(gr schema.GroupResource) string {
10391042

10401043
return gr.String()
10411044
}
1045+
1046+
var _ storagevalue.Transformer = &requestInfoTransformer{}
1047+
1048+
type requestInfoTransformer struct {
1049+
baseValueCtx context.Context
1050+
delegate storagevalue.Transformer
1051+
}
1052+
1053+
func newRequestInfoTransformer(resource schema.GroupResource, delegate storagevalue.Transformer) *requestInfoTransformer {
1054+
return &requestInfoTransformer{
1055+
baseValueCtx: request.WithRequestInfo(context.Background(), &request.RequestInfo{IsResourceRequest: true, APIGroup: resource.Group, Resource: resource.Resource}),
1056+
delegate: delegate,
1057+
}
1058+
}
1059+
1060+
func (l *requestInfoTransformer) TransformFromStorage(ctx context.Context, data []byte, dataCtx storagevalue.Context) ([]byte, bool, error) {
1061+
return l.delegate.TransformFromStorage(l.withBaseValueCtx(ctx), data, dataCtx)
1062+
}
1063+
1064+
func (l *requestInfoTransformer) TransformToStorage(ctx context.Context, data []byte, dataCtx storagevalue.Context) ([]byte, error) {
1065+
return l.delegate.TransformToStorage(l.withBaseValueCtx(ctx), data, dataCtx)
1066+
}
1067+
1068+
func (l *requestInfoTransformer) withBaseValueCtx(ctx context.Context) context.Context {
1069+
return &joinValueContext{Context: ctx, baseValueCtx: l.baseValueCtx}
1070+
}
1071+
1072+
type joinValueContext struct {
1073+
context.Context
1074+
baseValueCtx context.Context
1075+
}
1076+
1077+
func (j *joinValueContext) Value(key any) any {
1078+
if val := j.Context.Value(key); val != nil {
1079+
return val
1080+
}
1081+
return j.baseValueCtx.Value(key)
1082+
}

staging/src/k8s.io/apiserver/pkg/server/options/encryptionconfig/config_test.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1428,7 +1428,15 @@ func TestWildcardStructure(t *testing.T) {
14281428
for resource, expectedTransformerName := range tc.expectedResourceTransformers {
14291429
transformer := transformerFromOverrides(transformers, schema.ParseGroupResource(resource))
14301430
transformerName := string(
1431-
reflect.ValueOf(transformer).Elem().FieldByName("transformers").Index(0).FieldByName("Prefix").Bytes(),
1431+
reflect.ValueOf(transformer).
1432+
Elem().
1433+
FieldByName("delegate").
1434+
Elem().
1435+
Elem().
1436+
FieldByName("transformers").
1437+
Index(0).
1438+
FieldByName("Prefix").
1439+
Bytes(),
14321440
)
14331441

14341442
if transformerName != expectedTransformerName {

0 commit comments

Comments
 (0)