Skip to content

Commit 95d83d5

Browse files
committed
allow multiple listener referencing same cert
1 parent d98d7a1 commit 95d83d5

File tree

3 files changed

+48
-16
lines changed

3 files changed

+48
-16
lines changed

internal/controlplane/controlplane.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,16 @@ func (d *dashboardClient) Update(ctx context.Context, tctx *translator.Translate
6868
}
6969
}
7070
for _, ssl := range result.SSL {
71-
if _, err := d.c.Cluster(name).SSL().Update(ctx, ssl); err != nil {
72-
return err
71+
oldssl, err := d.c.Cluster(name).SSL().Get(ctx, ssl.Cert)
72+
if err != nil || oldssl == nil {
73+
if _, err := d.c.Cluster(name).SSL().Create(ctx, ssl); err != nil {
74+
return err
75+
}
76+
} else {
77+
ssl.Snis = append(ssl.Snis, oldssl.Snis...)
78+
if _, err := d.c.Cluster(name).SSL().Update(ctx, ssl); err != nil {
79+
return err
80+
}
7381
}
7482
}
7583
return nil

internal/controlplane/translator/gateway.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import (
55

66
v1 "github.com/api7/api7-ingress-controller/api/dashboard/v1"
77
"github.com/api7/api7-ingress-controller/internal/controlplane/label"
8-
"github.com/api7/api7-ingress-controller/pkg/id"
8+
"github.com/api7/api7-ingress-controller/internal/id"
99
"github.com/api7/gopkg/pkg/log"
1010
"github.com/pkg/errors"
1111
corev1 "k8s.io/api/core/v1"
@@ -36,7 +36,6 @@ func (t *Translator) translateSecret(tctx *TranslateContext, listener gatewayv1.
3636
return nil, fmt.Errorf("no certificateRefs found in listener %s", listener.Name)
3737
}
3838
sslObjs := make([]*v1.Ssl, 0)
39-
gatewayName := obj.GetName()
4039
switch *listener.TLS.Mode {
4140
case gatewayv1.TLSModeTerminate:
4241
for _, ref := range listener.TLS.CertificateRefs {
@@ -45,7 +44,6 @@ func (t *Translator) translateSecret(tctx *TranslateContext, listener gatewayv1.
4544
ns = string(*ref.Namespace)
4645
}
4746
sslObj := &v1.Ssl{}
48-
sslObj.ID = id.GenID(fmt.Sprintf("%s_%s_%s", ns, gatewayName, listener.Name))
4947
sslObj.Snis = []string{}
5048
if listener.Hostname != nil && *listener.Hostname != "" {
5149
sslObj.Snis = append(sslObj.Snis, string(*listener.Hostname))
@@ -62,6 +60,8 @@ func (t *Translator) translateSecret(tctx *TranslateContext, listener gatewayv1.
6260
}
6361
sslObj.Cert = string(cert)
6462
sslObj.Key = string(key)
63+
//Note: Dashboard doesn't allow duplicate certificate across ssl objects
64+
sslObj.ID = id.GenID(sslObj.Cert)
6565
sslObj.Labels = label.GenLabel(obj)
6666
sslObjs = append(sslObjs, sslObj)
6767
}

test/e2e/gatewayapi/gateway.go

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -227,9 +227,18 @@ spec:
227227
assert.Len(GinkgoT(), tls, 1, "tls number not expect")
228228
assert.Equal(GinkgoT(), Cert, tls[0].Cert, "tls cert not expect")
229229
assert.Equal(GinkgoT(), []string{host}, tls[0].Snis)
230+
231+
By("Delete Gateway")
232+
err = s.DeleteResource("Gateway", "api7ee")
233+
Expect(err).NotTo(HaveOccurred(), "deleting Gateway")
234+
time.Sleep(5 * time.Second)
235+
236+
tls, err = s.DefaultDataplaneResource().SSL().List(context.Background())
237+
assert.Nil(GinkgoT(), err, "list tls error")
238+
assert.Len(GinkgoT(), tls, 0, "tls number not expect")
230239
})
231240

232-
Context("Gateway SSL without hostname", func() {
241+
Context("Gateway SSL with and without hostname", func() {
233242
It("Check if SSL resource was created", func() {
234243
secretName := _secretName
235244
createSecret(s, secretName)
@@ -246,19 +255,34 @@ spec:
246255
apiVersion: gateway.networking.k8s.io/v1
247256
kind: Gateway
248257
metadata:
249-
name: api7ee
258+
name: same-namespace-with-https-listener
250259
spec:
251260
gatewayClassName: api7
252261
listeners:
253-
- name: http1
254-
protocol: HTTPS
255-
port: 443
256-
tls:
257-
certificateRefs:
258-
- kind: Secret
259-
group: ""
260-
name: %s
261-
`, secretName)
262+
- name: https
263+
port: 443
264+
protocol: HTTPS
265+
allowedRoutes:
266+
namespaces:
267+
from: Same
268+
tls:
269+
certificateRefs:
270+
- group: ""
271+
kind: Secret
272+
name: %s
273+
- name: https-with-hostname
274+
port: 443
275+
hostname: api6.com
276+
protocol: HTTPS
277+
allowedRoutes:
278+
namespaces:
279+
from: Same
280+
tls:
281+
certificateRefs:
282+
- group: ""
283+
kind: Secret
284+
name: %s
285+
`, secretName, secretName)
262286
By("create GatewayClass")
263287
err := s.CreateResourceFromStringWithNamespace(defaultGatewayClass, "")
264288
Expect(err).NotTo(HaveOccurred(), "creating GatewayClass")

0 commit comments

Comments
 (0)