66 v1 "github.com/api7/api7-ingress-controller/api/dashboard/v1"
77 "github.com/api7/api7-ingress-controller/internal/controlplane/label"
88 "github.com/api7/api7-ingress-controller/pkg/id"
9+ "github.com/api7/gopkg/pkg/log"
910 "github.com/pkg/errors"
1011 corev1 "k8s.io/api/core/v1"
1112 "k8s.io/apimachinery/pkg/types"
@@ -15,36 +16,51 @@ import (
1516func (t * Translator ) TranslateGateway (tctx * TranslateContext , obj * gatewayv1.Gateway ) (* TranslateResult , error ) {
1617 result := & TranslateResult {}
1718 for _ , listener := range obj .Spec .Listeners {
18- tctx .GatewayTLSConfig = append (tctx .GatewayTLSConfig , * listener .TLS )
19- ssl , err := t .translateSecret (tctx , listener , obj )
20- if err != nil {
21- return nil , fmt .Errorf ("failed to translate secret: %w" , err )
19+ if listener .TLS != nil {
20+ tctx .GatewayTLSConfig = append (tctx .GatewayTLSConfig , * listener .TLS )
21+ ssl , err := t .translateSecret (tctx , listener , obj )
22+ if err != nil {
23+ return nil , fmt .Errorf ("failed to translate secret: %w" , err )
24+ }
25+ result .SSL = append (result .SSL , ssl ... )
2226 }
23- result .SSL = append (result .SSL , ssl )
2427 }
2528 return result , nil
2629}
2730
28- func (t * Translator ) translateSecret (tctx * TranslateContext , listener gatewayv1.Listener , obj * gatewayv1.Gateway ) (* v1.Ssl , error ) {
31+ func (t * Translator ) translateSecret (tctx * TranslateContext , listener gatewayv1.Listener , obj * gatewayv1.Gateway ) ([] * v1.Ssl , error ) {
2932 if tctx .Secrets == nil {
3033 return nil , nil
3134 }
32- sslObj := & v1.Ssl {}
33- ns := obj .GetNamespace ()
34- name := obj .GetName ()
35- sslObj .ID = id .GenID (fmt .Sprintf ("%s_%s_%s" , ns , name , listener .Name ))
36- if listener .Hostname != nil && * listener .Hostname != "" {
37- sslObj .Snis = []string {string (* listener .Hostname )}
35+ if listener .TLS .CertificateRefs == nil {
36+ return nil , fmt .Errorf ("no certificateRefs found in listener %s" , listener .Name )
3837 }
39- secret := tctx .Secrets [types.NamespacedName {Namespace : ns , Name : name }]
40- cert , key , err := extractKeyPair (secret , true )
41- if err != nil {
42- return nil , err
38+ sslObjs := make ([]* v1.Ssl , 0 )
39+ ns := obj .GetNamespace ()
40+ gatewayName := obj .GetName ()
41+
42+ for _ , ref := range listener .TLS .CertificateRefs {
43+ sslObj := & v1.Ssl {}
44+ sslObj .ID = id .GenID (fmt .Sprintf ("%s_%s_%s" , ns , gatewayName , listener .Name ))
45+ if listener .Hostname != nil && * listener .Hostname != "" {
46+ sslObj .Snis = []string {string (* listener .Hostname )}
47+ }
48+ name := listener .TLS .CertificateRefs [0 ].Name
49+ secret := tctx .Secrets [types.NamespacedName {Namespace : ns , Name : string (ref .Name )}]
50+ if secret .Data == nil {
51+ log .Error ("secret data is nil" , "secret" , secret )
52+ return nil , fmt .Errorf ("no secret data found for %s/%s" , ns , name )
53+ }
54+ cert , key , err := extractKeyPair (secret , true )
55+ if err != nil {
56+ return nil , err
57+ }
58+ sslObj .Cert = string (cert )
59+ sslObj .Key = string (key )
60+ sslObj .Labels = label .GenLabel (obj )
61+ sslObjs = append (sslObjs , sslObj )
4362 }
44- sslObj .Cert = string (cert )
45- sslObj .Key = string (key )
46- sslObj .Labels = label .GenLabel (obj )
47- return sslObj , nil
63+ return sslObjs , nil
4864}
4965
5066func extractKeyPair (s * corev1.Secret , hasPrivateKey bool ) ([]byte , []byte , error ) {
0 commit comments