diff --git a/agent/envoyextensions/builtin/property-override/property_override.go b/agent/envoyextensions/builtin/property-override/property_override.go index 51d7836852..d42e3d2d50 100644 --- a/agent/envoyextensions/builtin/property-override/property_override.go +++ b/agent/envoyextensions/builtin/property-override/property_override.go @@ -191,6 +191,10 @@ func (f *ResourceFilter) validate() error { return err } + if len(f.Services) > 0 && f.TrafficDirection != extensioncommon.TrafficDirectionOutbound { + return fmt.Errorf("patch contains non-empty ResourceFilter.Services but ResourceFilter.TrafficDirection is not %q", + extensioncommon.TrafficDirectionOutbound) + } for i := range f.Services { sn := f.Services[i] sn.normalize() diff --git a/agent/envoyextensions/builtin/property-override/property_override_test.go b/agent/envoyextensions/builtin/property-override/property_override_test.go index 21889d840f..4a80db8671 100644 --- a/agent/envoyextensions/builtin/property-override/property_override_test.go +++ b/agent/envoyextensions/builtin/property-override/property_override_test.go @@ -229,6 +229,20 @@ func TestConstructor(t *testing.T) { ok: false, errMsg: "service name is required", }, + "non-empty services with invalid traffic direction": { + arguments: makeArguments(map[string]any{"Patches": []map[string]any{ + makePatch(map[string]any{ + "ResourceFilter": makeResourceFilter(map[string]any{ + "TrafficDirection": extensioncommon.TrafficDirectionInbound, + "Services": []map[string]any{ + {"Name:": "foo"}, + }, + }), + }), + }}), + ok: false, + errMsg: "patch contains non-empty ResourceFilter.Services but ResourceFilter.TrafficDirection is not \"outbound\"", + }, // See decode.HookWeakDecodeFromSlice for more details. In practice, we can end up // with a "Patches" field decoded to the single "Patch" value contained in the // serialized slice (raised from the containing slice). Using WeakDecode solves