Skip to content

Commit d43fca7

Browse files
jkhelilcursoragent
authored andcommitted
feat(tls): inject TLS env vars into triggers core interceptors
Extend the OpenShift TLS profile injection to also cover the tekton-triggers-core-interceptors Deployment, in addition to the existing tekton-triggers-webhook target. Both deployments now receive TLS_MIN_VERSION, TLS_CIPHER_SUITES, and TLS_CURVE_PREFERENCES from the centrally resolved APIServer TLS profile, ensuring cluster-wide PQC-readiness policy is enforced consistently across all Triggers components (SRVKP-9615). Container name confirmed from the live cluster: tekton-triggers-core-interceptors (openshift-pipelines namespace) Signed-off-by: Jawed khelil <jkhelil@redhat.com> Assisted-by: Claude Sonnet 4.6 (via Cursor) Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent a9c8470 commit d43fca7

2 files changed

Lines changed: 111 additions & 10 deletions

File tree

pkg/reconciler/openshift/tektontrigger/extension.go

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ import (
3232
const (
3333
tektonTriggersWebhookDeployment = "tekton-triggers-webhook"
3434
webhookContainerName = "webhook"
35+
tektonTriggersCoreInterceptors = "tekton-triggers-core-interceptors"
36+
coreInterceptorsContainerName = "tekton-triggers-core-interceptors"
3537
)
3638

3739
// triggersProperties holds fields for configuring runAsUser and runAsGroup.
@@ -70,10 +72,15 @@ func (oe *openshiftExtension) Transformers(comp v1alpha1.TektonComponent) []mf.T
7072
replaceDeploymentArgs("-el-events", "enable"),
7173
}
7274

73-
// Inject APIServer TLS profile env vars into the webhook so that it applies
74-
// the cluster-wide TLS version and cipher suite policy (PQC readiness).
75+
// Inject APIServer TLS profile env vars into the webhook and core interceptors
76+
// so that both apply the cluster-wide TLS version and cipher suite policy (PQC readiness).
7577
if oe.resolvedTLSConfig != nil {
76-
trns = append(trns, occommon.InjectTLSEnvVars(oe.resolvedTLSConfig, "Deployment", tektonTriggersWebhookDeployment, []string{webhookContainerName}))
78+
trns = append(trns,
79+
// tekton-triggers-webhook uses the Knative webhook framework which reads WEBHOOK_TLS_* env vars.
80+
occommon.InjectTLSEnvVars(oe.resolvedTLSConfig, "Deployment", tektonTriggersWebhookDeployment, []string{webhookContainerName}, occommon.WebhookEnvVarPrefix),
81+
// tekton-triggers-core-interceptors uses its own tlsconfig.LoadFromEnv() which reads TLS_* env vars directly (no prefix).
82+
occommon.InjectTLSEnvVars(oe.resolvedTLSConfig, "Deployment", tektonTriggersCoreInterceptors, []string{coreInterceptorsContainerName}, ""),
83+
)
7784
}
7885

7986
return trns
@@ -88,7 +95,7 @@ func (oe *openshiftExtension) PreReconcile(ctx context.Context, tc v1alpha1.Tekt
8895
}
8996
oe.resolvedTLSConfig = resolvedTLS
9097
if oe.resolvedTLSConfig != nil {
91-
logger.Infof("Injecting central TLS config into triggers webhook: MinVersion=%s", oe.resolvedTLSConfig.MinVersion)
98+
logger.Infof("Injecting central TLS config into triggers webhook and core interceptors: MinVersion=%s", oe.resolvedTLSConfig.MinVersion)
9299
}
93100

94101
return nil

pkg/reconciler/openshift/tektontrigger/extension_test.go

Lines changed: 100 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,20 +29,20 @@ import (
2929
"k8s.io/apimachinery/pkg/runtime"
3030
)
3131

32-
// makeTriggersWebhookDeployment returns an unstructured triggers webhook Deployment for transformer tests.
33-
func makeTriggersWebhookDeployment(t *testing.T) unstructured.Unstructured {
32+
// makeDeployment returns an unstructured Deployment with the given name and container name.
33+
func makeDeployment(t *testing.T, deploymentName, containerName string) unstructured.Unstructured {
3434
t.Helper()
3535

3636
d := &appsv1.Deployment{
3737
ObjectMeta: metav1.ObjectMeta{
38-
Name: tektonTriggersWebhookDeployment,
38+
Name: deploymentName,
3939
Namespace: "openshift-pipelines",
4040
},
4141
Spec: appsv1.DeploymentSpec{
4242
Template: corev1.PodTemplateSpec{
4343
Spec: corev1.PodSpec{
4444
Containers: []corev1.Container{
45-
{Name: webhookContainerName},
45+
{Name: containerName},
4646
},
4747
},
4848
},
@@ -58,6 +58,16 @@ func makeTriggersWebhookDeployment(t *testing.T) unstructured.Unstructured {
5858
return u
5959
}
6060

61+
// makeTriggersWebhookDeployment returns an unstructured triggers webhook Deployment for transformer tests.
62+
func makeTriggersWebhookDeployment(t *testing.T) unstructured.Unstructured {
63+
return makeDeployment(t, tektonTriggersWebhookDeployment, webhookContainerName)
64+
}
65+
66+
// makeCoreInterceptorsDeployment returns an unstructured core interceptors Deployment for transformer tests.
67+
func makeCoreInterceptorsDeployment(t *testing.T) unstructured.Unstructured {
68+
return makeDeployment(t, tektonTriggersCoreInterceptors, coreInterceptorsContainerName)
69+
}
70+
6171
func TestTriggersTransformers_NoTLSConfig(t *testing.T) {
6272
ext := &openshiftExtension{
6373
resolvedTLSConfig: nil,
@@ -85,7 +95,8 @@ func TestTriggersTransformers_NoTLSConfig(t *testing.T) {
8595
continue
8696
}
8797
for _, e := range c.Env {
88-
if e.Name == occommon.TLSMinVersionEnvVar || e.Name == occommon.TLSCipherSuitesEnvVar {
98+
if e.Name == occommon.WebhookEnvVarPrefix+occommon.TLSMinVersionEnvVar ||
99+
e.Name == occommon.WebhookEnvVarPrefix+occommon.TLSCipherSuitesEnvVar {
89100
t.Errorf("unexpected TLS env var %s set when resolvedTLSConfig is nil", e.Name)
90101
}
91102
}
@@ -129,6 +140,54 @@ func TestTriggersTransformers_WithTLSConfig_InjectsEnvVarsIntoWebhook(t *testing
129140
}
130141
}
131142

143+
webhookMinVersion := occommon.WebhookEnvVarPrefix + occommon.TLSMinVersionEnvVar
144+
webhookCipherSuites := occommon.WebhookEnvVarPrefix + occommon.TLSCipherSuitesEnvVar
145+
146+
if got := envMap[webhookMinVersion]; got != tlsConfig.MinVersion {
147+
t.Errorf("%s = %q, want %q", webhookMinVersion, got, tlsConfig.MinVersion)
148+
}
149+
if got := envMap[webhookCipherSuites]; got != tlsConfig.CipherSuites {
150+
t.Errorf("%s = %q, want %q", webhookCipherSuites, got, tlsConfig.CipherSuites)
151+
}
152+
}
153+
154+
func TestTriggersTransformers_WithTLSConfig_InjectsEnvVarsIntoCoreInterceptors(t *testing.T) {
155+
tlsConfig := &occommon.TLSEnvVars{
156+
MinVersion: "1.2",
157+
CipherSuites: "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_AES_128_GCM_SHA256",
158+
}
159+
ext := &openshiftExtension{
160+
resolvedTLSConfig: tlsConfig,
161+
}
162+
163+
transformers := ext.Transformers(&v1alpha1.TektonTrigger{})
164+
165+
u := makeCoreInterceptorsDeployment(t)
166+
manifest, err := mf.ManifestFrom(mf.Slice([]unstructured.Unstructured{u}))
167+
if err != nil {
168+
t.Fatalf("failed to build manifest: %v", err)
169+
}
170+
171+
transformed, err := manifest.Transform(transformers...)
172+
if err != nil {
173+
t.Fatalf("transform failed: %v", err)
174+
}
175+
176+
d := &appsv1.Deployment{}
177+
if err := runtime.DefaultUnstructuredConverter.FromUnstructured(transformed.Resources()[0].Object, d); err != nil {
178+
t.Fatalf("failed to convert back: %v", err)
179+
}
180+
181+
envMap := map[string]string{}
182+
for _, c := range d.Spec.Template.Spec.Containers {
183+
if c.Name != coreInterceptorsContainerName {
184+
continue
185+
}
186+
for _, e := range c.Env {
187+
envMap[e.Name] = e.Value
188+
}
189+
}
190+
132191
if got := envMap[occommon.TLSMinVersionEnvVar]; got != tlsConfig.MinVersion {
133192
t.Errorf("%s = %q, want %q", occommon.TLSMinVersionEnvVar, got, tlsConfig.MinVersion)
134193
}
@@ -137,6 +196,39 @@ func TestTriggersTransformers_WithTLSConfig_InjectsEnvVarsIntoWebhook(t *testing
137196
}
138197
}
139198

199+
func TestTriggersTransformers_NoTLSConfig_DoesNotInjectIntoCoreInterceptors(t *testing.T) {
200+
ext := &openshiftExtension{
201+
resolvedTLSConfig: nil,
202+
}
203+
204+
transformers := ext.Transformers(&v1alpha1.TektonTrigger{})
205+
206+
u := makeCoreInterceptorsDeployment(t)
207+
manifest, err := mf.ManifestFrom(mf.Slice([]unstructured.Unstructured{u}))
208+
if err != nil {
209+
t.Fatalf("failed to build manifest: %v", err)
210+
}
211+
212+
transformed, err := manifest.Transform(transformers...)
213+
if err != nil {
214+
t.Fatalf("transform failed: %v", err)
215+
}
216+
217+
d := &appsv1.Deployment{}
218+
if err := runtime.DefaultUnstructuredConverter.FromUnstructured(transformed.Resources()[0].Object, d); err != nil {
219+
t.Fatalf("failed to convert back: %v", err)
220+
}
221+
for _, c := range d.Spec.Template.Spec.Containers {
222+
for _, e := range c.Env {
223+
if e.Name == occommon.TLSMinVersionEnvVar || e.Name == occommon.TLSCipherSuitesEnvVar ||
224+
e.Name == occommon.WebhookEnvVarPrefix+occommon.TLSMinVersionEnvVar ||
225+
e.Name == occommon.WebhookEnvVarPrefix+occommon.TLSCipherSuitesEnvVar {
226+
t.Errorf("unexpected TLS env var %s set when resolvedTLSConfig is nil", e.Name)
227+
}
228+
}
229+
}
230+
}
231+
140232
func TestTriggersTransformers_WithTLSConfig_DoesNotInjectIntoOtherDeployments(t *testing.T) {
141233
tlsConfig := &occommon.TLSEnvVars{
142234
MinVersion: "1.3",
@@ -189,7 +281,9 @@ func TestTriggersTransformers_WithTLSConfig_DoesNotInjectIntoOtherDeployments(t
189281

190282
for _, c := range result.Spec.Template.Spec.Containers {
191283
for _, e := range c.Env {
192-
if e.Name == occommon.TLSMinVersionEnvVar || e.Name == occommon.TLSCipherSuitesEnvVar {
284+
if e.Name == occommon.TLSMinVersionEnvVar || e.Name == occommon.TLSCipherSuitesEnvVar ||
285+
e.Name == occommon.WebhookEnvVarPrefix+occommon.TLSMinVersionEnvVar ||
286+
e.Name == occommon.WebhookEnvVarPrefix+occommon.TLSCipherSuitesEnvVar {
193287
t.Errorf("unexpected TLS env var %s injected into non-webhook deployment", e.Name)
194288
}
195289
}

0 commit comments

Comments
 (0)