Skip to content

Commit 8f948fe

Browse files
committed
check if domain already in use
1 parent 6063103 commit 8f948fe

File tree

1 file changed

+20
-0
lines changed

1 file changed

+20
-0
lines changed

controllers/listener_controller.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ package controllers
1818

1919
import (
2020
"context"
21+
"fmt"
22+
"sort"
2123

2224
"github.com/go-logr/logr"
2325

@@ -114,11 +116,17 @@ func (r *ListenerReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
114116
var chains []*listenerv3.FilterChain
115117
var routeConfigs []*routev3.RouteConfiguration
116118
var errs []error
119+
activeDomains := make(map[string]struct{})
117120
index, err := k8s.IndexCertificateSecrets(ctx, r.Client, instance.Namespace)
118121
if err != nil {
119122
return ctrl.Result{}, errors.Wrap(err, "cannot generate TLS certificates index from Kubernetes secrets")
120123
}
121124

125+
sort.Slice(virtualServices.Items, func(i, j int) bool {
126+
return virtualServices.Items[i].CreationTimestamp.Before(&virtualServices.Items[j].CreationTimestamp)
127+
})
128+
129+
L1:
122130
for _, vs := range virtualServices.Items {
123131
tlsFactory := tls.NewTlsFactory(ctx, vs.Spec.TlsConfig, r.Client, r.DiscoveryClient, r.Config.GetDefaultIssuer(), instance.Namespace, index)
124132
vsFactory := virtualservice.NewVirtualServiceFactory(r.Client, r.Unmarshaler, &vs, instance, *tlsFactory)
@@ -135,6 +143,18 @@ func (r *ListenerReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
135143
continue
136144
}
137145

146+
for _, domain := range virtSvc.VirtualHost.Domains {
147+
_, ok := activeDomains[domain]
148+
if ok {
149+
r.log.Error(nil, "domain already in use", "name:", domain)
150+
if err := vs.SetError(ctx, r.Client, fmt.Sprintf("duplicate domain: %s", domain)); err != nil {
151+
errs = append(errs, err)
152+
}
153+
continue L1
154+
}
155+
activeDomains[domain] = struct{}{}
156+
}
157+
138158
if virtSvc.Tls != nil {
139159
if len(virtSvc.Tls.ErrorDomains) > 0 {
140160
if err := vs.SetDomainsStatus(ctx, r.Client, virtSvc.Tls.ErrorDomains); err != nil {

0 commit comments

Comments
 (0)