Skip to content

Commit f7e2ba1

Browse files
committed
apply suggestion
1 parent df827ab commit f7e2ba1

File tree

5 files changed

+142
-9
lines changed

5 files changed

+142
-9
lines changed
Lines changed: 68 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
package translator
22

33
import (
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
}

pkg/id/idgen.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package id
2+
3+
import (
4+
"fmt"
5+
"hash/crc32"
6+
7+
"github.com/api7/api7-ingress-controller/pkg/utils"
8+
)
9+
10+
// GenID generates an ID according to the raw material.
11+
func GenID(raw string) string {
12+
if raw == "" {
13+
return ""
14+
}
15+
p := utils.String2Byte(raw)
16+
17+
res := crc32.ChecksumIEEE(p)
18+
return fmt.Sprintf("%x", res)
19+
}

pkg/id/idgen_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package id
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
)
8+
9+
func TestGenID(t *testing.T) {
10+
hash := GenID("")
11+
assert.Len(t, hash, 0)
12+
13+
assert.Equal(t, GenID("111"), GenID("111"))
14+
assert.NotEqual(t, GenID("112"), GenID("111"))
15+
}

pkg/utils/s2b.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package utils
2+
3+
import "unsafe"
4+
5+
// s2b converts string to a byte slice without memory allocation.
6+
func String2Byte(s string) []byte {
7+
return unsafe.Slice(unsafe.StringData(s), len(s))
8+
}

pkg/utils/s2b_test.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package utils
2+
3+
import (
4+
"reflect"
5+
"testing"
6+
)
7+
8+
func TestString2Byte(t *testing.T) {
9+
type args struct {
10+
raw string
11+
}
12+
tests := []struct {
13+
name string
14+
args args
15+
wantB []byte
16+
}{
17+
{
18+
name: "test-1",
19+
args: args{
20+
raw: "a",
21+
},
22+
wantB: []byte{'a'},
23+
},
24+
}
25+
for _, tt := range tests {
26+
t.Run(tt.name, func(t *testing.T) {
27+
if gotB := String2Byte(tt.args.raw); !reflect.DeepEqual(gotB, tt.wantB) {
28+
t.Errorf("String2byte() = %v, want %v", gotB, tt.wantB)
29+
}
30+
})
31+
}
32+
}

0 commit comments

Comments
 (0)