Skip to content

Commit dc81dd4

Browse files
(feat) inject 'Tolerations' & 'Resources' from config
Updated deployment initializer function to inject tolerations and resources specified in pod configuration of subscription into deployment object. - Toleration will be appended if it does not exist - Resources will be overwritten Signed-off-by: Umanga Chapagain <[email protected]>
1 parent 8985872 commit dc81dd4

File tree

4 files changed

+328
-58
lines changed

4 files changed

+328
-58
lines changed

pkg/controller/operators/olm/overrides/config.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ type operatorConfig struct {
1616
logger *logrus.Logger
1717
}
1818

19-
func (o *operatorConfig) GetConfigOverrides(ownerCSV ownerutil.Owner) (envVarOverrides []corev1.EnvVar, volumeOverrides []corev1.Volume, volumeMountOverrides []corev1.VolumeMount, err error) {
19+
func (o *operatorConfig) GetConfigOverrides(ownerCSV ownerutil.Owner) (envVarOverrides []corev1.EnvVar, volumeOverrides []corev1.Volume, volumeMountOverrides []corev1.VolumeMount, tolerationOverrides []corev1.Toleration, resourcesOverride corev1.ResourceRequirements, err error) {
2020
list, listErr := o.lister.OperatorsV1alpha1().SubscriptionLister().Subscriptions(ownerCSV.GetNamespace()).List(labels.Everything())
2121
if listErr != nil {
2222
err = fmt.Errorf("failed to list subscription namespace=%s - %v", ownerCSV.GetNamespace(), listErr)
@@ -32,6 +32,8 @@ func (o *operatorConfig) GetConfigOverrides(ownerCSV ownerutil.Owner) (envVarOve
3232
envVarOverrides = owner.Spec.Config.Env
3333
volumeOverrides = owner.Spec.Config.Volumes
3434
volumeMountOverrides = owner.Spec.Config.VolumeMounts
35+
tolerationOverrides = owner.Spec.Config.Tolerations
36+
resourcesOverride = owner.Spec.Config.Resources
3537

3638
return
3739
}

pkg/controller/operators/olm/overrides/initializer.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package overrides
22

33
import (
44
"fmt"
5+
56
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install"
67
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister"
78
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/ownerutil"
@@ -43,7 +44,7 @@ func (d *DeploymentInitializer) initialize(ownerCSV ownerutil.Owner, deployment
4344
var envVarOverrides, proxyEnvVar, merged []corev1.EnvVar
4445
var err error
4546

46-
envVarOverrides, volumeOverrides, volumeMountOverrides, err := d.config.GetConfigOverrides(ownerCSV)
47+
envVarOverrides, volumeOverrides, volumeMountOverrides, tolerationOverrides, resourcesOverride, err := d.config.GetConfigOverrides(ownerCSV)
4748
if err != nil {
4849
err = fmt.Errorf("failed to get subscription pod configuration - %v", err)
4950
return err
@@ -78,6 +79,14 @@ func (d *DeploymentInitializer) initialize(ownerCSV ownerutil.Owner, deployment
7879
return fmt.Errorf("failed to inject volumeMounts(s) into deployment spec name=%s - %v", deployment.Name, err)
7980
}
8081

82+
if err = InjectTolerationsIntoDeployment(podSpec, tolerationOverrides); err != nil {
83+
return fmt.Errorf("failed to inject toleration(s) into deployment spec name=%s - %v", deployment.Name, err)
84+
}
85+
86+
if err = InjectResourcesIntoDeployment(podSpec, resourcesOverride); err != nil {
87+
return fmt.Errorf("failed to inject resources into deployment spec name=%s - %v", deployment.Name, err)
88+
}
89+
8190
return nil
8291
}
8392

pkg/controller/operators/olm/overrides/inject.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package overrides
22

33
import (
44
"errors"
5+
"reflect"
56

67
corev1 "k8s.io/api/core/v1"
78
)
@@ -149,3 +150,59 @@ func findVolumeMount(volumeMounts []corev1.VolumeMount, name string) (foundVolum
149150

150151
return
151152
}
153+
154+
// InjectTolerationsIntoDeployment injects provided Tolerations
155+
// into the given Pod Spec
156+
//
157+
// Tolerations will be appended to the existing once if it
158+
// does not already exist
159+
func InjectTolerationsIntoDeployment(podSpec *corev1.PodSpec, tolerations []corev1.Toleration) error {
160+
if podSpec == nil {
161+
return errors.New("no pod spec provided")
162+
}
163+
164+
podSpec.Tolerations = mergeTolerations(podSpec.Tolerations, tolerations)
165+
return nil
166+
}
167+
168+
func mergeTolerations(podTolerations []corev1.Toleration, newTolerations []corev1.Toleration) (mergedTolerations []corev1.Toleration) {
169+
mergedTolerations = podTolerations
170+
for _, newToleration := range newTolerations {
171+
_, found := findToleration(podTolerations, newToleration)
172+
if !found {
173+
mergedTolerations = append(mergedTolerations, newToleration)
174+
}
175+
}
176+
177+
return
178+
}
179+
180+
func findToleration(tolerations []corev1.Toleration, toleration corev1.Toleration) (foundToleration *corev1.Toleration, found bool) {
181+
for i := range tolerations {
182+
if reflect.DeepEqual(toleration, tolerations[i]) {
183+
found = true
184+
foundToleration = &toleration
185+
186+
break
187+
}
188+
}
189+
190+
return
191+
}
192+
193+
// InjectResourcesIntoDeployment will inject provided Resources
194+
// into given podSpec
195+
//
196+
// If podSpec already defines Resources, it will be overwritten
197+
func InjectResourcesIntoDeployment(podSpec *corev1.PodSpec, resources corev1.ResourceRequirements) error {
198+
if podSpec == nil {
199+
return errors.New("no pod spec provided")
200+
}
201+
202+
for i := range podSpec.Containers {
203+
container := &podSpec.Containers[i]
204+
container.Resources = resources
205+
}
206+
207+
return nil
208+
}

0 commit comments

Comments
 (0)