Skip to content

Commit 6bc3731

Browse files
authored
fix: support tlsSecret from http.backends in ApisixRoute (#2518)
1 parent 227062d commit 6bc3731

File tree

2 files changed

+101
-27
lines changed

2 files changed

+101
-27
lines changed

internal/controller/apisixroute_controller.go

Lines changed: 44 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,43 @@ func (r *ApisixRouteReconciler) validateSecrets(ctx context.Context, tc *provide
288288
return nil
289289
}
290290

291+
func (r *ApisixRouteReconciler) processExternalNodes(ctx context.Context, tc *provider.TranslateContext, ups apiv2.ApisixUpstream) error {
292+
for _, node := range ups.Spec.ExternalNodes {
293+
if node.Type == apiv2.ExternalTypeService {
294+
var (
295+
service corev1.Service
296+
serviceNN = k8stypes.NamespacedName{Namespace: ups.GetNamespace(), Name: node.Name}
297+
)
298+
if err := r.Get(ctx, serviceNN, &service); err != nil {
299+
r.Log.Error(err, "failed to get service in ApisixUpstream", "ApisixUpstream", ups.Name, "Service", serviceNN)
300+
if client.IgnoreNotFound(err) == nil {
301+
continue
302+
}
303+
return err
304+
}
305+
tc.Services[utils.NamespacedName(&service)] = &service
306+
}
307+
}
308+
return nil
309+
}
310+
311+
func (r *ApisixRouteReconciler) processTLSSecret(ctx context.Context, tc *provider.TranslateContext, ups apiv2.ApisixUpstream, secretNs string) error {
312+
if ups.Spec.TLSSecret != nil && ups.Spec.TLSSecret.Name != "" {
313+
var (
314+
secret corev1.Secret
315+
secretNN = k8stypes.NamespacedName{Namespace: cmp.Or(ups.Spec.TLSSecret.Namespace, secretNs), Name: ups.Spec.TLSSecret.Name}
316+
)
317+
if err := r.Get(ctx, secretNN, &secret); err != nil {
318+
r.Log.Error(err, "failed to get secret in ApisixUpstream", "ApisixUpstream", ups.Name, "Secret", secretNN)
319+
if client.IgnoreNotFound(err) != nil {
320+
return err
321+
}
322+
}
323+
tc.Secrets[secretNN] = &secret
324+
}
325+
return nil
326+
}
327+
291328
func (r *ApisixRouteReconciler) validateBackends(ctx context.Context, tc *provider.TranslateContext, in *apiv2.ApisixRoute, http apiv2.ApisixRouteHTTP) error {
292329
var backends = make(map[k8stypes.NamespacedName]struct{})
293330
for _, backend := range http.Backends {
@@ -324,6 +361,9 @@ func (r *ApisixRouteReconciler) validateBackends(ctx context.Context, tc *provid
324361
}
325362
} else {
326363
tc.Upstreams[serviceNN] = &au
364+
if err := r.processTLSSecret(ctx, tc, au, in.GetNamespace()); err != nil {
365+
return err
366+
}
327367
}
328368

329369
if service.Spec.Type == corev1.ServiceTypeExternalName {
@@ -387,35 +427,12 @@ func (r *ApisixRouteReconciler) validateUpstreams(ctx context.Context, tc *provi
387427
}
388428
tc.Upstreams[upsNN] = &ups
389429

390-
for _, node := range ups.Spec.ExternalNodes {
391-
if node.Type == apiv2.ExternalTypeService {
392-
var (
393-
service corev1.Service
394-
serviceNN = k8stypes.NamespacedName{Namespace: ups.GetNamespace(), Name: node.Name}
395-
)
396-
if err := r.Get(ctx, serviceNN, &service); err != nil {
397-
r.Log.Error(err, "failed to get service in ApisixUpstream", "ApisixUpstream", upsNN, "Service", serviceNN)
398-
if client.IgnoreNotFound(err) == nil {
399-
continue
400-
}
401-
return err
402-
}
403-
tc.Services[utils.NamespacedName(&service)] = &service
404-
}
430+
if err := r.processExternalNodes(ctx, tc, ups); err != nil {
431+
return err
405432
}
406433

407-
if ups.Spec.TLSSecret != nil && ups.Spec.TLSSecret.Name != "" {
408-
var (
409-
secret corev1.Secret
410-
secretNN = k8stypes.NamespacedName{Namespace: cmp.Or(ups.Spec.TLSSecret.Namespace, ar.GetNamespace()), Name: ups.Spec.TLSSecret.Name}
411-
)
412-
if err := r.Get(ctx, secretNN, &secret); err != nil {
413-
r.Log.Error(err, "failed to get secret in ApisixUpstream", "ApisixUpstream", upsNN, "Secret", secretNN)
414-
if client.IgnoreNotFound(err) != nil {
415-
return err
416-
}
417-
}
418-
tc.Secrets[secretNN] = &secret
434+
if err := r.processTLSSecret(ctx, tc, ups, ar.GetNamespace()); err != nil {
435+
return err
419436
}
420437
}
421438

test/e2e/crds/v2/route.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1369,4 +1369,61 @@ spec:
13691369
})
13701370
})
13711371
})
1372+
Context("Test tls secret processed from ApisixUpstream", func() {
1373+
var Cert = strings.TrimSpace(framework.TestServerCert)
1374+
var Key = strings.TrimSpace(framework.TestServerKey)
1375+
createSecret := func(s *scaffold.Scaffold, secretName string) {
1376+
err := s.NewKubeTlsSecret(secretName, Cert, Key)
1377+
assert.Nil(GinkgoT(), err, "create secret error")
1378+
}
1379+
const apisixRouteSpec = `
1380+
apiVersion: apisix.apache.org/v2
1381+
kind: ApisixRoute
1382+
metadata:
1383+
name: default
1384+
namespace: %s
1385+
spec:
1386+
ingressClassName: %s
1387+
http:
1388+
- name: rule0
1389+
match:
1390+
hosts:
1391+
- httpbin
1392+
paths:
1393+
- /*
1394+
backends:
1395+
- serviceName: httpbin-service-e2e-test
1396+
servicePort: 80
1397+
1398+
`
1399+
const apisixUpstreamSpec = `
1400+
apiVersion: apisix.apache.org/v2
1401+
kind: ApisixUpstream
1402+
metadata:
1403+
name: httpbin-service-e2e-test
1404+
namespace: %s
1405+
spec:
1406+
ingressClassName: %s
1407+
tlsSecret:
1408+
name: %s
1409+
namespace: %s
1410+
`
1411+
1412+
It("with matching backend", func() {
1413+
secretName := fmt.Sprintf("test-tls-secret-%s", s.Namespace())
1414+
createSecret(s, secretName)
1415+
By("apply apisixupstream")
1416+
applier.MustApplyAPIv2(types.NamespacedName{Namespace: s.Namespace(), Name: "httpbin-service-e2e-test"},
1417+
new(apiv2.ApisixUpstream), fmt.Sprintf(apisixUpstreamSpec, s.Namespace(), s.Namespace(), secretName, s.Namespace()))
1418+
By("apply apisixroute")
1419+
applier.MustApplyAPIv2(types.NamespacedName{Namespace: s.Namespace(), Name: "default"},
1420+
new(apiv2.ApisixRoute), fmt.Sprintf(apisixRouteSpec, s.Namespace(), s.Namespace()))
1421+
time.Sleep(6 * time.Second)
1422+
services, err := s.DefaultDataplaneResource().Service().List(context.Background())
1423+
Expect(err).ShouldNot(HaveOccurred(), "list services")
1424+
assert.Len(GinkgoT(), services, 1, "there should be one service")
1425+
service := services[0]
1426+
Expect(service.Upstream.TLS).ShouldNot(BeNil(), "check tls in service")
1427+
})
1428+
})
13721429
})

0 commit comments

Comments
 (0)