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  }