Skip to content

Commit 3c9033f

Browse files
committed
Add support for Subscription.config.affinity (#2826)
* vendor new o_f/api version Signed-off-by: perdasilva <[email protected]> * Update olm controller to handle Subscription.config.affinity Signed-off-by: perdasilva <[email protected]> Upstream-commit: 55230179df33811fce196cca595c474bf4faaeff Upstream-repository: operator-lifecycle-manager
1 parent 0e3bf50 commit 3c9033f

File tree

10 files changed

+1117
-6
lines changed

10 files changed

+1117
-6
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ require (
1212
github.com/mikefarah/yq/v3 v3.0.0-20201202084205-8846255d1c37
1313
github.com/onsi/ginkgo/v2 v2.1.3
1414
github.com/openshift/api v0.0.0-20200331152225-585af27e34fd
15-
github.com/operator-framework/api v0.15.0
15+
github.com/operator-framework/api v0.15.1-0.20220801135701-ae4da2a9ec6a
1616
github.com/operator-framework/operator-lifecycle-manager v0.0.0-00010101000000-000000000000
1717
github.com/operator-framework/operator-registry v1.17.5
1818
github.com/sirupsen/logrus v1.8.1

staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-subscriptions.crd.yaml

Lines changed: 461 additions & 0 deletions
Large diffs are not rendered by default.

staging/operator-lifecycle-manager/pkg/controller/operators/olm/overrides/config.go

Lines changed: 2 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, tolerationOverrides []corev1.Toleration, resourcesOverride *corev1.ResourceRequirements, nodeSelectorOverride map[string]string, 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, nodeSelectorOverride map[string]string, affinity *corev1.Affinity, 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)
@@ -40,6 +40,7 @@ func (o *operatorConfig) GetConfigOverrides(ownerCSV ownerutil.Owner) (envVarOve
4040
tolerationOverrides = owner.Spec.Config.Tolerations
4141
resourcesOverride = owner.Spec.Config.Resources
4242
nodeSelectorOverride = owner.Spec.Config.NodeSelector
43+
affinity = owner.Spec.Config.Affinity
4344

4445
return
4546
}

staging/operator-lifecycle-manager/pkg/controller/operators/olm/overrides/initializer.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ func (d *DeploymentInitializer) initialize(ownerCSV ownerutil.Owner, deployment
4545
var envVarOverrides, proxyEnvVar, merged []corev1.EnvVar
4646
var err error
4747

48-
envVarOverrides, volumeOverrides, volumeMountOverrides, tolerationOverrides, resourcesOverride, nodeSelectorOverride, err := d.config.GetConfigOverrides(ownerCSV)
48+
envVarOverrides, volumeOverrides, volumeMountOverrides, tolerationOverrides, resourcesOverride, nodeSelectorOverride, affinity, err := d.config.GetConfigOverrides(ownerCSV)
4949
if err != nil {
5050
err = fmt.Errorf("failed to get subscription pod configuration - %v", err)
5151
return err
@@ -92,6 +92,10 @@ func (d *DeploymentInitializer) initialize(ownerCSV ownerutil.Owner, deployment
9292
return fmt.Errorf("failed to inject nodeSelector into deployment spec name=%s - %v", deployment.Name, err)
9393
}
9494

95+
if err = inject.OverrideDeploymentAffinity(podSpec, affinity); err != nil {
96+
return fmt.Errorf("failed to inject affinity into deployment spec name=%s - %s", deployment.Name, err)
97+
}
98+
9599
return nil
96100
}
97101

staging/operator-lifecycle-manager/pkg/controller/operators/olm/overrides/inject/inject.go

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,3 +230,71 @@ func InjectNodeSelectorIntoDeployment(podSpec *corev1.PodSpec, nodeSelector map[
230230

231231
return nil
232232
}
233+
234+
// OverrideDeploymentAffinity will override the corev1.Affinity defined in the Deployment
235+
// with the given corev1.Affinity. Any nil top-level sub-attributes (e.g. NodeAffinity, PodAffinity, and PodAntiAffinity)
236+
// will be ignored. Hint: to overwrite those top-level attributes, empty them out. I.e. use the empty/default object ({})
237+
// e.g. NodeAffinity{}. In yaml:
238+
// affinity:
239+
// nodeAffinity: {}
240+
// podAffinity: {}
241+
// podAntiAffinity: {}
242+
// will completely remove the deployment podSpec.affinity and is equivalent to
243+
// affinity: {}
244+
func OverrideDeploymentAffinity(podSpec *corev1.PodSpec, affinity *corev1.Affinity) error {
245+
if podSpec == nil {
246+
return errors.New("no pod spec provided")
247+
}
248+
249+
if affinity == nil {
250+
return nil
251+
}
252+
253+
// if podSpec.Affinity is nil or empty/default then completely override podSpec.Affinity with overrides
254+
if podSpec.Affinity == nil || reflect.DeepEqual(podSpec.Affinity, &corev1.Affinity{}) {
255+
if reflect.DeepEqual(affinity, &corev1.Affinity{}) {
256+
podSpec.Affinity = nil
257+
} else {
258+
podSpec.Affinity = affinity
259+
}
260+
return nil
261+
}
262+
263+
// if overriding affinity is empty/default then nil out podSpec.Affinity
264+
if reflect.DeepEqual(affinity, &corev1.Affinity{}) {
265+
podSpec.Affinity = nil
266+
return nil
267+
}
268+
269+
// override podSpec.Affinity each attribute as necessary nilling out any default/empty overrides on the podSpec
270+
if affinity.NodeAffinity != nil {
271+
if reflect.DeepEqual(affinity.NodeAffinity, &corev1.NodeAffinity{}) {
272+
podSpec.Affinity.NodeAffinity = nil
273+
} else {
274+
podSpec.Affinity.NodeAffinity = affinity.NodeAffinity
275+
}
276+
}
277+
278+
if affinity.PodAffinity != nil {
279+
if reflect.DeepEqual(affinity.PodAffinity, &corev1.PodAffinity{}) {
280+
podSpec.Affinity.PodAffinity = nil
281+
} else {
282+
podSpec.Affinity.PodAffinity = affinity.PodAffinity
283+
}
284+
}
285+
286+
if affinity.PodAntiAffinity != nil {
287+
if reflect.DeepEqual(affinity.PodAntiAffinity, &corev1.PodAntiAffinity{}) {
288+
podSpec.Affinity = nil
289+
} else {
290+
podSpec.Affinity.PodAntiAffinity = affinity.PodAntiAffinity
291+
}
292+
}
293+
294+
// special case: if after being overridden, podSpec is the same as default/empty then nil it out
295+
if reflect.DeepEqual(&corev1.Affinity{}, podSpec.Affinity) {
296+
podSpec.Affinity = nil
297+
}
298+
299+
return nil
300+
}

0 commit comments

Comments
 (0)