github.com/operator-framework/operator-lifecycle-manager@v0.30.0/pkg/controller/operators/olm/overrides/initializer.go (about)

     1  package overrides
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install"
     7  	"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/overrides/inject"
     8  	"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister"
     9  	"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/ownerutil"
    10  	"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/proxy"
    11  	"github.com/sirupsen/logrus"
    12  	appsv1 "k8s.io/api/apps/v1"
    13  	corev1 "k8s.io/api/core/v1"
    14  )
    15  
    16  // NewDeploymentInitializer returns a function that accepts a Deployment object
    17  // and initializes it with env variables specified in operator configuration.
    18  func NewDeploymentInitializer(logger *logrus.Logger, querier proxy.Querier, lister operatorlister.OperatorLister) *DeploymentInitializer {
    19  	return &DeploymentInitializer{
    20  		logger:  logger,
    21  		querier: querier,
    22  		config: &operatorConfig{
    23  			lister: lister,
    24  			logger: logger,
    25  		},
    26  	}
    27  }
    28  
    29  type DeploymentInitializer struct {
    30  	logger  *logrus.Logger
    31  	querier proxy.Querier
    32  	config  *operatorConfig
    33  }
    34  
    35  func (d *DeploymentInitializer) GetDeploymentInitializer(ownerCSV ownerutil.Owner) install.DeploymentInitializerFunc {
    36  	return func(spec *appsv1.Deployment) error {
    37  		err := d.initialize(ownerCSV, spec)
    38  		return err
    39  	}
    40  }
    41  
    42  // Initialize initializes a deployment object with appropriate global cluster
    43  // level proxy env variable(s).
    44  func (d *DeploymentInitializer) initialize(ownerCSV ownerutil.Owner, deployment *appsv1.Deployment) error {
    45  	var envVarOverrides, proxyEnvVar, merged []corev1.EnvVar
    46  	var err error
    47  
    48  	envVarOverrides, envFromOverrides, volumeOverrides, volumeMountOverrides, tolerationOverrides, resourcesOverride, nodeSelectorOverride, affinity, annotations, err := d.config.GetConfigOverrides(ownerCSV)
    49  	if err != nil {
    50  		err = fmt.Errorf("failed to get subscription pod configuration - %v", err)
    51  		return err
    52  	}
    53  
    54  	if !proxy.IsOverridden(envVarOverrides) {
    55  		proxyEnvVar, err = d.querier.QueryProxyConfig()
    56  		if err != nil {
    57  			err = fmt.Errorf("failed to query cluster proxy configuration - %v", err)
    58  			return err
    59  		}
    60  
    61  		proxyEnvVar = dropEmptyProxyEnv(proxyEnvVar)
    62  	}
    63  
    64  	merged = append(envVarOverrides, proxyEnvVar...)
    65  
    66  	if len(merged) == 0 {
    67  		d.logger.WithField("csv", ownerCSV.GetName()).Debug("no env var to inject into csv")
    68  	}
    69  
    70  	podSpec := &deployment.Spec.Template.Spec
    71  	if err := inject.InjectEnvIntoDeployment(podSpec, merged); err != nil {
    72  		return fmt.Errorf("failed to inject proxy env variable(s) into deployment spec name=%s - %v", deployment.Name, err)
    73  	}
    74  
    75  	if err := inject.InjectEnvFromIntoDeployment(podSpec, envFromOverrides); err != nil {
    76  		return fmt.Errorf("failed to inject envFrom variable(s) into deployment spec name=%s - %v", deployment.Name, err)
    77  	}
    78  
    79  	if err = inject.InjectVolumesIntoDeployment(podSpec, volumeOverrides); err != nil {
    80  		return fmt.Errorf("failed to inject volume(s) into deployment spec name=%s - %v", deployment.Name, err)
    81  	}
    82  
    83  	if err = inject.InjectVolumeMountsIntoDeployment(podSpec, volumeMountOverrides); err != nil {
    84  		return fmt.Errorf("failed to inject volumeMounts(s) into deployment spec name=%s - %v", deployment.Name, err)
    85  	}
    86  
    87  	if err = inject.InjectTolerationsIntoDeployment(podSpec, tolerationOverrides); err != nil {
    88  		return fmt.Errorf("failed to inject toleration(s) into deployment spec name=%s - %v", deployment.Name, err)
    89  	}
    90  
    91  	if err = inject.InjectResourcesIntoDeployment(podSpec, resourcesOverride); err != nil {
    92  		return fmt.Errorf("failed to inject resources into deployment spec name=%s - %v", deployment.Name, err)
    93  	}
    94  
    95  	if err = inject.InjectNodeSelectorIntoDeployment(podSpec, nodeSelectorOverride); err != nil {
    96  		return fmt.Errorf("failed to inject nodeSelector into deployment spec name=%s - %v", deployment.Name, err)
    97  	}
    98  
    99  	if err = inject.OverrideDeploymentAffinity(podSpec, affinity); err != nil {
   100  		return fmt.Errorf("failed to inject affinity into deployment spec name=%s - %s", deployment.Name, err)
   101  	}
   102  
   103  	if err = inject.InjectAnnotationsIntoDeployment(deployment, annotations); err != nil {
   104  		return fmt.Errorf("failed to inject annotations into deployment spec name=%s - %s", deployment.Name, err)
   105  	}
   106  
   107  	return nil
   108  }
   109  
   110  func dropEmptyProxyEnv(in []corev1.EnvVar) (out []corev1.EnvVar) {
   111  	out = make([]corev1.EnvVar, 0)
   112  	for i := range in {
   113  		if in[i].Value == "" {
   114  			continue
   115  		}
   116  
   117  		out = append(out, in[i])
   118  	}
   119  
   120  	return
   121  }