Skip to content

Commit 8354255

Browse files
committed
chore: add secrets cache
Signed-off-by: Armando Ruocco <[email protected]>
1 parent 5d0038e commit 8354255

File tree

2 files changed

+74
-0
lines changed

2 files changed

+74
-0
lines changed

internal/client/client.go

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package client
2+
3+
import (
4+
"context"
5+
"sync"
6+
"time"
7+
8+
corev1 "k8s.io/api/core/v1"
9+
"sigs.k8s.io/controller-runtime/pkg/client"
10+
)
11+
12+
type cachedSecret struct {
13+
secret *corev1.Secret
14+
fetchUnixTime int64
15+
}
16+
17+
type extendedClient struct {
18+
client.Client
19+
cachedSecrets []*cachedSecret
20+
// add a mux to lock the operations on the cache
21+
mux *sync.Mutex
22+
}
23+
24+
// NewExtendedClient returns an extended client capable of caching secrets on the 'Get' operation
25+
func NewExtendedClient(baseClient client.Client) client.Client {
26+
return &extendedClient{
27+
Client: baseClient,
28+
}
29+
}
30+
31+
func (e *extendedClient) Get(ctx context.Context, key client.ObjectKey, obj client.Object, opts ...client.GetOption) error {
32+
if _, ok := obj.(*corev1.Secret); !ok {
33+
return e.Client.Get(ctx, key, obj, opts...)
34+
}
35+
36+
e.mux.Lock()
37+
defer e.mux.Unlock()
38+
39+
// check if in cache
40+
for _, cache := range e.cachedSecrets {
41+
if cache.secret.Namespace == key.Namespace && cache.secret.Name == key.Name {
42+
if time.Now().Unix()-cache.fetchUnixTime < 180 {
43+
cache.secret.DeepCopyInto(obj.(*corev1.Secret))
44+
return nil
45+
}
46+
break
47+
}
48+
}
49+
50+
if err := e.Client.Get(ctx, key, obj); err != nil {
51+
return err
52+
}
53+
54+
// check if the secret is already in cache if so replace it
55+
for _, cache := range e.cachedSecrets {
56+
if cache.secret.Namespace == key.Namespace && cache.secret.Name == key.Name {
57+
cache.secret = obj.(*corev1.Secret)
58+
cache.fetchUnixTime = time.Now().Unix()
59+
return nil
60+
}
61+
}
62+
63+
if secret, ok := obj.(*corev1.Secret); ok {
64+
e.cachedSecrets = append(e.cachedSecrets, &cachedSecret{
65+
secret: secret,
66+
fetchUnixTime: time.Now().Unix(),
67+
})
68+
}
69+
70+
return nil
71+
}

internal/client/doc.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
// Package client provides an extended client that is capable of caching multiple secrets without relying on
2+
// 'list and watch'
3+
package client

0 commit comments

Comments
 (0)