diff --git a/upstream/pkg/reconciler/common/testdata/test-add-configurations-statefulset.yaml b/upstream/pkg/reconciler/common/testdata/test-add-configurations-statefulset.yaml new file mode 100644 index 0000000000..f5adf46aec --- /dev/null +++ b/upstream/pkg/reconciler/common/testdata/test-add-configurations-statefulset.yaml @@ -0,0 +1,21 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: tekton-results-postgres +spec: + replicas: 1 + selector: + matchLabels: + app: postgres + serviceName: tekton-results-postgres + template: + metadata: + labels: + app: postgres + spec: + containers: + - image: postgres:14 + name: postgres + ports: + - containerPort: 5432 + name: postgres diff --git a/upstream/pkg/reconciler/common/transformers.go b/upstream/pkg/reconciler/common/transformers.go index 0c89308beb..5f6a7d3bb0 100644 --- a/upstream/pkg/reconciler/common/transformers.go +++ b/upstream/pkg/reconciler/common/transformers.go @@ -674,27 +674,49 @@ func InjectLabelOnNamespace(label string) mf.Transformer { } } +// AddConfiguration propagates NodeSelector, Tolerations and PriorityClassName from +// the component Config onto workload pod templates. It handles both Deployment and +// StatefulSet so that components which run as a StatefulSet natively (e.g. postgres) +// are covered. func AddConfiguration(config v1alpha1.Config) mf.Transformer { + applyConfig := func(spec *corev1.PodSpec) { + spec.NodeSelector = config.NodeSelector + spec.Tolerations = config.Tolerations + spec.PriorityClassName = config.PriorityClassName + } + return func(u *unstructured.Unstructured) error { - if u.GetKind() != "Deployment" { - return nil - } + switch u.GetKind() { + case "Deployment": + d := &appsv1.Deployment{} + err := runtime.DefaultUnstructuredConverter.FromUnstructured(u.Object, d) + if err != nil { + return err + } - d := &appsv1.Deployment{} - err := runtime.DefaultUnstructuredConverter.FromUnstructured(u.Object, d) - if err != nil { - return err - } + applyConfig(&d.Spec.Template.Spec) - d.Spec.Template.Spec.NodeSelector = config.NodeSelector - d.Spec.Template.Spec.Tolerations = config.Tolerations - d.Spec.Template.Spec.PriorityClassName = config.PriorityClassName + unstrObj, err := runtime.DefaultUnstructuredConverter.ToUnstructured(d) + if err != nil { + return err + } + u.SetUnstructuredContent(unstrObj) - unstrObj, err := runtime.DefaultUnstructuredConverter.ToUnstructured(d) - if err != nil { - return err + case "StatefulSet": + s := &appsv1.StatefulSet{} + err := runtime.DefaultUnstructuredConverter.FromUnstructured(u.Object, s) + if err != nil { + return err + } + + applyConfig(&s.Spec.Template.Spec) + + unstrObj, err := runtime.DefaultUnstructuredConverter.ToUnstructured(s) + if err != nil { + return err + } + u.SetUnstructuredContent(unstrObj) } - u.SetUnstructuredContent(unstrObj) return nil } diff --git a/upstream/pkg/reconciler/common/transformers_test.go b/upstream/pkg/reconciler/common/transformers_test.go index de4aad4012..f412e8c503 100644 --- a/upstream/pkg/reconciler/common/transformers_test.go +++ b/upstream/pkg/reconciler/common/transformers_test.go @@ -868,6 +868,38 @@ func TestAddConfiguration(t *testing.T) { assert.Equal(t, d.Spec.Template.Spec.PriorityClassName, config.PriorityClassName) } +func TestAddConfigurationStatefulSet(t *testing.T) { + testData := path.Join("testdata", "test-add-configurations-statefulset.yaml") + manifest, err := mf.ManifestFrom(mf.Recursive(testData)) + assertNoError(t, err) + + config := v1alpha1.Config{ + NodeSelector: map[string]string{ + "node-role.kubernetes.io/infra": "", + }, + Tolerations: []corev1.Toleration{ + { + Key: "node-role.kubernetes.io/infra", + Operator: corev1.TolerationOpExists, + Effect: corev1.TaintEffectNoSchedule, + }, + }, + PriorityClassName: string("system-cluster-critical"), + } + + manifest, err = manifest.Transform(AddConfiguration(config)) + assertNoError(t, err) + + s := &appsv1.StatefulSet{} + err = runtime.DefaultUnstructuredConverter.FromUnstructured(manifest.Resources()[0].Object, s) + assertNoError(t, err) + assert.Equal(t, s.Spec.Template.Spec.NodeSelector["node-role.kubernetes.io/infra"], config.NodeSelector["node-role.kubernetes.io/infra"]) + assert.Equal(t, s.Spec.Template.Spec.Tolerations[0].Key, config.Tolerations[0].Key) + assert.Equal(t, s.Spec.Template.Spec.Tolerations[0].Operator, config.Tolerations[0].Operator) + assert.Equal(t, s.Spec.Template.Spec.Tolerations[0].Effect, config.Tolerations[0].Effect) + assert.Equal(t, s.Spec.Template.Spec.PriorityClassName, config.PriorityClassName) +} + func TestAddPSA(t *testing.T) { testData := path.Join("testdata", "test-add-psa.yaml") manifest, err := mf.ManifestFrom(mf.Recursive(testData))