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 }