Skip to content

Commit ec6d7c4

Browse files
committed
update mocks; update tests
1 parent 10d8625 commit ec6d7c4

3 files changed

Lines changed: 127 additions & 29 deletions

File tree

internal/ingress/controller/store/store_test.go

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package store
22

33
import (
4-
"errors"
4+
"fmt"
55
"testing"
66
"time"
77

@@ -144,6 +144,7 @@ func TestGetIngressServiceInfo(t *testing.T) {
144144
}
145145
s.listers.Node.Add(node1)
146146

147+
hostname := "example.com"
147148
serviceName := "test-service"
148149
service := &corev1.Service{
149150
ObjectMeta: metav1.ObjectMeta{
@@ -172,7 +173,7 @@ func TestGetIngressServiceInfo(t *testing.T) {
172173
Spec: networkv1.IngressSpec{
173174
Rules: []networkv1.IngressRule{
174175
{
175-
Host: "example.com",
176+
Host: hostname,
176177
IngressRuleValue: networkv1.IngressRuleValue{
177178
HTTP: &networkv1.HTTPIngressRuleValue{
178179
Paths: []networkv1.HTTPIngressPath{
@@ -193,20 +194,22 @@ func TestGetIngressServiceInfo(t *testing.T) {
193194
},
194195
}
195196

196-
serviceInfo, err := s.GetIngressServiceInfo(ingress)
197+
hostsInfo, err := s.GetIngressHostsInfo(ingress)
197198
g.Expect(err).To(BeNil())
199+
g.Expect(hostsInfo[hostname].Paths).ToNot(BeEmpty())
198200

199-
g.Expect(serviceInfo).To(HaveKey(serviceName))
200-
g.Expect(serviceInfo[serviceName].Hosts).To(ContainElement("example.com"))
201-
g.Expect(serviceInfo[serviceName].NodePort).To(Equal(30000))
202-
g.Expect(serviceInfo[serviceName].NodeIps).To(ConsistOf("192.168.1.1"))
203-
g.Expect(serviceInfo[serviceName].Annotations).To(HaveKeyWithValue("key", "value"))
201+
p := hostsInfo[hostname].Paths[0]
202+
203+
g.Expect(p.Service.Name).To(Equal(serviceName))
204+
g.Expect(p.NodePort).To(Equal(30000))
205+
g.Expect(p.NodeIps).To(ConsistOf("192.168.1.1"))
206+
g.Expect(p.Service.Annotations).To(HaveKeyWithValue("key", "value"))
204207

205208
// check if service doens't have NodePort
206209
service.Spec.Ports[0].NodePort = 0
207210
s.listers.Service.Update(service)
208211

209-
serviceInfo, err = s.GetIngressServiceInfo(ingress)
210-
expectedErr := errors.New("service doesn't have NodePort, only services with type 'NodePort' or 'LoadBalancer' supported")
212+
_, err = s.GetIngressHostsInfo(ingress)
213+
expectedErr := fmt.Errorf("service %s has no NodePort (only NodePort/LoadBalancer supported)", serviceName)
211214
g.Expect(err).To(Equal(expectedErr))
212215
}

internal/mocks/store.go

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/service/loadbalancer/manager_test.go

Lines changed: 107 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)