Skip to content

Commit 9e95012

Browse files
Merge pull request #1334 from umangachapagain/subs_config
Tolerations & Resources Override using .Subscription.Config
2 parents 2c80300 + 3870b77 commit 9e95012

File tree

6 files changed

+433
-60
lines changed

6 files changed

+433
-60
lines changed

doc/design/subscription-config.md

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,3 +84,52 @@ spec:
8484
- mountPath: /config
8585
name: config-volume
8686
```
87+
88+
### Tolerations
89+
90+
The `tolerations` field defines a list of [Tolerations](https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/) for the Pod created by OLM.
91+
92+
> Note: Tolerations defined here will be appended to existing Tolerations, if not already present.
93+
94+
#### Example
95+
96+
Inject toleration to tolerate all taints.
97+
98+
```
99+
kind: Subscription
100+
metadata:
101+
name: my-operator
102+
spec:
103+
package: etcd
104+
channel: alpha
105+
config:
106+
tolerations:
107+
- operator: "Exists"
108+
```
109+
110+
### Resources
111+
112+
The `resources` field defines [Resource Constraints](https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/#resource-requests-and-limits-of-pod-and-container) for all the containers in the Pod created by OLM.
113+
114+
> Note: Resource Constraints defined here will overwrite existing resource constraints.
115+
116+
#### Example
117+
118+
Inject a request of 0.25 cpu and 64 MiB of memory, and a limit of 0.5 cpu and 128MiB of memory in each container.
119+
120+
```
121+
kind: Subscription
122+
metadata:
123+
name: my-operator
124+
spec:
125+
package: etcd
126+
channel: alpha
127+
config:
128+
resources:
129+
requests:
130+
memory: "64Mi"
131+
cpu: "250m"
132+
limits:
133+
memory: "128Mi"
134+
cpu: "500m"
135+
```

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)