Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 49 additions & 0 deletions doc/design/subscription-config.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,3 +84,52 @@ spec:
- mountPath: /config
name: config-volume
```

### Tolerations

The `tolerations` field defines a list of [Tolerations](https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/) for the Pod created by OLM.

> Note: Tolerations defined here will be appended to existing Tolerations, if not already present.

#### Example

Inject toleration to tolerate all taints.

```
kind: Subscription
metadata:
name: my-operator
spec:
package: etcd
channel: alpha
config:
tolerations:
- operator: "Exists"
```

### Resources

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.

> Note: Resource Constraints defined here will overwrite existing resource constraints.

#### Example

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.

```
kind: Subscription
metadata:
name: my-operator
spec:
package: etcd
channel: alpha
config:
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
```
4 changes: 3 additions & 1 deletion pkg/controller/operators/olm/overrides/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ type operatorConfig struct {
logger *logrus.Logger
}

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

return
}
Expand Down
11 changes: 10 additions & 1 deletion pkg/controller/operators/olm/overrides/initializer.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package overrides

import (
"fmt"

"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install"
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister"
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/ownerutil"
Expand Down Expand Up @@ -43,7 +44,7 @@ func (d *DeploymentInitializer) initialize(ownerCSV ownerutil.Owner, deployment
var envVarOverrides, proxyEnvVar, merged []corev1.EnvVar
var err error

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

if err = InjectTolerationsIntoDeployment(podSpec, tolerationOverrides); err != nil {
return fmt.Errorf("failed to inject toleration(s) into deployment spec name=%s - %v", deployment.Name, err)
}

if err = InjectResourcesIntoDeployment(podSpec, resourcesOverride); err != nil {
return fmt.Errorf("failed to inject resources into deployment spec name=%s - %v", deployment.Name, err)
}

return nil
}

Expand Down
57 changes: 57 additions & 0 deletions pkg/controller/operators/olm/overrides/inject.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package overrides

import (
"errors"
"reflect"

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

return
}

// InjectTolerationsIntoDeployment injects provided Tolerations
// into the given Pod Spec
//
// Tolerations will be appended to the existing once if it
// does not already exist
func InjectTolerationsIntoDeployment(podSpec *corev1.PodSpec, tolerations []corev1.Toleration) error {
if podSpec == nil {
return errors.New("no pod spec provided")
}

podSpec.Tolerations = mergeTolerations(podSpec.Tolerations, tolerations)
return nil
}

func mergeTolerations(podTolerations []corev1.Toleration, newTolerations []corev1.Toleration) (mergedTolerations []corev1.Toleration) {
mergedTolerations = podTolerations
for _, newToleration := range newTolerations {
_, found := findToleration(podTolerations, newToleration)
if !found {
mergedTolerations = append(mergedTolerations, newToleration)
}
}

return
}

func findToleration(tolerations []corev1.Toleration, toleration corev1.Toleration) (foundToleration *corev1.Toleration, found bool) {
for i := range tolerations {
if reflect.DeepEqual(toleration, tolerations[i]) {
found = true
foundToleration = &toleration

break
}
}

return
}

// InjectResourcesIntoDeployment will inject provided Resources
// into given podSpec
//
// If podSpec already defines Resources, it will be overwritten
func InjectResourcesIntoDeployment(podSpec *corev1.PodSpec, resources corev1.ResourceRequirements) error {
if podSpec == nil {
return errors.New("no pod spec provided")
}

for i := range podSpec.Containers {
container := &podSpec.Containers[i]
container.Resources = resources
}

return nil
}
Loading