github.com/kubeshop/testkube@v1.17.23/pkg/imageinspector/secretfetcher.go (about) 1 package imageinspector 2 3 import ( 4 "context" 5 "sync" 6 7 "github.com/pkg/errors" 8 corev1 "k8s.io/api/core/v1" 9 10 "github.com/kubeshop/testkube/pkg/secret" 11 ) 12 13 type secretFetcher struct { 14 client secret.Interface 15 cache map[string]*corev1.Secret 16 mu sync.RWMutex 17 } 18 19 func NewSecretFetcher(client secret.Interface) SecretFetcher { 20 return &secretFetcher{ 21 client: client, 22 cache: make(map[string]*corev1.Secret), 23 } 24 } 25 26 func (s *secretFetcher) Get(ctx context.Context, name string) (*corev1.Secret, error) { 27 // Get cached secret 28 s.mu.RLock() 29 if v, ok := s.cache[name]; ok { 30 s.mu.RUnlock() 31 return v, nil 32 } 33 s.mu.RUnlock() 34 35 // Load secret from the Kubernetes 36 obj, err := s.client.GetObject(name) 37 if err != nil { 38 return nil, errors.Wrap(err, "fetching image pull secret") 39 } 40 41 // Save in cache 42 s.mu.Lock() 43 s.cache[name] = obj 44 s.mu.Unlock() 45 46 if ctx.Err() != nil { 47 return nil, ctx.Err() 48 } 49 return obj, nil 50 }