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  }