Skip to content

Commit 6124ad9

Browse files
committed
kubernetes: lazily initialize kubeclient scheme
Use sync.OnceValue to initialize the kubeclient scheme, codec factory, and parameter codec as a single lazy-loaded bundle. Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
1 parent 5a7f7c2 commit 6124ad9

3 files changed

Lines changed: 37 additions & 14 deletions

File tree

driver/kubernetes/execconn/execconn.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ func ExecConn(ctx context.Context, restClient rest.Interface, restConfig *rest.C
2929
Stdout: true,
3030
Stderr: true,
3131
TTY: false,
32-
}, kubeclient.ParameterCodec)
32+
}, kubeclient.ParameterCodec())
3333
exec, err := remotecommand.NewSPDYExecutor(restConfig, "POST", req.URL())
3434
if err != nil {
3535
return nil, err

driver/kubernetes/kubeclient/client.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ func newRESTClient(config *rest.Config, httpClient *http.Client, gv schema.Group
6161
cfg := *config
6262
cfg.GroupVersion = &gv
6363
cfg.APIPath = apiPath
64-
cfg.NegotiatedSerializer = rest.CodecFactoryForGeneratedClient(Scheme, Codecs).WithoutConversion()
64+
cfg.NegotiatedSerializer = rest.CodecFactoryForGeneratedClient(Scheme(), Codecs()).WithoutConversion()
6565
if cfg.UserAgent == "" {
6666
cfg.UserAgent = rest.DefaultKubernetesUserAgent()
6767
}
@@ -80,7 +80,7 @@ func (c *deploymentClient) Get(ctx context.Context, name string, opts metav1.Get
8080
Namespace(c.namespace).
8181
Resource("deployments").
8282
Name(name).
83-
VersionedParams(&opts, ParameterCodec).
83+
VersionedParams(&opts, ParameterCodec()).
8484
Do(ctx).
8585
Into(result)
8686
return result, err
@@ -92,7 +92,7 @@ func (c *deploymentClient) Create(ctx context.Context, deployment *appsv1.Deploy
9292
UseProtobufAsDefault().
9393
Namespace(c.namespace).
9494
Resource("deployments").
95-
VersionedParams(&opts, ParameterCodec).
95+
VersionedParams(&opts, ParameterCodec()).
9696
Body(deployment).
9797
Do(ctx).
9898
Into(result)
@@ -121,7 +121,7 @@ func (c *configMapClient) Create(ctx context.Context, configMap *corev1.ConfigMa
121121
UseProtobufAsDefault().
122122
Namespace(c.namespace).
123123
Resource("configmaps").
124-
VersionedParams(&opts, ParameterCodec).
124+
VersionedParams(&opts, ParameterCodec()).
125125
Body(configMap).
126126
Do(ctx).
127127
Into(result)
@@ -135,7 +135,7 @@ func (c *configMapClient) Update(ctx context.Context, configMap *corev1.ConfigMa
135135
Namespace(c.namespace).
136136
Resource("configmaps").
137137
Name(configMap.Name).
138-
VersionedParams(&opts, ParameterCodec).
138+
VersionedParams(&opts, ParameterCodec()).
139139
Body(configMap).
140140
Do(ctx).
141141
Into(result)
@@ -164,7 +164,7 @@ func (c *podClient) List(ctx context.Context, opts metav1.ListOptions) (*corev1.
164164
UseProtobufAsDefault().
165165
Namespace(c.namespace).
166166
Resource("pods").
167-
VersionedParams(&opts, ParameterCodec).
167+
VersionedParams(&opts, ParameterCodec()).
168168
Do(ctx).
169169
Into(result)
170170
return result, err
Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package kubeclient
22

33
import (
4+
"sync"
5+
46
appsv1 "k8s.io/api/apps/v1"
57
corev1 "k8s.io/api/core/v1"
68
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -10,12 +12,33 @@ import (
1012
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
1113
)
1214

13-
var Scheme = runtime.NewScheme()
14-
var Codecs = serializer.NewCodecFactory(Scheme)
15-
var ParameterCodec = runtime.NewParameterCodec(Scheme)
15+
type schemeData struct {
16+
scheme *runtime.Scheme
17+
codecs serializer.CodecFactory
18+
parameterCodec runtime.ParameterCodec
19+
}
20+
21+
var loadSchemeData = sync.OnceValue(func() schemeData {
22+
s := runtime.NewScheme()
23+
metav1.AddToGroupVersion(s, schema.GroupVersion{Version: "v1"})
24+
utilruntime.Must(corev1.AddToScheme(s))
25+
utilruntime.Must(appsv1.AddToScheme(s))
26+
27+
return schemeData{
28+
scheme: s,
29+
codecs: serializer.NewCodecFactory(s),
30+
parameterCodec: runtime.NewParameterCodec(s),
31+
}
32+
})
33+
34+
func Scheme() *runtime.Scheme {
35+
return loadSchemeData().scheme
36+
}
37+
38+
func Codecs() serializer.CodecFactory {
39+
return loadSchemeData().codecs
40+
}
1641

17-
func init() {
18-
metav1.AddToGroupVersion(Scheme, schema.GroupVersion{Version: "v1"})
19-
utilruntime.Must(corev1.AddToScheme(Scheme))
20-
utilruntime.Must(appsv1.AddToScheme(Scheme))
42+
func ParameterCodec() runtime.ParameterCodec {
43+
return loadSchemeData().parameterCodec
2144
}

0 commit comments

Comments
 (0)