Skip to content

Commit

Permalink
add matchExpressions support to helpers
Browse files Browse the repository at this point in the history
  • Loading branch information
dprotaso committed Feb 4, 2025
1 parent 00aa76c commit e7fddef
Show file tree
Hide file tree
Showing 2 changed files with 114 additions and 1 deletion.
14 changes: 13 additions & 1 deletion internal/gatewayapi/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -533,10 +533,22 @@ type targetRefWithTimestamp struct {
CreationTimestamp metav1.Time
}

func selectorFromTargetSelector(selector egv1a1.TargetSelector) labels.Selector {
l, err := metav1.LabelSelectorAsSelector(&metav1.LabelSelector{
MatchLabels: selector.MatchLabels,
MatchExpressions: selector.MatchExpressions,
})
if err != nil {
// TODO - how do we we bubble this up
return labels.Nothing()
}
return l
}

func getPolicyTargetRefs[T client.Object](policy egv1a1.PolicyTargetReferences, potentialTargets []T) []gwapiv1a2.LocalPolicyTargetReferenceWithSectionName {
dedup := sets.New[targetRefWithTimestamp]()
for _, currSelector := range policy.TargetSelectors {
labelSelector := labels.SelectorFromSet(currSelector.MatchLabels)
labelSelector := selectorFromTargetSelector(currSelector)
for _, obj := range potentialTargets {
gvk := obj.GetObjectKind().GroupVersionKind()
if gvk.Kind != string(currSelector.Kind) ||
Expand Down
101 changes: 101 additions & 0 deletions internal/gatewayapi/helpers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import (

"github.com/stretchr/testify/require"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/types"
Expand Down Expand Up @@ -475,6 +476,106 @@ func TestGetPolicyTargetRefs(t *testing.T) {
},
results: []gwapiv1a2.LocalPolicyTargetReferenceWithSectionName{},
},
{
name: "match expression",
policy: egv1a1.PolicyTargetReferences{
TargetSelectors: []egv1a1.TargetSelector{
{
Kind: "Gateway",
MatchExpressions: []metav1.LabelSelectorRequirement{
{
Key: "environment",
Operator: "In",
Values: []string{"prod", "staging"},
},
},
},
},
},
targets: []*unstructured.Unstructured{
{
Object: map[string]any{
"apiVersion": "gateway.networking.k8s.io/v1",
"kind": "Gateway",
"metadata": map[string]any{
"name": "first",
"namespace": "default",
"labels": map[string]any{
"environment": "prod",
},
},
},
},
{
Object: map[string]any{
"apiVersion": "gateway.networking.k8s.io/v1",
"kind": "Gateway",
"metadata": map[string]any{
"name": "second",
"namespace": "default",
"labels": map[string]any{
"environment": "dev",
},
},
},
},
},
results: []gwapiv1a2.LocalPolicyTargetReferenceWithSectionName{
{
LocalPolicyTargetReference: gwapiv1a2.LocalPolicyTargetReference{
Group: "gateway.networking.k8s.io",
Kind: "Gateway",
Name: "first",
},
},
},
},
{
name: "match expression - bad expression matches nothing",
policy: egv1a1.PolicyTargetReferences{
TargetSelectors: []egv1a1.TargetSelector{
{
Kind: "Gateway",
MatchExpressions: []metav1.LabelSelectorRequirement{
{
Key: "environment",
Operator: "Foo",
Values: []string{"prod", "staging"},
},
},
},
},
},
targets: []*unstructured.Unstructured{
{
Object: map[string]any{
"apiVersion": "gateway.networking.k8s.io/v1",
"kind": "Gateway",
"metadata": map[string]any{
"name": "first",
"namespace": "default",
"labels": map[string]any{
"environment": "prod",
},
},
},
},
{
Object: map[string]any{
"apiVersion": "gateway.networking.k8s.io/v1",
"kind": "Gateway",
"metadata": map[string]any{
"name": "second",
"namespace": "default",
"labels": map[string]any{
"environment": "dev",
},
},
},
},
},
results: []gwapiv1a2.LocalPolicyTargetReferenceWithSectionName{},
},
}

for _, tc := range testCases {
Expand Down

0 comments on commit e7fddef

Please sign in to comment.