Skip to content

Commit a03b857

Browse files
authored
fix: add configMap indexers for EEP reconciler (envoyproxy#6369)
Signed-off-by: Rudrakh Panigrahi <[email protected]>
1 parent e469248 commit a03b857

File tree

7 files changed

+167
-0
lines changed

7 files changed

+167
-0
lines changed

internal/provider/kubernetes/controller.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2213,6 +2213,7 @@ func (r *gatewayAPIReconciler) processEnvoyExtensionPolicies(
22132213
// It will be recomputed by the gateway-api layer
22142214
envoyExtensionPolicy.Status = gwapiv1a2.PolicyStatus{}
22152215
if !resourceMap.allAssociatedEnvoyExtensionPolicies.Has(utils.NamespacedName(&envoyExtensionPolicy).String()) {
2216+
r.log.Info("processing EnvoyExtensionPolicy", "namespace", policy.Namespace, "name", policy.Name)
22162217
resourceMap.allAssociatedEnvoyExtensionPolicies.Insert(utils.NamespacedName(&envoyExtensionPolicy).String())
22172218
resourceTree.EnvoyExtensionPolicies = append(resourceTree.EnvoyExtensionPolicies, &envoyExtensionPolicy)
22182219
}

internal/provider/kubernetes/controller_offline.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ func newOfflineGatewayAPIClient() client.Client {
139139
WithIndex(&egv1a1.SecurityPolicy{}, configMapSecurityPolicyIndex, configMapSecurityPolicyIndexFunc).
140140
WithIndex(&egv1a1.EnvoyExtensionPolicy{}, backendEnvoyExtensionPolicyIndex, backendEnvoyExtensionPolicyIndexFunc).
141141
WithIndex(&egv1a1.EnvoyExtensionPolicy{}, secretEnvoyExtensionPolicyIndex, secretEnvoyExtensionPolicyIndexFunc).
142+
WithIndex(&egv1a1.EnvoyExtensionPolicy{}, configMapEepIndex, configMapEepIndexFunc).
142143
WithIndex(&gwapiv1a3.BackendTLSPolicy{}, configMapBtlsIndex, configMapBtlsIndexFunc).
143144
WithIndex(&gwapiv1a3.BackendTLSPolicy{}, secretBtlsIndex, secretBtlsIndexFunc).
144145
WithIndex(&egv1a1.HTTPRouteFilter{}, configMapHTTPRouteFilterIndex, configMapRouteFilterIndexFunc).

internal/provider/kubernetes/indexers.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ const (
5252
secretEnvoyExtensionPolicyIndex = "secretEnvoyExtensionPolicyIndex"
5353
httpRouteFilterHTTPRouteIndex = "httpRouteFilterHTTPRouteIndex"
5454
configMapBtpIndex = "configMapBtpIndex"
55+
configMapEepIndex = "configMapEepIndex"
5556
configMapHTTPRouteFilterIndex = "configMapHTTPRouteFilterIndex"
5657
secretHTTPRouteFilterIndex = "secretHTTPRouteFilterIndex"
5758
)
@@ -809,6 +810,28 @@ func configMapBtpIndexFunc(rawObj client.Object) []string {
809810
return configMapReferences
810811
}
811812

813+
func configMapEepIndexFunc(rawObj client.Object) []string {
814+
eep := rawObj.(*egv1a1.EnvoyExtensionPolicy)
815+
var configMapReferences []string
816+
if eep.Spec.Lua == nil {
817+
return configMapReferences
818+
}
819+
820+
for _, p := range eep.Spec.Lua {
821+
if p.ValueRef != nil {
822+
if string(p.ValueRef.Kind) == resource.KindConfigMap {
823+
configMapReferences = append(configMapReferences,
824+
types.NamespacedName{
825+
Namespace: eep.Namespace,
826+
Name: string(p.ValueRef.Name),
827+
}.String(),
828+
)
829+
}
830+
}
831+
}
832+
return configMapReferences
833+
}
834+
812835
// addRouteFilterIndexers adds indexing on HTTPRouteFilter, for ConfigMap objects that are
813836
// referenced in HTTPRouteFilter objects. This helps in querying for HTTPRouteFilters that are
814837
// affected by a particular ConfigMap CRUD.
@@ -928,6 +951,12 @@ func addEnvoyExtensionPolicyIndexers(ctx context.Context, mgr manager.Manager) e
928951
return err
929952
}
930953

954+
if err = mgr.GetFieldIndexer().IndexField(
955+
ctx, &egv1a1.EnvoyExtensionPolicy{}, configMapEepIndex,
956+
configMapEepIndexFunc); err != nil {
957+
return err
958+
}
959+
931960
return nil
932961
}
933962

internal/provider/kubernetes/predicates.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -779,6 +779,20 @@ func (r *gatewayAPIReconciler) validateConfigMapForReconcile(obj client.Object)
779779
}
780780
}
781781

782+
if r.eepCRDExists {
783+
eepList := &egv1a1.EnvoyExtensionPolicyList{}
784+
if err := r.client.List(context.Background(), eepList, &client.ListOptions{
785+
FieldSelector: fields.OneTermEqualSelector(configMapEepIndex, utils.NamespacedName(configMap).String()),
786+
}); err != nil {
787+
r.log.Error(err, "unable to find associated EnvoyExtensionPolicy")
788+
return false
789+
}
790+
791+
if len(eepList.Items) > 0 {
792+
return true
793+
}
794+
}
795+
782796
if r.hrfCRDExists {
783797
routeFilterList := &egv1a1.HTTPRouteFilterList{}
784798
if err := r.client.List(context.Background(), routeFilterList, &client.ListOptions{

internal/provider/kubernetes/predicates_test.go

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,115 @@ func TestValidateGatewayForReconcile(t *testing.T) {
175175
}
176176
}
177177

178+
// TestValidateConfigMapForReconcile tests the validateConfigMapForReconcile
179+
// predicate function.
180+
func TestValidateConfigMapForReconcile(t *testing.T) {
181+
testCases := []struct {
182+
name string
183+
configs []client.Object
184+
configMap client.Object
185+
expect bool
186+
}{
187+
{
188+
name: "references EnvoyExtensionPolicy Lua config map",
189+
configs: []client.Object{
190+
test.GetGatewayClass("test-gc", egv1a1.GatewayControllerName, nil),
191+
test.GetGateway(types.NamespacedName{Name: "scheduled-status-test"}, "test-gc", 8080),
192+
&egv1a1.EnvoyExtensionPolicy{
193+
ObjectMeta: metav1.ObjectMeta{
194+
Name: "lua-cm",
195+
Namespace: "test",
196+
},
197+
Spec: egv1a1.EnvoyExtensionPolicySpec{
198+
PolicyTargetReferences: egv1a1.PolicyTargetReferences{
199+
TargetRefs: []gwapiv1a2.LocalPolicyTargetReferenceWithSectionName{
200+
{
201+
LocalPolicyTargetReference: gwapiv1a2.LocalPolicyTargetReference{
202+
Kind: "Gateway",
203+
Name: "scheduled-status-test",
204+
},
205+
},
206+
},
207+
},
208+
Lua: []egv1a1.Lua{
209+
{
210+
Type: egv1a1.LuaValueTypeValueRef,
211+
ValueRef: &gwapiv1.LocalObjectReference{
212+
Kind: gwapiv1a2.Kind("ConfigMap"),
213+
Name: gwapiv1a2.ObjectName("lua"),
214+
Group: gwapiv1a2.Group("v1"),
215+
},
216+
},
217+
},
218+
},
219+
},
220+
},
221+
configMap: test.GetConfigMap(types.NamespacedName{Name: "lua", Namespace: "test"}, make(map[string]string), make(map[string]string)),
222+
expect: true,
223+
},
224+
{
225+
name: "does not reference EnvoyExtensionPolicy Lua config map",
226+
configs: []client.Object{
227+
test.GetGatewayClass("test-gc", egv1a1.GatewayControllerName, nil),
228+
test.GetGateway(types.NamespacedName{Name: "scheduled-status-test"}, "test-gc", 8080),
229+
&egv1a1.EnvoyExtensionPolicy{
230+
ObjectMeta: metav1.ObjectMeta{
231+
Name: "lua-cm",
232+
Namespace: "test",
233+
},
234+
Spec: egv1a1.EnvoyExtensionPolicySpec{
235+
PolicyTargetReferences: egv1a1.PolicyTargetReferences{
236+
TargetRefs: []gwapiv1a2.LocalPolicyTargetReferenceWithSectionName{
237+
{
238+
LocalPolicyTargetReference: gwapiv1a2.LocalPolicyTargetReference{
239+
Kind: "Gateway",
240+
Name: "scheduled-status-test",
241+
},
242+
},
243+
},
244+
},
245+
Lua: []egv1a1.Lua{
246+
{
247+
Type: egv1a1.LuaValueTypeValueRef,
248+
ValueRef: &gwapiv1.LocalObjectReference{
249+
Kind: gwapiv1a2.Kind("ConfigMap"),
250+
Name: gwapiv1a2.ObjectName("lua"),
251+
Group: gwapiv1a2.Group("v1"),
252+
},
253+
},
254+
},
255+
},
256+
},
257+
},
258+
configMap: test.GetConfigMap(types.NamespacedName{Name: "not-lua", Namespace: "test"}, make(map[string]string), make(map[string]string)),
259+
expect: false,
260+
},
261+
}
262+
263+
// Create the reconciler.
264+
logger := logging.DefaultLogger(os.Stdout, egv1a1.LogLevelInfo)
265+
266+
r := gatewayAPIReconciler{
267+
classController: egv1a1.GatewayControllerName,
268+
log: logger,
269+
spCRDExists: true,
270+
epCRDExists: true,
271+
eepCRDExists: true,
272+
}
273+
274+
for _, tc := range testCases {
275+
r.client = fakeclient.NewClientBuilder().
276+
WithScheme(envoygateway.GetScheme()).
277+
WithObjects(tc.configs...).
278+
WithIndex(&egv1a1.EnvoyExtensionPolicy{}, configMapEepIndex, configMapEepIndexFunc).
279+
Build()
280+
t.Run(tc.name, func(t *testing.T) {
281+
res := r.validateConfigMapForReconcile(tc.configMap)
282+
require.Equal(t, tc.expect, res)
283+
})
284+
}
285+
}
286+
178287
// TestValidateSecretForReconcile tests the validateSecretForReconcile
179288
// predicate function.
180289
func TestValidateSecretForReconcile(t *testing.T) {

internal/provider/kubernetes/test/utils.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,18 @@ func GetService(nsName types.NamespacedName, labels map[string]string, ports map
364364
return service
365365
}
366366

367+
// GetConfigMap returns a sample ConfigMap with labels and data
368+
func GetConfigMap(nsName types.NamespacedName, labels, data map[string]string) *corev1.ConfigMap {
369+
return &corev1.ConfigMap{
370+
ObjectMeta: metav1.ObjectMeta{
371+
Name: nsName.Name,
372+
Namespace: nsName.Namespace,
373+
Labels: labels,
374+
},
375+
Data: data,
376+
}
377+
}
378+
367379
// GetEndpointSlice returns a sample EndpointSlice.
368380
func GetEndpointSlice(nsName types.NamespacedName, svcName string, isServiceImport bool) *discoveryv1.EndpointSlice {
369381
var labels map[string]string

release-notes/current.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ bug fixes: |
3939
Fixed bug in certificate SANs overlap detection in listeners.
4040
Fixed issue where EnvoyExtensionPolicy ExtProc body processing mode is set to FullDuplexStreamed, but trailers were not sent.
4141
Fixed validation issue where EnvoyExtensionPolicy ExtProc failOpen is true, and body processing mode FullDuplexStreamed is not rejected.
42+
Add ConfigMap indexers for EnvoyExtensionPolicies to reconcile Lua changes
4243
4344
4445
# Enhancements that improve performance.

0 commit comments

Comments
 (0)