44package gateway_api
55
66import (
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
7672func 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