go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/_motor/discovery/k8s/creds_store.go (about) 1 // Copyright (c) Mondoo, Inc. 2 // SPDX-License-Identifier: BUSL-1.1 3 4 package k8s 5 6 import ( 7 "fmt" 8 9 "github.com/rs/zerolog/log" 10 "go.mondoo.com/cnquery/motor/providers/k8s" 11 v1 "k8s.io/api/core/v1" 12 ) 13 14 type cacheEntry struct { 15 secret *v1.Secret 16 err error 17 } 18 19 type credsStore struct { 20 provider k8s.KubernetesProvider 21 cache map[string]cacheEntry 22 } 23 24 func NewCredsStore(p k8s.KubernetesProvider) *credsStore { 25 return &credsStore{ 26 provider: p, 27 cache: make(map[string]cacheEntry), 28 } 29 } 30 31 // Get retrieves the secret with the provided namespace and name. The value is retrieved 32 // once and is cached. All consecutive calls will retrieve the cached value. Note that the 33 // implementation is not thread-safe. 34 func (c *credsStore) Get(namespace, name string) (*v1.Secret, error) { 35 key := credsStoreKey(namespace, name) 36 if s, ok := c.cache[key]; ok { 37 return s.secret, s.err 38 } 39 40 s, err := c.provider.Secret(namespace, name) 41 // We log the warning here to make sure we don't log the same message for every pod that uses 42 // the same pull secret. 43 if err != nil { 44 log.Warn().Msgf( 45 "cannot read image pull secret %s/%s from cluster. Image pulling might now work", namespace, name) 46 } 47 c.cache[key] = cacheEntry{secret: s, err: err} 48 return s, err 49 } 50 51 func credsStoreKey(namespace, name string) string { 52 return fmt.Sprintf("%s:%s", namespace, name) 53 }