@@ -17,6 +17,7 @@ import (
17
17
"encoding/json"
18
18
"encoding/pem"
19
19
"fmt"
20
+ "slices"
20
21
21
22
"github.com/api7/gopkg/pkg/log"
22
23
"github.com/pkg/errors"
@@ -44,6 +45,8 @@ func (t *Translator) TranslateGateway(tctx *provider.TranslateContext, obj *gate
44
45
result .SSL = append (result .SSL , ssl ... )
45
46
}
46
47
}
48
+ result .SSL = mergeSSLWithSameID (result .SSL )
49
+
47
50
rk := provider.ResourceKind {
48
51
Kind : obj .Kind ,
49
52
Namespace : obj .Namespace ,
@@ -117,6 +120,7 @@ func (t *Translator) translateSecret(tctx *provider.TranslateContext, listener g
117
120
sslObj .Snis = append (sslObj .Snis , hosts ... )
118
121
// Note: Dashboard doesn't allow duplicate certificate across ssl objects
119
122
sslObj .ID = id .GenID (string (cert ))
123
+ log .Debugw ("generated ssl id" , zap .String ("ssl id" , sslObj .ID ), zap .String ("secret" , secret .Namespace + "/" + secret .Name ))
120
124
sslObj .Labels = label .GenLabel (obj )
121
125
sslObjs = append (sslObjs , sslObj )
122
126
}
@@ -232,3 +236,47 @@ func (t *Translator) fillPluginMetadataFromGatewayProxy(pluginMetadata adctypes.
232
236
pluginMetadata [pluginName ] = pluginConfig
233
237
}
234
238
}
239
+
240
+ // mergeSSLWithSameID merge ssl with same id
241
+ func mergeSSLWithSameID (sslList []* adctypes.SSL ) []* adctypes.SSL {
242
+ if len (sslList ) <= 1 {
243
+ return sslList
244
+ }
245
+
246
+ // create a map to store ssl with same id
247
+ sslMap := make (map [string ]* adctypes.SSL )
248
+ for _ , ssl := range sslList {
249
+ if existing , exists := sslMap [ssl .ID ]; exists {
250
+ // if ssl with same id exists, merge their snis
251
+ // use map to deduplicate
252
+ sniMap := make (map [string ]struct {})
253
+ // add existing snis
254
+ for _ , sni := range existing .Snis {
255
+ sniMap [sni ] = struct {}{}
256
+ }
257
+ // add new snis
258
+ for _ , sni := range ssl .Snis {
259
+ sniMap [sni ] = struct {}{}
260
+ }
261
+ // rebuild deduplicated snis list
262
+ newSnis := make ([]string , 0 , len (sniMap ))
263
+ for sni := range sniMap {
264
+ newSnis = append (newSnis , sni )
265
+ }
266
+
267
+ slices .Sort (newSnis )
268
+ // update existing ssl object
269
+ existing .Snis = newSnis
270
+ } else {
271
+ slices .Sort (ssl .Snis )
272
+ // if new ssl id, add to map
273
+ sslMap [ssl .ID ] = ssl
274
+ }
275
+ }
276
+
277
+ mergedSSL := make ([]* adctypes.SSL , 0 , len (sslMap ))
278
+ for _ , ssl := range sslMap {
279
+ mergedSSL = append (mergedSSL , ssl )
280
+ }
281
+ return mergedSSL
282
+ }
0 commit comments