Skip to content

Commit 57e337d

Browse files
committed
Make generated client codecs support CBOR based on feature gate.
1 parent d3fd594 commit 57e337d

File tree

2 files changed

+53
-21
lines changed

2 files changed

+53
-21
lines changed

staging/src/k8s.io/client-go/rest/config.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ import (
3232
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3333
"k8s.io/apimachinery/pkg/runtime"
3434
"k8s.io/apimachinery/pkg/runtime/schema"
35+
"k8s.io/apimachinery/pkg/runtime/serializer"
36+
"k8s.io/apimachinery/pkg/runtime/serializer/cbor"
37+
"k8s.io/client-go/features"
3538
"k8s.io/client-go/pkg/version"
3639
clientcmdapi "k8s.io/client-go/tools/clientcmd/api"
3740
"k8s.io/client-go/transport"
@@ -672,3 +675,31 @@ func CopyConfig(config *Config) *Config {
672675
}
673676
return c
674677
}
678+
679+
// CodecFactoryForGeneratedClient returns the provided CodecFactory if there are no enabled client
680+
// feature gates affecting serialization. Otherwise, it constructs and returns a new CodecFactory
681+
// from the provided Scheme.
682+
//
683+
// This is supported ONLY for use by clients generated with client-gen. The caller is responsible
684+
// for ensuring that the CodecFactory argument was constructed using the Scheme argument.
685+
func CodecFactoryForGeneratedClient(scheme *runtime.Scheme, codecs serializer.CodecFactory) serializer.CodecFactory {
686+
if !features.TestOnlyFeatureGates.Enabled(features.TestOnlyClientAllowsCBOR) {
687+
// NOTE: This assumes client-gen will not generate CBOR-enabled Codecs as long as
688+
// the feature gate exists.
689+
return codecs
690+
}
691+
692+
return serializer.NewCodecFactory(scheme, serializer.WithSerializer(func(creater runtime.ObjectCreater, typer runtime.ObjectTyper) runtime.SerializerInfo {
693+
return runtime.SerializerInfo{
694+
MediaType: "application/cbor",
695+
MediaTypeType: "application",
696+
MediaTypeSubType: "cbor",
697+
Serializer: cbor.NewSerializer(creater, typer),
698+
StrictSerializer: cbor.NewSerializer(creater, typer, cbor.Strict(true)),
699+
StreamSerializer: &runtime.StreamSerializerInfo{
700+
Framer: cbor.NewFramer(),
701+
Serializer: cbor.NewSerializer(creater, typer, cbor.Transcode(false)),
702+
},
703+
}
704+
}))
705+
}

staging/src/k8s.io/code-generator/cmd/client-gen/generators/generator_for_group.go

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -83,25 +83,26 @@ func (g *genGroup) GenerateType(c *generator.Context, t *types.Type, w io.Writer
8383
}
8484
schemePackage := path.Join(g.clientsetPackage, "scheme")
8585
m := map[string]interface{}{
86-
"version": g.version,
87-
"groupName": groupName,
88-
"GroupGoName": g.groupGoName,
89-
"Version": namer.IC(g.version),
90-
"types": g.types,
91-
"apiPath": apiPath,
92-
"httpClient": c.Universe.Type(types.Name{Package: "net/http", Name: "Client"}),
93-
"schemaGroupVersion": c.Universe.Type(types.Name{Package: "k8s.io/apimachinery/pkg/runtime/schema", Name: "GroupVersion"}),
94-
"runtimeAPIVersionInternal": c.Universe.Variable(types.Name{Package: "k8s.io/apimachinery/pkg/runtime", Name: "APIVersionInternal"}),
95-
"restConfig": c.Universe.Type(types.Name{Package: "k8s.io/client-go/rest", Name: "Config"}),
96-
"restDefaultKubernetesUserAgent": c.Universe.Function(types.Name{Package: "k8s.io/client-go/rest", Name: "DefaultKubernetesUserAgent"}),
97-
"restRESTClientInterface": c.Universe.Type(types.Name{Package: "k8s.io/client-go/rest", Name: "Interface"}),
98-
"RESTHTTPClientFor": c.Universe.Function(types.Name{Package: "k8s.io/client-go/rest", Name: "HTTPClientFor"}),
99-
"restRESTClientFor": c.Universe.Function(types.Name{Package: "k8s.io/client-go/rest", Name: "RESTClientFor"}),
100-
"restRESTClientForConfigAndClient": c.Universe.Function(types.Name{Package: "k8s.io/client-go/rest", Name: "RESTClientForConfigAndClient"}),
101-
"SchemeGroupVersion": c.Universe.Variable(types.Name{Package: g.inputPackage, Name: "SchemeGroupVersion"}),
102-
"SchemePrioritizedVersionsForGroup": c.Universe.Variable(types.Name{Package: schemePackage, Name: "Scheme.PrioritizedVersionsForGroup"}),
103-
"Codecs": c.Universe.Variable(types.Name{Package: schemePackage, Name: "Codecs"}),
104-
"CodecsWithoutConversion": c.Universe.Variable(types.Name{Package: schemePackage, Name: "Codecs.WithoutConversion"}),
86+
"version": g.version,
87+
"groupName": groupName,
88+
"GroupGoName": g.groupGoName,
89+
"Version": namer.IC(g.version),
90+
"types": g.types,
91+
"apiPath": apiPath,
92+
"httpClient": c.Universe.Type(types.Name{Package: "net/http", Name: "Client"}),
93+
"schemaGroupVersion": c.Universe.Type(types.Name{Package: "k8s.io/apimachinery/pkg/runtime/schema", Name: "GroupVersion"}),
94+
"runtimeAPIVersionInternal": c.Universe.Variable(types.Name{Package: "k8s.io/apimachinery/pkg/runtime", Name: "APIVersionInternal"}),
95+
"restConfig": c.Universe.Type(types.Name{Package: "k8s.io/client-go/rest", Name: "Config"}),
96+
"restDefaultKubernetesUserAgent": c.Universe.Function(types.Name{Package: "k8s.io/client-go/rest", Name: "DefaultKubernetesUserAgent"}),
97+
"restRESTClientInterface": c.Universe.Type(types.Name{Package: "k8s.io/client-go/rest", Name: "Interface"}),
98+
"RESTHTTPClientFor": c.Universe.Function(types.Name{Package: "k8s.io/client-go/rest", Name: "HTTPClientFor"}),
99+
"restRESTClientFor": c.Universe.Function(types.Name{Package: "k8s.io/client-go/rest", Name: "RESTClientFor"}),
100+
"restRESTClientForConfigAndClient": c.Universe.Function(types.Name{Package: "k8s.io/client-go/rest", Name: "RESTClientForConfigAndClient"}),
101+
"restCodecFactoryForGeneratedClient": c.Universe.Function(types.Name{Package: "k8s.io/client-go/rest", Name: "CodecFactoryForGeneratedClient"}),
102+
"SchemeGroupVersion": c.Universe.Variable(types.Name{Package: g.inputPackage, Name: "SchemeGroupVersion"}),
103+
"SchemePrioritizedVersionsForGroup": c.Universe.Variable(types.Name{Package: schemePackage, Name: "Scheme.PrioritizedVersionsForGroup"}),
104+
"Codecs": c.Universe.Variable(types.Name{Package: schemePackage, Name: "Codecs"}),
105+
"Scheme": c.Universe.Variable(types.Name{Package: schemePackage, Name: "Scheme"}),
105106
}
106107
sw.Do(groupInterfaceTemplate, m)
107108
sw.Do(groupClientTemplate, m)
@@ -235,7 +236,7 @@ func setConfigDefaults(config *$.restConfig|raw$) error {
235236
gv := $.SchemePrioritizedVersionsForGroup|raw$("$.groupName$")[0]
236237
config.GroupVersion = &gv
237238
}
238-
config.NegotiatedSerializer = $.Codecs|raw$
239+
config.NegotiatedSerializer = $.restCodecFactoryForGeneratedClient|raw$($.Scheme|raw$, $.Codecs|raw$)
239240
240241
if config.QPS == 0 {
241242
config.QPS = 5
@@ -253,7 +254,7 @@ func setConfigDefaults(config *$.restConfig|raw$) error {
253254
gv := $.SchemeGroupVersion|raw$
254255
config.GroupVersion = &gv
255256
config.APIPath = $.apiPath$
256-
config.NegotiatedSerializer = $.CodecsWithoutConversion|raw$()
257+
config.NegotiatedSerializer = $.restCodecFactoryForGeneratedClient|raw$($.Scheme|raw$, $.Codecs|raw$).WithoutConversion()
257258
258259
if config.UserAgent == "" {
259260
config.UserAgent = $.restDefaultKubernetesUserAgent|raw$()

0 commit comments

Comments
 (0)