Skip to content

Commit 4a27943

Browse files
chore(source/istio): added missing tests (#5715)
Signed-off-by: ivan katliarchuk <[email protected]>
1 parent 9fc01b2 commit 4a27943

File tree

3 files changed

+288
-9
lines changed

3 files changed

+288
-9
lines changed

source/endpoints_test.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,55 @@ func TestEndpointTargetsFromServices(t *testing.T) {
239239
selector: map[string]string{"app": "nginx"},
240240
expected: endpoint.Targets{},
241241
},
242+
{
243+
name: "multiple selectors",
244+
services: []*corev1.Service{
245+
{
246+
ObjectMeta: metav1.ObjectMeta{
247+
Name: "fake",
248+
Namespace: "default",
249+
},
250+
Spec: corev1.ServiceSpec{
251+
Selector: map[string]string{"app": "apache", "version": "v1"},
252+
ExternalIPs: []string{"158.123.32.23"},
253+
},
254+
},
255+
},
256+
namespace: "default",
257+
selector: map[string]string{"version": "v1"},
258+
expected: endpoint.Targets{"158.123.32.23"},
259+
},
260+
{
261+
name: "complex selectors",
262+
services: []*corev1.Service{
263+
{
264+
ObjectMeta: metav1.ObjectMeta{
265+
Name: "fake",
266+
Namespace: "default",
267+
},
268+
Spec: corev1.ServiceSpec{
269+
Selector: map[string]string{
270+
"app": "demo",
271+
"env": "prod",
272+
"team": "devops",
273+
"version": "v1",
274+
"release": "stable",
275+
"track": "daily",
276+
"tier": "backend",
277+
},
278+
ExternalIPs: []string{"158.123.32.23"},
279+
},
280+
},
281+
},
282+
namespace: "default",
283+
selector: map[string]string{
284+
"version": "v1",
285+
"release": "stable",
286+
"tier": "backend",
287+
"app": "demo",
288+
},
289+
expected: endpoint.Targets{"158.123.32.23"},
290+
},
242291
}
243292

244293
for _, tt := range tests {

source/istio_gateway_test.go

Lines changed: 119 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ import (
2424
"github.com/stretchr/testify/assert"
2525
"github.com/stretchr/testify/require"
2626
"github.com/stretchr/testify/suite"
27-
networkingv1alpha3api "istio.io/api/networking/v1beta1"
28-
networkingv1alpha3 "istio.io/client-go/pkg/apis/networking/v1beta1"
27+
istionetworking "istio.io/api/networking/v1beta1"
28+
networkingv1beta1 "istio.io/client-go/pkg/apis/networking/v1beta1"
2929
istiofake "istio.io/client-go/pkg/clientset/versioned/fake"
3030
v1 "k8s.io/api/core/v1"
3131
networkv1 "k8s.io/api/networking/v1"
@@ -1477,7 +1477,7 @@ func testGatewayEndpoints(t *testing.T) {
14771477
t.Run(ti.title, func(t *testing.T) {
14781478
t.Parallel()
14791479

1480-
fakeKubernetesClient := fake.NewSimpleClientset()
1480+
fakeKubernetesClient := fake.NewClientset()
14811481

14821482
for _, lb := range ti.lbServices {
14831483
service := lb.Service()
@@ -1522,9 +1522,119 @@ func testGatewayEndpoints(t *testing.T) {
15221522
}
15231523
}
15241524

1525+
func TestGatewaySource_GWSelectorMatchServiceSelector(t *testing.T) {
1526+
svc := &v1.Service{
1527+
ObjectMeta: metav1.ObjectMeta{
1528+
Name: "fake-service",
1529+
Namespace: "default",
1530+
},
1531+
Spec: v1.ServiceSpec{
1532+
Selector: map[string]string{
1533+
"app": "demo",
1534+
"env": "prod",
1535+
"team": "devops",
1536+
"version": "v1",
1537+
"release": "stable",
1538+
"track": "daily",
1539+
"tier": "backend",
1540+
},
1541+
ExternalIPs: []string{"10.10.10.255"},
1542+
},
1543+
}
1544+
1545+
tests := []struct {
1546+
name string
1547+
selectors map[string]string
1548+
expected []*endpoint.Endpoint
1549+
}{
1550+
{
1551+
name: "gw single selector match with single service selector",
1552+
selectors: map[string]string{
1553+
"version": "v1",
1554+
},
1555+
expected: []*endpoint.Endpoint{
1556+
endpoint.NewEndpoint("example.org", endpoint.RecordTypeA, "10.10.10.255").WithLabel("resource", "gateway/default/fake-gateway"),
1557+
},
1558+
},
1559+
{
1560+
name: "gw selector match all service selectors",
1561+
selectors: map[string]string{
1562+
"app": "demo",
1563+
"env": "prod",
1564+
"team": "devops",
1565+
"version": "v1",
1566+
"release": "stable",
1567+
"track": "daily",
1568+
"tier": "backend",
1569+
},
1570+
expected: []*endpoint.Endpoint{
1571+
endpoint.NewEndpoint("example.org", endpoint.RecordTypeA, "10.10.10.255").WithLabel("resource", "gateway/default/fake-gateway"),
1572+
},
1573+
},
1574+
{
1575+
name: "gw selector has subset of service selectors",
1576+
selectors: map[string]string{
1577+
"version": "v1",
1578+
"release": "stable",
1579+
"tier": "backend",
1580+
"app": "demo",
1581+
},
1582+
expected: []*endpoint.Endpoint{
1583+
endpoint.NewEndpoint("example.org", endpoint.RecordTypeA, "10.10.10.255").WithLabel("resource", "gateway/default/fake-gateway"),
1584+
},
1585+
},
1586+
}
1587+
1588+
for _, tt := range tests {
1589+
t.Run(tt.name, func(t *testing.T) {
1590+
fakeKubeClient := fake.NewClientset()
1591+
fakeIstioClient := istiofake.NewSimpleClientset()
1592+
1593+
src, err := NewIstioGatewaySource(
1594+
t.Context(),
1595+
fakeKubeClient,
1596+
fakeIstioClient,
1597+
"",
1598+
"",
1599+
"",
1600+
false,
1601+
false,
1602+
)
1603+
require.NoError(t, err)
1604+
require.NotNil(t, src)
1605+
1606+
_, err = fakeKubeClient.CoreV1().Services(svc.Namespace).Create(t.Context(), svc, metav1.CreateOptions{})
1607+
require.NoError(t, err)
1608+
1609+
gw := &networkingv1beta1.Gateway{
1610+
ObjectMeta: metav1.ObjectMeta{
1611+
Name: "fake-gateway",
1612+
Namespace: "default",
1613+
},
1614+
Spec: istionetworking.Gateway{
1615+
Servers: []*istionetworking.Server{
1616+
{
1617+
Hosts: []string{"example.org"},
1618+
},
1619+
},
1620+
Selector: tt.selectors,
1621+
},
1622+
}
1623+
1624+
_, err = fakeIstioClient.NetworkingV1beta1().Gateways(gw.Namespace).Create(context.Background(), gw, metav1.CreateOptions{})
1625+
require.NoError(t, err)
1626+
1627+
res, err := src.Endpoints(t.Context())
1628+
require.NoError(t, err)
1629+
1630+
validateEndpoints(t, res, tt.expected)
1631+
})
1632+
}
1633+
}
1634+
15251635
// gateway specific helper functions
15261636
func newTestGatewaySource(loadBalancerList []fakeIngressGatewayService, ingressList []fakeIngress) (*gatewaySource, error) {
1527-
fakeKubernetesClient := fake.NewSimpleClientset()
1637+
fakeKubernetesClient := fake.NewClientset()
15281638
fakeIstioClient := istiofake.NewSimpleClientset()
15291639

15301640
for _, lb := range loadBalancerList {
@@ -1612,22 +1722,22 @@ type fakeGatewayConfig struct {
16121722
selector map[string]string
16131723
}
16141724

1615-
func (c fakeGatewayConfig) Config() *networkingv1alpha3.Gateway {
1616-
gw := &networkingv1alpha3.Gateway{
1725+
func (c fakeGatewayConfig) Config() *networkingv1beta1.Gateway {
1726+
gw := &networkingv1beta1.Gateway{
16171727
ObjectMeta: metav1.ObjectMeta{
16181728
Name: c.name,
16191729
Namespace: c.namespace,
16201730
Annotations: c.annotations,
16211731
},
1622-
Spec: networkingv1alpha3api.Gateway{
1732+
Spec: istionetworking.Gateway{
16231733
Servers: nil,
16241734
Selector: c.selector,
16251735
},
16261736
}
16271737

1628-
var servers []*networkingv1alpha3api.Server
1738+
var servers []*istionetworking.Server
16291739
for _, dnsnames := range c.dnsnames {
1630-
servers = append(servers, &networkingv1alpha3api.Server{
1740+
servers = append(servers, &istionetworking.Server{
16311741
Hosts: dnsnames,
16321742
})
16331743
}

source/istio_virtualservice_test.go

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2212,3 +2212,123 @@ func TestVirtualServiceSourceGetGateway(t *testing.T) {
22122212
})
22132213
}
22142214
}
2215+
2216+
func TestGatewaySource_GWVServiceSelectorMatchServiceSelector(t *testing.T) {
2217+
svc := &v1.Service{
2218+
ObjectMeta: metav1.ObjectMeta{
2219+
Name: "fake-service",
2220+
Namespace: "default",
2221+
},
2222+
Spec: v1.ServiceSpec{
2223+
Selector: map[string]string{
2224+
"app": "demo",
2225+
"env": "prod",
2226+
"team": "devops",
2227+
"version": "v1",
2228+
"release": "stable",
2229+
"track": "daily",
2230+
"tier": "backend",
2231+
},
2232+
ExternalIPs: []string{"10.10.10.255"},
2233+
},
2234+
}
2235+
2236+
tests := []struct {
2237+
name string
2238+
selectors map[string]string
2239+
expected []*endpoint.Endpoint
2240+
}{
2241+
{
2242+
name: "gw single selector match with single service selector",
2243+
selectors: map[string]string{
2244+
"version": "v1",
2245+
},
2246+
expected: []*endpoint.Endpoint{
2247+
endpoint.NewEndpoint("example.org", endpoint.RecordTypeA, "10.10.10.255").WithLabel("resource", "gateway/default/fake-gateway"),
2248+
},
2249+
},
2250+
{
2251+
name: "gw selector match all service selectors",
2252+
selectors: map[string]string{
2253+
"app": "demo",
2254+
"env": "prod",
2255+
"team": "devops",
2256+
"version": "v1",
2257+
"release": "stable",
2258+
"track": "daily",
2259+
"tier": "backend",
2260+
},
2261+
expected: []*endpoint.Endpoint{
2262+
endpoint.NewEndpoint("example.org", endpoint.RecordTypeA, "10.10.10.255").WithLabel("resource", "gateway/default/fake-gateway"),
2263+
},
2264+
},
2265+
{
2266+
name: "gw selector has subset of service selectors",
2267+
selectors: map[string]string{
2268+
"version": "v1",
2269+
"release": "stable",
2270+
"tier": "backend",
2271+
"app": "demo",
2272+
},
2273+
expected: []*endpoint.Endpoint{
2274+
endpoint.NewEndpoint("example.org", endpoint.RecordTypeA, "10.10.10.255").WithLabel("resource", "gateway/default/fake-gateway"),
2275+
},
2276+
},
2277+
}
2278+
for _, tt := range tests {
2279+
t.Run(tt.name, func(t *testing.T) {
2280+
fakeKubeClient := fake.NewClientset()
2281+
fakeIstioClient := istiofake.NewSimpleClientset()
2282+
2283+
src, err := NewIstioGatewaySource(
2284+
t.Context(),
2285+
fakeKubeClient,
2286+
fakeIstioClient,
2287+
"",
2288+
"",
2289+
"",
2290+
false,
2291+
false,
2292+
)
2293+
require.NoError(t, err)
2294+
require.NotNil(t, src)
2295+
2296+
_, err = fakeKubeClient.CoreV1().Services(svc.Namespace).Create(context.Background(), svc, metav1.CreateOptions{})
2297+
require.NoError(t, err)
2298+
2299+
gw := &networkingv1beta1.Gateway{
2300+
ObjectMeta: metav1.ObjectMeta{
2301+
Name: "fake-gateway",
2302+
Namespace: "default",
2303+
},
2304+
Spec: istionetworking.Gateway{
2305+
Servers: []*istionetworking.Server{
2306+
{
2307+
Hosts: []string{"example.org"},
2308+
},
2309+
},
2310+
Selector: tt.selectors,
2311+
},
2312+
}
2313+
2314+
_, err = fakeIstioClient.NetworkingV1beta1().Gateways(gw.Namespace).Create(context.Background(), gw, metav1.CreateOptions{})
2315+
require.NoError(t, err)
2316+
2317+
gwService := &networkingv1beta1.VirtualService{
2318+
ObjectMeta: metav1.ObjectMeta{Name: "foo", Namespace: "default"},
2319+
Spec: istionetworking.VirtualService{
2320+
Gateways: []string{gw.Namespace + "/" + gw.Name},
2321+
Hosts: []string{"example.org"},
2322+
ExportTo: []string{"*"},
2323+
},
2324+
}
2325+
_, err = fakeIstioClient.NetworkingV1beta1().VirtualServices(gwService.Namespace).Create(t.Context(), gwService, metav1.CreateOptions{})
2326+
require.NoError(t, err)
2327+
2328+
res, err := src.Endpoints(t.Context())
2329+
require.NoError(t, err)
2330+
2331+
validateEndpoints(t, res, tt.expected)
2332+
})
2333+
}
2334+
}

0 commit comments

Comments
 (0)