@@ -12,6 +12,7 @@ import (
1212 "github.com/serverscom/serverscom-ingress-controller/internal/mocks"
1313 "github.com/serverscom/serverscom-ingress-controller/internal/service/annotations"
1414 "go.uber.org/mock/gomock"
15+ corev1 "k8s.io/api/core/v1"
1516 networkv1 "k8s.io/api/networking/v1"
1617 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1718)
@@ -251,14 +252,59 @@ func TestTranslateIngressToLB(t *testing.T) {
251252 }
252253 sslCerts := map [string ]string {
253254 "example.com" : "ssl-cert-id" ,
255+ "foo.com" : "ssl-cert-foo" ,
254256 }
255257
256- serviceInfo := map [string ]store.ServiceInfo {
257- "service-key" : {
258- Hosts : []string {"example.com" },
259- NodePort : 30000 ,
260- NodeIps : []string {"192.168.1.1" },
261- Annotations : map [string ]string {annotations .LBBalancingAlgorithm : "round-robin" },
258+ hostsInfo := map [string ]store.HostInfo {
259+ "example.com" : {
260+ Paths : []store.PathInfo {
261+ {
262+ Path : "/api" ,
263+ NodePort : 30000 ,
264+ NodeIps : []string {"192.168.1.1" },
265+ Service : & corev1.Service {
266+ ObjectMeta : metav1.ObjectMeta {
267+ Name : "service-key" ,
268+ Annotations : map [string ]string {annotations .LBBalancingAlgorithm : "round-robin" },
269+ },
270+ Spec : corev1.ServiceSpec {
271+ Ports : []corev1.ServicePort {{Port : 80 , NodePort : 30000 }},
272+ },
273+ },
274+ },
275+ {
276+ Path : "/local" ,
277+ NodePort : 30001 ,
278+ NodeIps : []string {"192.168.1.1" },
279+ Service : & corev1.Service {
280+ ObjectMeta : metav1.ObjectMeta {
281+ Name : "service-key2" ,
282+ Annotations : map [string ]string {annotations .LBBalancingAlgorithm : "least-connections" },
283+ },
284+ Spec : corev1.ServiceSpec {
285+ Ports : []corev1.ServicePort {{Port : 81 , NodePort : 30001 }},
286+ },
287+ },
288+ },
289+ },
290+ },
291+ "foo.com" : {
292+ Paths : []store.PathInfo {
293+ {
294+ Path : "/" ,
295+ NodePort : 30002 ,
296+ NodeIps : []string {"192.168.1.2" },
297+ Service : & corev1.Service {
298+ ObjectMeta : metav1.ObjectMeta {
299+ Name : "service-foo" ,
300+ Annotations : map [string ]string {annotations .LBBalancingAlgorithm : "round-robin" },
301+ },
302+ Spec : corev1.ServiceSpec {
303+ Ports : []corev1.ServicePort {{Port : 80 , NodePort : 30002 }},
304+ },
305+ },
306+ },
307+ },
262308 },
263309 }
264310
@@ -271,30 +317,79 @@ func TestTranslateIngressToLB(t *testing.T) {
271317
272318 t .Run ("Translate ingress to lb input successfully" , func (t * testing.T ) {
273319 g := NewWithT (t )
274- storeHandler .EXPECT ().GetIngressServiceInfo (ingress ).Return (serviceInfo , nil )
320+ storeHandler .EXPECT ().GetIngressHostsInfo (ingress ).Return (hostsInfo , nil )
275321 lbInput , err := manager .TranslateIngressToLB (ingress , sslCerts )
276322 g .Expect (err ).To (BeNil ())
277323 g .Expect (lbInput ).NotTo (BeNil ())
278324
325+ g .Expect (lbInput .VHostZones ).To (HaveLen (2 ))
326+
327+ for _ , vz := range lbInput .VHostZones {
328+ expectedID := fmt .Sprintf ("vhost-zone-%s" , vz .Domains [0 ])
329+ g .Expect (vz .ID ).To (Equal (expectedID ))
330+
331+ g .Expect (vz .Domains ).ToNot (BeEmpty ())
332+ g .Expect (vz .LocationZones ).ToNot (BeEmpty ())
333+ g .Expect (vz .SSLCertID ).ToNot (BeEmpty ())
334+
335+ switch vz .Domains [0 ] {
336+ case "example.com" :
337+ g .Expect (vz .SSLCertID ).To (Equal ("ssl-cert-id" ))
338+ g .Expect (vz .LocationZones ).To (HaveLen (2 ))
339+ g .Expect (vz .LocationZones [0 ].Location ).To (Equal ("/api" ))
340+ g .Expect (vz .LocationZones [1 ].Location ).To (Equal ("/local" ))
341+ case "foo.com" :
342+ g .Expect (vz .SSLCertID ).To (Equal ("ssl-cert-foo" ))
343+ g .Expect (vz .LocationZones ).To (HaveLen (1 ))
344+ g .Expect (vz .LocationZones [0 ].Location ).To (Equal ("/" ))
345+ default :
346+ t .Fatalf ("unexpected domain %s" , vz .Domains [0 ])
347+ }
348+ }
349+
350+ expectedAlgorithmMethods := map [string ]string {
351+ "upstream-zone-service-key-30000" : "round-robin" ,
352+ "upstream-zone-service-key2-30001" : "least-connections" ,
353+ "upstream-zone-service-foo-30002" : "round-robin" ,
354+ }
355+
356+ g .Expect (lbInput .UpstreamZones ).To (HaveLen (3 ))
357+ upstreamIDs := make (map [string ]struct {})
358+ for _ , uz := range lbInput .UpstreamZones {
359+ if expected , ok := expectedAlgorithmMethods [uz .ID ]; ok {
360+ g .Expect (uz .Method ).ToNot (BeNil ())
361+ g .Expect (* uz .Method ).To (Equal (expected ))
362+ }
363+ upstreamIDs [uz .ID ] = struct {}{}
364+ for _ , u := range uz .Upstreams {
365+ g .Expect ([]string {"192.168.1.1" , "192.168.1.2" }).To (ContainElement (u .IP ))
366+ g .Expect (u .Weight ).To (Equal (int32 (1 )))
367+ }
368+ }
369+ for _ , host := range hostsInfo {
370+ for _ , p := range host .Paths {
371+ upID := fmt .Sprintf ("upstream-zone-%s-%d" , p .Service .Name , p .NodePort )
372+ _ , exists := upstreamIDs [upID ]
373+ g .Expect (exists ).To (BeTrue (), "upstream %s should exist" , upID )
374+ }
375+ }
376+
279377 expectedLBName := "ingress-a123"
280378 g .Expect (lbInput .Name ).To (Equal (expectedLBName ))
281- g .Expect (lbInput .VHostZones [0 ].Domains ).To (ConsistOf ("example.com" ))
282- g .Expect (lbInput .VHostZones [0 ].SSLCertID ).To (Equal ("ssl-cert-id" ))
283- g .Expect (* lbInput .UpstreamZones [0 ].Method ).To (Equal ("round-robin" ))
284379 g .Expect (* lbInput .Geoip ).To (Equal (true ))
285380 })
286381
287382 t .Run ("Services info fails" , func (t * testing.T ) {
288383 g := NewWithT (t )
289- storeHandler .EXPECT ().GetIngressServiceInfo (ingress ).Return (nil , errors .New ("error" ))
384+ storeHandler .EXPECT ().GetIngressHostsInfo (ingress ).Return (nil , errors .New ("error" ))
290385 lbInput , err := manager .TranslateIngressToLB (ingress , sslCerts )
291386 g .Expect (err ).To (HaveOccurred ())
292387 g .Expect (lbInput ).To (BeNil ())
293388 })
294389
295390 t .Run ("Services info is empty" , func (t * testing.T ) {
296391 g := NewWithT (t )
297- storeHandler .EXPECT ().GetIngressServiceInfo (ingress ).Return (make (map [string ]store.ServiceInfo ), nil )
392+ storeHandler .EXPECT ().GetIngressHostsInfo (ingress ).Return (make (map [string ]store.HostInfo ), nil )
298393 lbInput , err := manager .TranslateIngressToLB (ingress , sslCerts )
299394 expectedErr := errors .New ("vhost or upstream can't be empty, can't continue" )
300395 g .Expect (err ).To (Equal (expectedErr ))
0 commit comments