Skip to content

Commit 4a357c8

Browse files
asauberyoungnick
authored andcommitted
gateway-api: update fake client to always restore TypeMeta
Use an interceptor function to restore type meta for objects populated using the fake client. Do not populate type meta for CECs. Remove all points in the Gateway API and GAMMA tests which manually restore the TypeMeta information for the fake client objects. Signed-off-by: Andrew Sauber <[email protected]>
1 parent 5ccdd87 commit 4a357c8

2 files changed

Lines changed: 50 additions & 71 deletions

File tree

operator/pkg/gateway-api/gamma_reconcile_test.go

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,6 @@ var (
3737
serviceKeyEcho = types.NamespacedName{Namespace: "gateway-conformance-mesh", Name: "echo"}
3838
serviceKeyEchoV1 = types.NamespacedName{Namespace: "gateway-conformance-mesh", Name: "echo-v1"}
3939
serviceKeyEchoV2 = types.NamespacedName{Namespace: "gateway-conformance-mesh", Name: "echo-v2"}
40-
serviceTypeMeta = metav1.TypeMeta{
41-
Kind: "Service",
42-
APIVersion: corev1.SchemeGroupVersion.Version,
43-
}
4440
)
4541

4642
func Test_gammaReconciler_Reconcile(t *testing.T) {
@@ -95,15 +91,17 @@ func Test_gammaReconciler_Reconcile(t *testing.T) {
9591
t.Run(serviceKey.String(), func(t *testing.T) {
9692
base := readInputDir(t, "testdata/gamma/base")
9793
input := readInputDir(t, fmt.Sprintf("testdata/gamma/%s/input", tt.name))
94+
scheme := helpers.TestScheme(helpers.AllOptionalKinds)
9895

9996
c := fake.NewClientBuilder().
100-
WithScheme(helpers.TestScheme(helpers.AllOptionalKinds)).
97+
WithScheme(scheme).
10198
WithObjects(append(base, input...)...).
10299
WithIndex(&gatewayv1.HTTPRoute{}, indexers.GammaHTTPRouteParentRefsIndex, indexers.IndexHTTPRouteByGammaService).
103100
WithIndex(&gatewayv1.GRPCRoute{}, indexers.GammaGRPCRouteParentRefsIndex, indexers.IndexGRPCRouteByGammaService).
104101
WithStatusSubresource(&corev1.Service{}).
105102
WithStatusSubresource(&gatewayv1.HTTPRoute{}).
106103
WithStatusSubresource(&gatewayv1.GRPCRoute{}).
104+
WithInterceptorFuncs(typeMetaInterceptor(scheme)).
107105
Build()
108106

109107
r := &gammaReconciler{
@@ -135,13 +133,11 @@ func Test_gammaReconciler_Reconcile(t *testing.T) {
135133
readOutput(t, fmt.Sprintf("testdata/gamma/%s/output/service-%s.yaml", tt.name, serviceKey.Name), expectedService)
136134
actualService := &corev1.Service{}
137135
err = c.Get(t.Context(), serviceKey, actualService)
138-
actualService.TypeMeta = serviceTypeMeta
139136
require.NoError(t, err)
140137

141138
for _, hr := range filterHTTPRouteList {
142139
actualHR := &gatewayv1.HTTPRoute{}
143140
err = c.Get(t.Context(), client.ObjectKeyFromObject(&hr), actualHR)
144-
actualHR.TypeMeta = httpRouteTypeMeta
145141
require.NoError(t, err, "error getting HTTPRoute %s/%s: %v", hr.Namespace, hr.Name, err)
146142
expectedHR := &gatewayv1.HTTPRoute{}
147143
readOutput(t, fmt.Sprintf("testdata/gamma/%s/output/httproute-%s.yaml", tt.name, hr.Name), expectedHR)
@@ -151,7 +147,6 @@ func Test_gammaReconciler_Reconcile(t *testing.T) {
151147
for _, grpcr := range filterGRPCRouteList {
152148
actualGRPCR := &gatewayv1.GRPCRoute{}
153149
err = c.Get(t.Context(), client.ObjectKeyFromObject(&grpcr), actualGRPCR)
154-
actualGRPCR.TypeMeta = grpcRouteTypeMeta
155150
require.NoError(t, err, "error getting GRPCRoute %s/%s: %v", grpcr.Namespace, grpcr.Name, err)
156151
expectedGRPCR := &gatewayv1.GRPCRoute{}
157152
readOutput(t, fmt.Sprintf("testdata/gamma/%s/output/grpcroute-%s.yaml", tt.name, grpcr.Name), expectedGRPCR)

operator/pkg/gateway-api/gateway_reconcile_test.go

Lines changed: 47 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package gateway_api
55

66
import (
7+
"context"
78
"fmt"
89
"log/slog"
910
"testing"
@@ -15,13 +16,16 @@ import (
1516
"google.golang.org/protobuf/testing/protocmp"
1617
corev1 "k8s.io/api/core/v1"
1718
discoveryv1 "k8s.io/api/discovery/v1"
19+
"k8s.io/apimachinery/pkg/api/meta"
1820
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
21+
"k8s.io/apimachinery/pkg/runtime"
1922
"k8s.io/apimachinery/pkg/runtime/schema"
2023
"k8s.io/apimachinery/pkg/types"
2124
"k8s.io/utils/ptr"
2225
ctrl "sigs.k8s.io/controller-runtime"
2326
"sigs.k8s.io/controller-runtime/pkg/client"
2427
"sigs.k8s.io/controller-runtime/pkg/client/fake"
28+
"sigs.k8s.io/controller-runtime/pkg/client/interceptor"
2529
gatewayv1 "sigs.k8s.io/gateway-api/apis/v1"
2630

2731
"github.com/cilium/cilium/operator/pkg/gateway-api/helpers"
@@ -33,45 +37,37 @@ import (
3337
"github.com/cilium/cilium/pkg/shortener"
3438
)
3539

36-
var (
37-
gatewayv1APIVersion = gatewayv1.GroupVersion.Group + "/" + gatewayv1.GroupVersion.Version
38-
gatewayTypeMeta = metav1.TypeMeta{
39-
Kind: "Gateway",
40-
APIVersion: gatewayv1APIVersion,
41-
}
42-
httpRouteTypeMeta = metav1.TypeMeta{
43-
Kind: "HTTPRoute",
44-
APIVersion: gatewayv1APIVersion,
45-
}
46-
grpcRouteTypeMeta = metav1.TypeMeta{
47-
Kind: "GRPCRoute",
48-
APIVersion: gatewayv1APIVersion,
49-
}
50-
tlsRouteTypeMeta = metav1.TypeMeta{
51-
Kind: "TLSRoute",
52-
APIVersion: gatewayv1APIVersion,
53-
}
54-
backendTLSPolicyTypeMeta = metav1.TypeMeta{
55-
Kind: "BackendTLSPolicy",
56-
APIVersion: gatewayv1APIVersion,
57-
}
58-
tcpRouteTypeMeta = metav1.TypeMeta{
59-
Kind: "TCPRoute",
60-
APIVersion: gatewayv1APIVersion,
61-
}
62-
udpRouteTypeMeta = metav1.TypeMeta{
63-
Kind: "UDPRoute",
64-
APIVersion: gatewayv1APIVersion,
65-
}
66-
listenerSetTypeMeta = metav1.TypeMeta{
67-
Kind: "ListenerSet",
68-
APIVersion: gatewayv1APIVersion,
40+
func typeMetaInterceptor(scheme *runtime.Scheme) interceptor.Funcs {
41+
setTypeMeta := func(obj runtime.Object) error {
42+
if _, isCEC := obj.(*ciliumv2.CiliumEnvoyConfig); isCEC {
43+
return nil
44+
}
45+
gvks, _, err := scheme.ObjectKinds(obj)
46+
if err != nil {
47+
return err
48+
}
49+
obj.GetObjectKind().SetGroupVersionKind(gvks[0])
50+
return nil
6951
}
70-
endpointSliceTypeMeta = metav1.TypeMeta{
71-
Kind: "EndpointSlice",
72-
APIVersion: discoveryv1.SchemeGroupVersion.String(),
52+
53+
return interceptor.Funcs{
54+
Get: func(ctx context.Context, c client.WithWatch, key client.ObjectKey, obj client.Object, opts ...client.GetOption) error {
55+
if err := c.Get(ctx, key, obj, opts...); err != nil {
56+
return err
57+
}
58+
return setTypeMeta(obj)
59+
},
60+
List: func(ctx context.Context, c client.WithWatch, list client.ObjectList, opts ...client.ListOption) error {
61+
if err := c.List(ctx, list, opts...); err != nil {
62+
return err
63+
}
64+
if err := setTypeMeta(list); err != nil {
65+
return err
66+
}
67+
return meta.EachListItem(list, setTypeMeta)
68+
},
7369
}
74-
)
70+
}
7571

7672
func Test_Conformance(t *testing.T) {
7773
logger := hivetest.Logger(t, hivetest.LogLevel(slog.LevelDebug))
@@ -387,18 +383,6 @@ func Test_Conformance(t *testing.T) {
387383
t.Run(tt.name, func(t *testing.T) {
388384
base := readInputDir(t, "testdata/gateway/base")
389385
input := readInputDir(t, fmt.Sprintf("testdata/gateway/%s/input", tt.name))
390-
clientBuilder := fake.NewClientBuilder().
391-
WithObjects(append(base, input...)...).
392-
WithStatusSubresource(&corev1.Service{}).
393-
WithStatusSubresource(&corev1.Namespace{}).
394-
WithStatusSubresource(&gatewayv1.GRPCRoute{}).
395-
WithStatusSubresource(&gatewayv1.HTTPRoute{}).
396-
WithStatusSubresource(&gatewayv1.TLSRoute{}).
397-
WithStatusSubresource(&gatewayv1.Gateway{}).
398-
WithStatusSubresource(&gatewayv1.GatewayClass{}).
399-
WithStatusSubresource(&gatewayv1.BackendTLSPolicy{}).
400-
WithStatusSubresource(&gatewayv1.ListenerSet{})
401-
402386
disabledKinds := map[string]bool{
403387
helpers.ServiceImportKind: tt.disableServiceImport,
404388
helpers.TCPRouteKind: tt.disableTCPRoute,
@@ -411,7 +395,20 @@ func Test_Conformance(t *testing.T) {
411395
}
412396
optionalKinds = append(optionalKinds, k)
413397
}
414-
clientBuilder.WithScheme(helpers.TestScheme(optionalKinds))
398+
scheme := helpers.TestScheme(optionalKinds)
399+
clientBuilder := fake.NewClientBuilder().
400+
WithScheme(scheme).
401+
WithObjects(append(base, input...)...).
402+
WithStatusSubresource(&corev1.Service{}).
403+
WithStatusSubresource(&corev1.Namespace{}).
404+
WithStatusSubresource(&gatewayv1.GRPCRoute{}).
405+
WithStatusSubresource(&gatewayv1.HTTPRoute{}).
406+
WithStatusSubresource(&gatewayv1.TLSRoute{}).
407+
WithStatusSubresource(&gatewayv1.Gateway{}).
408+
WithStatusSubresource(&gatewayv1.GatewayClass{}).
409+
WithStatusSubresource(&gatewayv1.BackendTLSPolicy{}).
410+
WithStatusSubresource(&gatewayv1.ListenerSet{}).
411+
WithInterceptorFuncs(typeMetaInterceptor(scheme))
415412

416413
// Add any required indexes here
417414
clientBuilder.WithIndex(&gatewayv1.HTTPRoute{}, indexers.GatewayHTTPRouteIndex, indexers.IndexHTTPRouteByGateway)
@@ -498,9 +495,6 @@ func Test_Conformance(t *testing.T) {
498495
// Checking the output for Gateway
499496
actualGateway := &gatewayv1.Gateway{}
500497
err = c.Get(t.Context(), gwDetail.FullName, actualGateway)
501-
// TODO(youngnick): controller-runtime has broken something with the fake client
502-
// Bypass for now
503-
actualGateway.TypeMeta = gatewayTypeMeta
504498
require.NoError(t, err)
505499
expectedGateway := &gatewayv1.Gateway{}
506500
readOutput(t, fmt.Sprintf("testdata/gateway/%s/output/%s.yaml", tt.name, gwDetail.FullName.Name), expectedGateway)
@@ -530,7 +524,6 @@ func Test_Conformance(t *testing.T) {
530524
for _, eps := range epsList.Items {
531525
actualEPS := &discoveryv1.EndpointSlice{}
532526
err = c.Get(t.Context(), client.ObjectKeyFromObject(&eps), actualEPS)
533-
actualEPS.TypeMeta = endpointSliceTypeMeta
534527
require.NoError(t, err, "error getting EndpointSlice %s/%s: %v", eps.Namespace, eps.Name, err)
535528
expectedEPS := &discoveryv1.EndpointSlice{}
536529
readOutput(t, fmt.Sprintf("testdata/gateway/%s/output/endpointslice-%s.yaml", tt.name, eps.Name), expectedEPS)
@@ -541,9 +534,6 @@ func Test_Conformance(t *testing.T) {
541534
for _, hr := range hrList.Items {
542535
actualHR := &gatewayv1.HTTPRoute{}
543536
err = c.Get(t.Context(), client.ObjectKeyFromObject(&hr), actualHR)
544-
// TODO(youngnick): controller-runtime has broken something with the fake client
545-
// Bypass for now
546-
actualHR.TypeMeta = httpRouteTypeMeta
547537
require.NoError(t, err, "error getting HTTPRoute %s/%s: %v", hr.Namespace, hr.Name, err)
548538
expectedHR := &gatewayv1.HTTPRoute{}
549539
readOutput(t, fmt.Sprintf("testdata/gateway/%s/output/httproute-%s.yaml", tt.name, hr.Name), expectedHR)
@@ -553,7 +543,6 @@ func Test_Conformance(t *testing.T) {
553543
for _, tlsr := range tlsrList.Items {
554544
actualTLSR := &gatewayv1.TLSRoute{}
555545
err = c.Get(t.Context(), client.ObjectKeyFromObject(&tlsr), actualTLSR)
556-
actualTLSR.TypeMeta = tlsRouteTypeMeta
557546
require.NoError(t, err, "error getting TLSRoute %s/%s: %v", tlsr.Namespace, tlsr.Name, err)
558547
expectedTLSR := &gatewayv1.TLSRoute{}
559548
readOutput(t, fmt.Sprintf("testdata/gateway/%s/output/tlsroute-%s.yaml", tt.name, tlsr.Name), expectedTLSR)
@@ -563,7 +552,6 @@ func Test_Conformance(t *testing.T) {
563552
for _, grpcr := range grpcrList.Items {
564553
actualGRPCR := &gatewayv1.GRPCRoute{}
565554
err = c.Get(t.Context(), client.ObjectKeyFromObject(&grpcr), actualGRPCR)
566-
actualGRPCR.TypeMeta = grpcRouteTypeMeta
567555
require.NoError(t, err, "error getting GRPCRoute %s/%s: %v", grpcr.Namespace, grpcr.Name, err)
568556
expectedGRPCR := &gatewayv1.GRPCRoute{}
569557
readOutput(t, fmt.Sprintf("testdata/gateway/%s/output/grpcroute-%s.yaml", tt.name, grpcr.Name), expectedGRPCR)
@@ -573,7 +561,6 @@ func Test_Conformance(t *testing.T) {
573561
for _, btlsp := range btlspList.Items {
574562
actualBTLSP := &gatewayv1.BackendTLSPolicy{}
575563
err = c.Get(t.Context(), client.ObjectKeyFromObject(&btlsp), actualBTLSP)
576-
actualBTLSP.TypeMeta = backendTLSPolicyTypeMeta
577564
require.NoError(t, err, "error getting BackendTLSPolicy %s/%s: %v", btlsp.Namespace, btlsp.Name, err)
578565
expectedBTLSP := &gatewayv1.BackendTLSPolicy{}
579566
readOutput(t, fmt.Sprintf("testdata/gateway/%s/output/backendtlspolicy-%s.yaml", tt.name, btlsp.Name), expectedBTLSP)
@@ -583,7 +570,6 @@ func Test_Conformance(t *testing.T) {
583570
for _, tcpr := range tcprList.Items {
584571
actualTCPR := &gatewayv1.TCPRoute{}
585572
err = c.Get(t.Context(), client.ObjectKeyFromObject(&tcpr), actualTCPR)
586-
actualTCPR.TypeMeta = tcpRouteTypeMeta
587573
require.NoError(t, err, "error getting TCPRoute %s/%s: %v", tcpr.Namespace, tcpr.Name, err)
588574
expectedTCPR := &gatewayv1.TCPRoute{}
589575
readOutput(t, fmt.Sprintf("testdata/gateway/%s/output/tcproute-%s.yaml", tt.name, tcpr.Name), expectedTCPR)
@@ -593,7 +579,6 @@ func Test_Conformance(t *testing.T) {
593579
for _, udpr := range udprList.Items {
594580
actualUDPR := &gatewayv1.UDPRoute{}
595581
err = c.Get(t.Context(), client.ObjectKeyFromObject(&udpr), actualUDPR)
596-
actualUDPR.TypeMeta = udpRouteTypeMeta
597582
require.NoError(t, err, "error getting UDPRoute %s/%s: %v", udpr.Namespace, udpr.Name, err)
598583
expectedUDPR := &gatewayv1.UDPRoute{}
599584
readOutput(t, fmt.Sprintf("testdata/gateway/%s/output/udproute-%s.yaml", tt.name, udpr.Name), expectedUDPR)
@@ -606,7 +591,6 @@ func Test_Conformance(t *testing.T) {
606591
for _, ls := range lsList.Items {
607592
actualLS := &gatewayv1.ListenerSet{}
608593
err = c.Get(t.Context(), client.ObjectKeyFromObject(&ls), actualLS)
609-
actualLS.TypeMeta = listenerSetTypeMeta
610594
require.NoError(t, err, "error getting ListenerSet %s/%s: %v", ls.Namespace, ls.Name, err)
611595
expectedLS := &gatewayv1.ListenerSet{}
612596
readOutput(t, fmt.Sprintf("testdata/gateway/%s/output/listenerset-%s.yaml", tt.name, ls.Name), expectedLS)

0 commit comments

Comments
 (0)