99 "testing"
1010 "time"
1111
12+ "github.com/google/uuid"
1213 "github.com/kong/go-kong/kong"
1314 "github.com/kong/kubernetes-testing-framework/pkg/clusters"
1415 "github.com/kong/kubernetes-testing-framework/pkg/utils/kubernetes/generators"
@@ -29,6 +30,7 @@ import (
2930 "github.com/kong/kubernetes-ingress-controller/v3/internal/util"
3031 "github.com/kong/kubernetes-ingress-controller/v3/test"
3132 "github.com/kong/kubernetes-ingress-controller/v3/test/consts"
33+ "github.com/kong/kubernetes-ingress-controller/v3/test/helpers/certificate"
3234 "github.com/kong/kubernetes-ingress-controller/v3/test/internal/helpers"
3335 testutils "github.com/kong/kubernetes-ingress-controller/v3/test/util"
3436)
@@ -51,6 +53,38 @@ func TestTranslationFailures(t *testing.T) {
5153 // that we expect translation failure warning events to be created for.
5254 translationFailureTrigger func (t * testing.T , cleaner * clusters.Cleaner , ns string ) expectedTranslationFailure
5355 }{
56+ {
57+ name : "CA secret with multiple PEMs" ,
58+ translationFailureTrigger : func (t * testing.T , cleaner * clusters.Cleaner , ns string ) expectedTranslationFailure {
59+ createdSecret , err := env .Cluster ().Client ().CoreV1 ().Secrets (ns ).Create (ctx , multiPEMCASecret (ns , uuid .NewString ()), metav1.CreateOptions {})
60+ require .NoError (t , err )
61+ cleaner .Add (createdSecret )
62+
63+ return expectedTranslationFailure {
64+ causingObjects : []client.Object {createdSecret },
65+ reasonContains : "multiple PEM certificates found" ,
66+ }
67+ },
68+ },
69+ {
70+ name : "CA secret with multiple PEMs referred by a plugin" ,
71+ translationFailureTrigger : func (t * testing.T , cleaner * clusters.Cleaner , ns string ) expectedTranslationFailure {
72+ createdSecret , err := env .Cluster ().Client ().CoreV1 ().Secrets (ns ).Create (ctx , multiPEMCASecret (ns , invalidCASecretID ), metav1.CreateOptions {})
73+ require .NoError (t , err )
74+ cleaner .Add (createdSecret )
75+
76+ c , err := clientset .NewForConfig (env .Cluster ().Config ())
77+ require .NoError (t , err )
78+ createdPlugin , err := c .ConfigurationV1 ().KongPlugins (ns ).Create (ctx , pluginUsingInvalidCACert (ns ), metav1.CreateOptions {})
79+ require .NoError (t , err )
80+ cleaner .Add (createdPlugin )
81+
82+ return expectedTranslationFailure {
83+ causingObjects : []client.Object {createdSecret , createdPlugin },
84+ reasonContains : "multiple PEM certificates found" ,
85+ }
86+ },
87+ },
5488 {
5589 name : "invalid CA secret" ,
5690 translationFailureTrigger : func (t * testing.T , cleaner * clusters.Cleaner , ns string ) expectedTranslationFailure {
@@ -363,6 +397,34 @@ func invalidCASecret(ns string) *corev1.Secret {
363397 }
364398}
365399
400+ func multiPEMCASecret (ns , id string ) * corev1.Secret {
401+ ca1 , _ := certificate .MustGenerateCertPEMFormat (
402+ certificate .WithCommonName ("test-ca-1" ),
403+ certificate .WithCATrue (),
404+ )
405+ ca2 , _ := certificate .MustGenerateCertPEMFormat (
406+ certificate .WithCommonName ("test-ca-2" ),
407+ certificate .WithCATrue (),
408+ )
409+
410+ return & corev1.Secret {
411+ ObjectMeta : metav1.ObjectMeta {
412+ Name : testutils .RandomName (testTranslationFailuresObjectsPrefix ),
413+ Namespace : ns ,
414+ Labels : map [string ]string {
415+ "konghq.com/ca-cert" : "true" ,
416+ },
417+ Annotations : map [string ]string {
418+ annotations .IngressClassKey : consts .IngressClass ,
419+ },
420+ },
421+ StringData : map [string ]string {
422+ "id" : id ,
423+ "cert" : string (ca1 ) + string (ca2 ),
424+ },
425+ }
426+ }
427+
366428func pluginUsingInvalidCACert (ns string ) * configurationv1.KongPlugin {
367429 return & configurationv1.KongPlugin {
368430 ObjectMeta : metav1.ObjectMeta {
0 commit comments