Skip to content

Commit 5523017

Browse files
authored
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]>
1 parent 67177c0 commit 5523017

File tree

16 files changed

+2183
-43
lines changed

16 files changed

+2183
-43
lines changed

deploy/chart/crds/0000_50_olm_00-subscriptions.crd.yaml

+461
Large diffs are not rendered by default.

go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ require (
2424
github.com/onsi/gomega v1.18.1
2525
github.com/openshift/api v0.0.0-20200331152225-585af27e34fd
2626
github.com/openshift/client-go v0.0.0-20200326155132-2a6cd50aedd0
27-
github.com/operator-framework/api v0.15.0
27+
github.com/operator-framework/api v0.15.1-0.20220801135701-ae4da2a9ec6a
2828
github.com/operator-framework/operator-registry v1.17.5
2929
github.com/otiai10/copy v1.2.0
3030
github.com/pkg/errors v0.9.1

go.sum

+2-2
Original file line numberDiff line numberDiff line change
@@ -1078,8 +1078,8 @@ github.com/openshift/client-go v0.0.0-20200326155132-2a6cd50aedd0/go.mod h1:uUQ4
10781078
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
10791079
github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
10801080
github.com/operator-framework/api v0.7.1/go.mod h1:L7IvLd/ckxJEJg/t4oTTlnHKAJIP/p51AvEslW3wYdY=
1081-
github.com/operator-framework/api v0.15.0 h1:4f9i0drtqHj7ykLoHxv92GR43S7MmQHhmFQkfm5YaGI=
1082-
github.com/operator-framework/api v0.15.0/go.mod h1:scnY9xqSeCsOdtJtNoHIXd7OtHZ14gj1hkDA4+DlgLY=
1081+
github.com/operator-framework/api v0.15.1-0.20220801135701-ae4da2a9ec6a h1:KrRy9j95k4jHSXkyYUooQdAFju9eeER0izslDBUvcmA=
1082+
github.com/operator-framework/api v0.15.1-0.20220801135701-ae4da2a9ec6a/go.mod h1:kk8xJahHJR3bKqrA+A+1VIrhOTmyV76k+ARv+iV+u1Q=
10831083
github.com/operator-framework/operator-registry v1.17.5 h1:LR8m1rFz5Gcyje8WK6iYt+gIhtzqo52zMRALdmTYHT0=
10841084
github.com/operator-framework/operator-registry v1.17.5/go.mod h1:sRQIgDMZZdUcmHltzyCnM6RUoDF+WS8Arj1BQIARDS8=
10851085
github.com/otiai10/copy v1.2.0 h1:HvG945u96iNadPoG2/Ja2+AUJeW5YuFQMixq9yirC+k=

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

+2-1
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
}

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

+5-1
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

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

+68
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)