github.com/operator-framework/operator-lifecycle-manager@v0.30.0/pkg/lib/scoped/attenuator.go (about) 1 package scoped 2 3 import ( 4 "github.com/sirupsen/logrus" 5 6 corev1 "k8s.io/api/core/v1" 7 "k8s.io/client-go/rest" 8 9 "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/clients" 10 "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorclient" 11 ) 12 13 // NewClientAttenuator returns a new instance of ClientAttenuator. 14 func NewClientAttenuator(logger logrus.FieldLogger, config *rest.Config, kubeclient operatorclient.ClientInterface) *ClientAttenuator { 15 return &ClientAttenuator{ 16 logger: logger, 17 retriever: &BearerTokenRetriever{ 18 kubeclient: kubeclient, 19 logger: logger, 20 }, 21 } 22 } 23 24 // ServiceAccountQuerierFunc returns a reference to the service account from 25 // which scope client(s) can be created. 26 // This abstraction allows the attenuator to be agnostic of what the source of user 27 // specified service accounts are. A user can specify service account(s) for an 28 // operator group, subscription and CSV. 29 type ServiceAccountQuerierFunc func() (reference *corev1.ObjectReference, err error) 30 31 func StaticQuerier(ref *corev1.ObjectReference) ServiceAccountQuerierFunc { 32 return func() (*corev1.ObjectReference, error) { 33 return ref, nil 34 } 35 } 36 37 // ClientAttenuator returns appropriately scoped client(s) to be used for an 38 // operator that is being installed. 39 type ClientAttenuator struct { 40 retriever *BearerTokenRetriever 41 logger logrus.FieldLogger 42 } 43 44 func (a *ClientAttenuator) AttenuateToServiceAccount(querier ServiceAccountQuerierFunc) (clients.ConfigTransformer, error) { 45 ref, err := querier() 46 if err != nil { 47 return nil, err 48 } 49 50 if ref == nil { 51 return clients.ConfigTransformerFunc(func(config *rest.Config) *rest.Config { 52 return config 53 }), nil 54 } 55 56 token, err := a.retriever.Retrieve(ref) 57 if err != nil { 58 return nil, err 59 } 60 61 return clients.ConfigTransformerFunc(func(config *rest.Config) *rest.Config { 62 out := rest.AnonymousClientConfig(config) 63 out.BearerToken = token 64 return out 65 }), nil 66 }