11package translator
22
33import (
4+ "fmt"
5+
46 v1 "github.com/api7/api7-ingress-controller/api/dashboard/v1"
5- "github.com/google/uuid"
7+ "github.com/api7/api7-ingress-controller/pkg/id"
8+ "github.com/pkg/errors"
9+ corev1 "k8s.io/api/core/v1"
610 "k8s.io/apimachinery/pkg/types"
711 gatewayv1 "sigs.k8s.io/gateway-api/apis/v1"
812)
@@ -11,22 +15,77 @@ func (t *Translator) TranslateGateway(tctx *TranslateContext, obj *gatewayv1.Gat
1115 result := & TranslateResult {}
1216 for _ , listener := range obj .Spec .Listeners {
1317 tctx .GatewayTLSConfig = append (tctx .GatewayTLSConfig , * listener .TLS )
14- ssl := t .translateSecret (tctx , listener , obj .Name , obj .Namespace )
18+ ssl , err := t .translateSecret (tctx , listener , obj .Name , obj .Namespace )
19+ if err != nil {
20+ return nil , fmt .Errorf ("failed to translate secret: %w" , err )
21+ }
1522 result .SSL = append (result .SSL , ssl )
1623 }
1724 return result , nil
1825}
1926
20- func (t * Translator ) translateSecret (tctx * TranslateContext , listener gatewayv1.Listener , name , ns string ) * v1.Ssl {
27+ func (t * Translator ) translateSecret (tctx * TranslateContext , listener gatewayv1.Listener , name , ns string ) ( * v1.Ssl , error ) {
2128 if tctx .Secrets == nil {
22- return nil
29+ return nil , nil
2330 }
2431 sslObj := & v1.Ssl {}
25- sslObj .ID = uuid .NewString ()
26- sslObj .Cert = string (tctx .Secrets [types.NamespacedName {Namespace : ns , Name : name }].Data ["tls.crt" ])
27- if listener .Hostname != nil {
32+ sslObj .ID = id .GenID (fmt .Sprintf ("%s_%s" , ns , name ))
33+ if listener .Hostname != nil && * listener .Hostname != "" {
2834 sslObj .Snis = []string {string (* listener .Hostname )}
2935 }
30- sslObj .Key = string (tctx .Secrets [types.NamespacedName {Namespace : ns , Name : name }].Data ["tls.key" ])
31- return sslObj
36+ secret := tctx .Secrets [types.NamespacedName {Namespace : ns , Name : name }]
37+ cert , key , err := extractKeyPair (secret , true )
38+ if err != nil {
39+ return nil , err
40+ }
41+ sslObj .Cert = string (cert )
42+ sslObj .Key = string (key )
43+ sslObj .Labels = map [string ]string {
44+ "managed-by" : "api7-ingress-controller" ,
45+ }
46+ return sslObj , nil
47+ }
48+
49+ func extractKeyPair (s * corev1.Secret , hasPrivateKey bool ) ([]byte , []byte , error ) {
50+ if _ , ok := s .Data ["cert" ]; ok {
51+ return extractApisixSecretKeyPair (s , hasPrivateKey )
52+ } else if _ , ok := s .Data [corev1 .TLSCertKey ]; ok {
53+ return extractKubeSecretKeyPair (s , hasPrivateKey )
54+ } else if ca , ok := s .Data [corev1 .ServiceAccountRootCAKey ]; ok && ! hasPrivateKey {
55+ return ca , nil , nil
56+ } else {
57+ return nil , nil , errors .New ("unknown secret format" )
58+ }
59+ }
60+
61+ func extractApisixSecretKeyPair (s * corev1.Secret , hasPrivateKey bool ) (cert []byte , key []byte , err error ) {
62+ var ok bool
63+ cert , ok = s .Data ["cert" ]
64+ if ! ok {
65+ return nil , nil , errors .New ("missing cert field" )
66+ }
67+
68+ if hasPrivateKey {
69+ key , ok = s .Data ["key" ]
70+ if ! ok {
71+ return nil , nil , errors .New ("missing key field" )
72+ }
73+ }
74+ return
75+ }
76+
77+ func extractKubeSecretKeyPair (s * corev1.Secret , hasPrivateKey bool ) (cert []byte , key []byte , err error ) {
78+ var ok bool
79+ cert , ok = s .Data [corev1 .TLSCertKey ]
80+ if ! ok {
81+ return nil , nil , errors .New ("missing cert field" )
82+ }
83+
84+ if hasPrivateKey {
85+ key , ok = s .Data [corev1 .TLSPrivateKeyKey ]
86+ if ! ok {
87+ return nil , nil , errors .New ("missing key field" )
88+ }
89+ }
90+ return
3291}
0 commit comments