@@ -18,6 +18,8 @@ package controllers
1818
1919import (
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