Skip to content

Commit 4fd5b15

Browse files
committed
Add TrackedCreateOrUpdate and WaitableSecretResource
1 parent 3fbca0c commit 4fd5b15

3 files changed

Lines changed: 44 additions & 5 deletions

File tree

common/secret.go

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,30 @@ type SecretResource struct {
1313
once sync.Once
1414
}
1515

16+
type WaitableSecretResource struct {
17+
*SecretResource
18+
wg sync.WaitGroup
19+
}
20+
1621
// Creates a Secret that clears it's data when recCtx is canceled
1722
func NewSecret(recCtx context.Context, name, namespace string) *corev1.Secret {
1823
secretResource := NewSecretResource(name, namespace)
1924
go func() {
2025
<-recCtx.Done()
21-
secretResource.Clear()
26+
secretResource.Clear(nil)
2227
}()
2328
return secretResource.GetSecret()
2429
}
2530

31+
func NewWaitableSecret(recCtx context.Context, name, namespace string) (*corev1.Secret, *sync.WaitGroup) {
32+
waitableSecretResource := NewWaitableSecretResource(name, namespace)
33+
go func() {
34+
<-recCtx.Done()
35+
waitableSecretResource.Clear(waitableSecretResource.GetWaitGroup())
36+
}()
37+
return waitableSecretResource.GetSecret(), waitableSecretResource.GetWaitGroup()
38+
}
39+
2640
func NewSecretResource(name, namespace string) *SecretResource {
2741
resource := &SecretResource{
2842
secret: &corev1.Secret{
@@ -35,16 +49,31 @@ func NewSecretResource(name, namespace string) *SecretResource {
3549
return resource
3650
}
3751

52+
func NewWaitableSecretResource(name, namespace string) *WaitableSecretResource {
53+
resource := &WaitableSecretResource{
54+
SecretResource: NewSecretResource(name, namespace),
55+
wg: sync.WaitGroup{},
56+
}
57+
return resource
58+
}
59+
60+
func (wsr *WaitableSecretResource) GetWaitGroup() *sync.WaitGroup {
61+
return &wsr.wg
62+
}
63+
3864
func (r *SecretResource) GetSecret() *corev1.Secret {
3965
return r.secret
4066
}
4167

42-
func (r *SecretResource) Clear() {
68+
func (r *SecretResource) Clear(wg *sync.WaitGroup) {
4369
if r.secret == nil {
4470
return
4571
}
4672

4773
r.once.Do(func() {
74+
if wg != nil {
75+
wg.Wait()
76+
}
4877
for secretKey, secretValue := range r.secret.Data {
4978
clear(secretValue)
5079
delete(r.secret.Data, secretKey)

utils/reconciler.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"fmt"
88
"math"
99
"strconv"
10+
"sync"
1011
"time"
1112

1213
networkingv1 "k8s.io/api/networking/v1"
@@ -172,6 +173,15 @@ func (r *ReconcilerBase) CreateOrUpdate(obj client.Object, owner metav1.Object,
172173
return err
173174
}
174175

176+
// Runs CreateOrUpdate tracked by a WaitGroup wg
177+
func (r *ReconcilerBase) TrackedCreateOrUpdate(obj client.Object, owner metav1.Object, reconcile func() error, wg *sync.WaitGroup) error {
178+
if wg != nil {
179+
wg.Add(1)
180+
defer wg.Done()
181+
}
182+
return r.CreateOrUpdate(obj, owner, reconcile)
183+
}
184+
175185
// DeleteResource deletes kubernetes resource
176186
func (r *ReconcilerBase) DeleteResource(obj client.Object) error {
177187
err := r.client.Delete(context.TODO(), obj)

utils/service_binding_reconciler.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,10 @@ func (r *ReconcilerBase) ReconcileBindings(recCtx context.Context, ba common.Bas
2929

3030
func (r *ReconcilerBase) reconcileExpose(recCtx context.Context, ba common.BaseComponent) error {
3131
mObj := ba.(metav1.Object)
32-
bindingSecret := common.NewSecret(recCtx, getExposeBindingSecretName(ba), mObj.GetNamespace())
32+
bindingSecret, wg := common.NewWaitableSecret(recCtx, getExposeBindingSecretName(ba), mObj.GetNamespace())
3333

3434
if ba.GetService() != nil && ba.GetService().GetBindable() != nil && *ba.GetService().GetBindable() {
35-
err := r.CreateOrUpdate(bindingSecret, mObj, func() error {
35+
err := r.TrackedCreateOrUpdate(bindingSecret, mObj, func() error {
3636
customSecret := &corev1.Secret{}
3737
// Check if custom values are provided in a secret, and apply the custom values
3838
if err := r.getCustomValuesToExpose(customSecret, ba); err != nil {
@@ -43,7 +43,7 @@ func (r *ReconcilerBase) reconcileExpose(recCtx context.Context, ba common.BaseC
4343
// Apply default values to the override secret if certain values are not set
4444
r.applyDefaultValuesToExpose(recCtx, bindingSecret, ba)
4545
return nil
46-
})
46+
}, wg)
4747
if err != nil {
4848
return err
4949
}

0 commit comments

Comments
 (0)