@@ -2,6 +2,7 @@ package gatewayapi
22
33import (
44 "context"
5+ "strings"
56 "testing"
67 "time"
78
@@ -16,6 +17,7 @@ import (
1617 "k8s.io/apimachinery/pkg/runtime"
1718 "k8s.io/apimachinery/pkg/types"
1819
20+ "sigs.k8s.io/controller-runtime/pkg/cache/informertest"
1921 "sigs.k8s.io/controller-runtime/pkg/client"
2022 "sigs.k8s.io/controller-runtime/pkg/client/fake"
2123 "sigs.k8s.io/controller-runtime/pkg/controller"
@@ -30,28 +32,41 @@ func Test_Reconcile(t *testing.T) {
3032 ObjectMeta : metav1.ObjectMeta {Name : name },
3133 }
3234 }
35+ co := func (name string ) * configv1.ClusterOperator {
36+ return & configv1.ClusterOperator {
37+ ObjectMeta : metav1.ObjectMeta {Name : name },
38+ }
39+ }
3340 tests := []struct {
3441 name string
3542 gatewayAPIEnabled bool
3643 gatewayAPIControllerEnabled bool
3744 existingObjects []runtime.Object
45+ existingStatusSubresource []client.Object
3846 expectCreate []client.Object
3947 expectUpdate []client.Object
4048 expectDelete []client.Object
49+ expectStatusUpdate []client.Object
4150 expectStartCtrl bool
4251 }{
4352 {
4453 name : "gateway API disabled" ,
4554 gatewayAPIEnabled : false ,
46- expectCreate : []client.Object {},
47- expectUpdate : []client.Object {},
48- expectDelete : []client.Object {},
49- expectStartCtrl : false ,
55+ existingObjects : []runtime.Object {
56+ co ("ingress" ),
57+ },
58+ expectCreate : []client.Object {},
59+ expectUpdate : []client.Object {},
60+ expectDelete : []client.Object {},
61+ expectStartCtrl : false ,
5062 },
5163 {
5264 name : "gateway API enabled" ,
5365 gatewayAPIEnabled : true ,
5466 gatewayAPIControllerEnabled : true ,
67+ existingObjects : []runtime.Object {
68+ co ("ingress" ),
69+ },
5570 expectCreate : []client.Object {
5671 crd ("gatewayclasses.gateway.networking.k8s.io" ),
5772 crd ("gateways.gateway.networking.k8s.io" ),
@@ -67,6 +82,9 @@ func Test_Reconcile(t *testing.T) {
6782 name : "gateway API enabled, gateway API controller disabled" ,
6883 gatewayAPIEnabled : true ,
6984 gatewayAPIControllerEnabled : false ,
85+ existingObjects : []runtime.Object {
86+ co ("ingress" ),
87+ },
7088 expectCreate : []client.Object {
7189 crd ("gatewayclasses.gateway.networking.k8s.io" ),
7290 crd ("gateways.gateway.networking.k8s.io" ),
@@ -78,6 +96,55 @@ func Test_Reconcile(t *testing.T) {
7896 expectDelete : []client.Object {},
7997 expectStartCtrl : false ,
8098 },
99+ {
100+ name : "unmanaged gateway API CRDs" ,
101+ gatewayAPIEnabled : true ,
102+ gatewayAPIControllerEnabled : true ,
103+ existingObjects : []runtime.Object {
104+ co ("ingress" ),
105+ crd ("listenersets.gateway.networking.x-k8s.io" ),
106+ },
107+ existingStatusSubresource : []client.Object {
108+ co ("ingress" ),
109+ },
110+ expectCreate : []client.Object {
111+ crd ("gatewayclasses.gateway.networking.k8s.io" ),
112+ crd ("gateways.gateway.networking.k8s.io" ),
113+ crd ("grpcroutes.gateway.networking.k8s.io" ),
114+ crd ("httproutes.gateway.networking.k8s.io" ),
115+ crd ("referencegrants.gateway.networking.k8s.io" ),
116+ },
117+ expectUpdate : []client.Object {},
118+ expectDelete : []client.Object {},
119+ expectStatusUpdate : []client.Object {
120+ co ("ingress" ),
121+ },
122+ expectStartCtrl : true ,
123+ },
124+ {
125+ name : "third party CRDs" ,
126+ gatewayAPIEnabled : true ,
127+ gatewayAPIControllerEnabled : true ,
128+ existingObjects : []runtime.Object {
129+ co ("ingress" ),
130+ crd ("thirdpartycrd1.openshift.io" ),
131+ crd ("thirdpartycrd2.openshift.io" ),
132+ },
133+ existingStatusSubresource : []client.Object {
134+ co ("ingress" ),
135+ },
136+ expectCreate : []client.Object {
137+ crd ("gatewayclasses.gateway.networking.k8s.io" ),
138+ crd ("gateways.gateway.networking.k8s.io" ),
139+ crd ("grpcroutes.gateway.networking.k8s.io" ),
140+ crd ("httproutes.gateway.networking.k8s.io" ),
141+ crd ("referencegrants.gateway.networking.k8s.io" ),
142+ },
143+ expectUpdate : []client.Object {},
144+ expectDelete : []client.Object {},
145+ expectStatusUpdate : []client.Object {},
146+ expectStartCtrl : true ,
147+ },
81148 }
82149
83150 scheme := runtime .NewScheme ()
@@ -89,11 +156,30 @@ func Test_Reconcile(t *testing.T) {
89156 fakeClient := fake .NewClientBuilder ().
90157 WithScheme (scheme ).
91158 WithRuntimeObjects (tc .existingObjects ... ).
159+ WithStatusSubresource (tc .existingStatusSubresource ... ).
160+ WithIndex (& apiextensionsv1.CustomResourceDefinition {}, "crdAPIGroup" , client .IndexerFunc (func (o client.Object ) []string {
161+ if strings .Contains (o .GetName (), "gateway.networking" ) {
162+ return []string {"gateway" }
163+ }
164+ return []string {}
165+ })).
92166 Build ()
93- cl := & testutil.FakeClientRecorder {fakeClient , t , []client.Object {}, []client.Object {}, []client.Object {}}
167+ cl := & testutil.FakeClientRecorder {
168+ Client : fakeClient ,
169+ T : t ,
170+ Added : []client.Object {},
171+ Updated : []client.Object {},
172+ Deleted : []client.Object {},
173+ StatusWriter : & testutil.FakeStatusWriter {
174+ StatusWriter : fakeClient .Status (),
175+ },
176+ }
94177 ctrl := & testutil.FakeController {t , false , nil }
178+ informer := informertest.FakeInformers {Scheme : scheme }
179+ cache := & testutil.FakeCache {Informers : & informer , Reader : fakeClient }
95180 reconciler := & reconciler {
96181 client : cl ,
182+ cache : cache ,
97183 config : Config {
98184 GatewayAPIEnabled : tc .gatewayAPIEnabled ,
99185 GatewayAPIControllerEnabled : tc .gatewayAPIControllerEnabled ,
@@ -122,6 +208,7 @@ func Test_Reconcile(t *testing.T) {
122208 cmpopts .IgnoreFields (metav1.ObjectMeta {}, "Annotations" , "ResourceVersion" ),
123209 cmpopts .IgnoreFields (metav1.TypeMeta {}, "Kind" , "APIVersion" ),
124210 cmpopts .IgnoreFields (apiextensionsv1.CustomResourceDefinition {}, "Spec" ),
211+ cmpopts .IgnoreFields (configv1.ClusterOperator {}, "Status" ),
125212 }
126213 if diff := cmp .Diff (tc .expectCreate , cl .Added , cmpOpts ... ); diff != "" {
127214 t .Fatalf ("found diff between expected and actual creates: %s" , diff )
@@ -132,6 +219,9 @@ func Test_Reconcile(t *testing.T) {
132219 if diff := cmp .Diff (tc .expectDelete , cl .Deleted , cmpOpts ... ); diff != "" {
133220 t .Fatalf ("found diff between expected and actual deletes: %s" , diff )
134221 }
222+ if diff := cmp .Diff (tc .expectStatusUpdate , cl .StatusWriter .Updated , cmpOpts ... ); diff != "" {
223+ t .Fatalf ("found diff between expected and actual status updates: %s" , diff )
224+ }
135225 })
136226 }
137227}
@@ -140,11 +230,29 @@ func TestReconcileOnlyStartsControllerOnce(t *testing.T) {
140230 scheme := runtime .NewScheme ()
141231 configv1 .Install (scheme )
142232 apiextensionsv1 .AddToScheme (scheme )
143- fakeClient := fake .NewClientBuilder ().WithScheme (scheme ).WithRuntimeObjects ().Build ()
144- cl := & testutil.FakeClientRecorder {fakeClient , t , []client.Object {}, []client.Object {}, []client.Object {}}
233+ fakeClient := fake .NewClientBuilder ().
234+ WithScheme (scheme ).
235+ WithRuntimeObjects (
236+ & configv1.ClusterOperator {
237+ ObjectMeta : metav1.ObjectMeta {Name : "ingress" },
238+ }).
239+ WithIndex (& apiextensionsv1.CustomResourceDefinition {}, "crdAPIGroup" , client .IndexerFunc (func (o client.Object ) []string {
240+ return []string {"gateway" } // all crds are gateway api ones
241+ })).
242+ Build ()
243+ cl := & testutil.FakeClientRecorder {
244+ Client : fakeClient ,
245+ T : t ,
246+ Added : []client.Object {},
247+ Updated : []client.Object {},
248+ Deleted : []client.Object {},
249+ }
145250 ctrl := & testutil.FakeController {t , false , make (chan struct {})}
251+ informer := informertest.FakeInformers {Scheme : scheme }
252+ cache := & testutil.FakeCache {Informers : & informer , Reader : fakeClient }
146253 reconciler := & reconciler {
147254 client : cl ,
255+ cache : cache ,
148256 config : Config {
149257 GatewayAPIEnabled : true ,
150258 GatewayAPIControllerEnabled : true ,
0 commit comments